筆者はアセットストアでアセットをダウンロードしてきた時、中身を把握していないスクリプトをプロジェクトに置きたくないので、スクリプトはインポートしません。
そうするとMissingなプレハブやシーンができてしまい、いちいちRemoveComponentをするのがめんどくさいです。
また、Unityのバージョンアップ等で使えなくなったコンポーネントなどもMissingになってしまうので、これらを一気に削除できるようにしてみました。
<シーン中とプレハブのMissingを一括削除する>
Unity2019から?GameObjectUtility.RemoveMonoBehavioursWithMissingScriptの登場によりMissingのスクリプトを削除しやすくなりました。
しかしながら、以前の方法のGameObject.DestroyImmediateを使用しても削除できないようになりました。
そのため、↓のようになります。Unity2019以前の場合はGameObject.DestroyImmediateを使用してください。その場合は、GetComponentsで全てのコンポーネントを取得して、Nullなコンポーネントを削除すればOKです。
#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
public class MissingDelete
{
// シーン中に存在するMissingなスクリプトを削除する
[MenuItem("Project/MissingDelete/Scene", false, 3)]
public static void DeleteInScene()
{
GameObject[] all = Resources.FindObjectsOfTypeAll(typeof(GameObject)) as GameObject[];
for (int i = 0; i < all.Length; ++i)
{
GameObjectUtility.RemoveMonoBehavioursWithMissingScript(all[i]);
}
Debug.Log("シーン中のMissingなスクリプトの削除が完了しました");
}
// プレハブに含まれるMissingなスクリプトを削除する
[MenuItem("Project/MissingDelete/Prefab", false, 3)]
public static void DeleteInPrefab()
{
string[] allGUID = AssetDatabase.FindAssets("t:prefab");
for (int i = 0; i < allGUID.Length; ++i)
{
string path = AssetDatabase.GUIDToAssetPath(allGUID[i]);
GameObject g = AssetDatabase.LoadAssetAtPath<GameObject>(path);
GameObjectUtility.RemoveMonoBehavioursWithMissingScript(g);
}
AssetDatabase.Refresh();
Debug.Log("全プレハブ中のMissingなスクリプトの削除が完了しました");
}
}
#endif<使い方>
上部メニューにProject/MissngDeleteと出てくるのでシーン中ならSceneをプレハブならPrefabを選択すればOKです。
他にもメニューが出てきてますが、無視してください。
全てのオブジェクトの全てのコンポーネントを検索するので、プロジェクトが大きい場合長い時間フリーズしますが、気長に待っていただけたらと思います。こればっかりは仕方ないので。
メニューの名前が気に入らなければ適当に変えていただけたらと思います。