Unityで階層構造の深い箇所のすべてのMissing Scriptの一括削除

Unityで実験

Unityで階層構造の深い箇所のすべてのMissing Scriptの一括削除(Unity 2019.2以降)

※注意※ 実行は自己責任で。実行前に必ずプロジェクトファイルのバックアップを。まぁMissing Script狙い撃ちなので特に害はないとは思うが。Unity 2019.2以降ではないと動作しない。

 

取り急ぎ、Missing Scriptの一括削除したい場合は以下の使い方を確認。

 


今回の処理のきっかけ。

ありがちなUnityでのアクシデントだが解決方法が中途半端で困惑したので自分でどうにかしたケース。

ある日、ヒエラルキーで階層構造の深い構造のオブジェクトを作成。

オブジェクト数が100を超え、色々な個所にスクリプトをアタッチした。

その後、汎用的に使うスクリプトを複製し、大改訂を行い名前を変更。前のスクリプトを削除。

~ ザワザワ ~

コンソールにたくさんの黄色警告Missing Scriptが発生。

「・・・やっちまった!」

手でヒエラルキーから1つ1つオブジェクトを選択してMissing Scriptをリムーブ・・も数が多すぎて大変。

それなので、サクッとMissing なスクリプトを自動で削除してくれる機能があるに違いないとググるも・・・自動ではない模様。

 

な、なんと・・面倒な・・。

 

Unity 2019.2以降の新機能で「RemoveMonoBehavioursWithMissingScript」という【Unityエディタ拡張】の関数が追加されるも・・想定の斜め上の機能で戸惑う。

ようするにその関数を利用して自分でどうにかせいということか。

逆にどうにかできん奴は知らんというスタンスか。まぁ【Unityエディタ拡張】だから仕方なしか。

 

色々な先駆者のソースを見るも、複数個所のMissing Scriptの一括削除はなく、仕方ないので自分で作る(およそテスト含め30分ほど。

さすがに実行で自動全削除は事故が怖いので手動範囲選択方式に)。

無事、複数のMissing Scriptの一括削除に成功。500近い深い階層からのMissing Scriptが削除できた。

以後は簡単に削除できるようになったのは嬉しいが、Editerにあってもおかしくはない機能だなぁと思う。

 


// 使い方 「remove_in_bulk_all_missing_error_script.cs」をダウンロードするか以下公開ソースから作成する。

// 1:プロジェクト(Assets)にどこでも良いので追加(D&D)で自動認識し、Unityエディタのメニューバーに「exception_handling」が追加。

// 2:ヒエラルキーから階層構造トップの▶をALTを押したままクリックすると直下子オブジェクトが全展開。

// 3:全展開されたオブジェクトを範囲選択する(先頭クリックしSHIFTを押したまま末尾をクリック)。

// 4:Unityエディタのメニューバー「exception_handling」の中の「all_missing_error_script_removal_in_bulk」を選択。

// 5:全展開の全選択されたオブジェクトからMissingScriptを削除し、削除数をDebug.Logに表示。

// 6:ざっくりと確認。プロジェクトを保存。「remove_in_bulk_all_missing_error_script.cs」を削除する。

 

C# remove_in_bulk_all_missing_error_script.cs Unityで階層構造の深い箇所の複数のすべてのMissing Scriptの一括削除プログラム
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

// 使い方 「remove_in_bulk_all_missing_error_script.cs」をダウンロードするかソースから作成する。
// 1:プロジェクト(Assets)に追加で自動認識し、Unityエディタのメニューバーに「exception_handling」が追加。
// 2:ヒエラルキーから階層構造トップの▶をALTを押したままクリックすると直下子オブジェクトが全展開。
// 3:全展開されたオブジェクトを範囲選択する(先頭クリックしSHIFTを押したまま末尾をクリック)。
// 4:Unityエディタのメニューバー「exception_handling」の中の「all_missing_error_script_removal_in_bulk」を選択。
// 5:全展開の全選択されたオブジェクトからMissingScriptを削除し、削除数をDebug.Logに表示。
// 6:ざっくりと確認。プロジェクトを保存。「remove_in_bulk_all_missing_error_script.cs」を削除する。

public class exception_handling
{
    [MenuItem("exception_handling/all missing error script removal in bulk")]
    private static void all_missing_error_script_removal_in_bulk()
    {
        int Sgo = 0;
        int i;
        int missingCount = 0;
        Sgo = Selection.gameObjects.Length;
        Debug.Log("SelectObj = " + Sgo);

        GameObject[] target_obj;
        if(Sgo >= 1){
            target_obj = Selection.gameObjects;
            for(i=0; i<Sgo; i++){
                missingCount += GameObjectUtility.RemoveMonoBehavioursWithMissingScript(target_obj[i]);
            }
        }
        Debug.Log("missingCountObj = " + missingCount);
    }

}

remove_in_bulk_all_missing_error_script.zip