本日はUnityの小ネタ枠です。
Unityでプレハブ内のMissingScriptを自動で削除する方法です。
MissingScript
スクリプトの削除やリファクタリングの際に以下のようなMissingScriptがプレハブやシーン内に残ってしまうことがあります。
これらは手動で削除することもできますが数が多いと手間がかかります。

GameObjectUtility.RemoveMonoBehavioursWithMissingScript
RemoveMonoBehavioursWithMissingScript関数は指定のゲームオブジェクトからMissingScriptを削除します。
docs.unity3d.com
サンプルスクリプト
指定のプレハブから内のMissingScriptを自動で削除する以下のサンプルスクリプトを作成しました。
本スクリプトをEditorフォルダに配置すると、Tools/Remove Missing Scripts From Select Prefabsメニューが追加されます。
・RemoveMissingScripts.cs
using UnityEditor; using UnityEngine; public class RemoveMissingScripts { [MenuItem("Tools/Remove Missing Scripts From Select Prefabs")] public static void RemoveFromSelectPrefabs() { // 現在選択中のプレハブを取得する GameObject[] selected = Selection.gameObjects; foreach (GameObject targetObject in selected) { // プレハブのGUIDを取得し、ファイルパスを取得する string guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(targetObject)); string path = AssetDatabase.GUIDToAssetPath(guid); // プレハブの内容をゲームオブジェクトとして取得する GameObject contents = PrefabUtility.LoadPrefabContents(path); // MissingScriptを削除する RemoveMissingFromGameObject(contents); // 編集したゲームオブジェクトをプレハブとして保存する PrefabUtility.SaveAsPrefabAsset(contents, path); PrefabUtility.UnloadPrefabContents(contents); } Debug.Log("選択したプレハブからMissing Scriptを削除しました。"); } private static void RemoveMissingFromGameObject(GameObject targetObject) { // オブジェクトにアタッチされているMissing Scriptを削除する int removed = GameObjectUtility.RemoveMonoBehavioursWithMissingScript(targetObject); if (removed > 0) Debug.Log($"{removed}個のMissingScriptを{targetObject.name}から削除しました。"); // 再帰的に子オブジェクトも処理する foreach (Transform child in targetObject.transform) { RemoveMissingFromGameObject(child.gameObject); } } }
MissingScriptの削除を行いたいプレハブを選択した状態で、メニューから[Tools -> Remove Missing Scripts From Select Prefabs]を実行します。

これで対象のプレハブから全てのMissingScriptが自動で削除されます。
