【Unity】【エディタ】Missingになっているコンポーネントを取得・削除する

UnityのエディタでMissingになっているコンポーネントを取得・削除する方法についてまとめました。

Unity2020.2.7f1

コンポーネントがMissingとは?

GameObjectにアタッチされたスクリプトが削除されると、実行すべきスクリプトが見つからずMissing表示になります。

f:id:halya_11:20210428175529p:plain
Missing

この状態になると実行時に次のような警告が出力されます。

f:id:halya_11:20210428175610p:plain
警告

またMissingなスクリプトが付いているGameObjectはPrefabにすることができず、
PrefabにしてからアタッチされているスクリプトがMissingになるとPrefabモードに入ることができません。

取得・削除する

Unityではエディタの機能としてMissingなコンポーネントの数を取得したり、削除したりするAPIが存在します。

それぞれ以下のようにして使用します。

using UnityEditor;
using UnityEngine;

public class Example
{
    [MenuItem("Example/Log Missing Script Count")]
    private static void LogMissingScriptCount()
    {
        var gameObject = Selection.activeGameObject;
        if (gameObject == null)
        {
            return;
        }
        
        var missingCount = GameObjectUtility.GetMonoBehavioursWithMissingScriptCount(gameObject);
        Debug.Log(missingCount);
    }
    
    [MenuItem("Example/Remove Missing Scripts")]
    private static void RemoveMissingScripts()
    {
        var gameObject = Selection.activeGameObject;
        if (gameObject == null)
        {
            return;
        }
        
        var missingCount = GameObjectUtility.RemoveMonoBehavioursWithMissingScript(gameObject);
        Debug.Log(missingCount);
    }
}

この機能はUnity2019から

なお、このAPIが追加されたのはUnity2019からになります。
それ以前のUnityでは以下のような対応が必要になります。

light11.hatenadiary.com

関連

light11.hatenadiary.com

参考

docs.unity3d.com

docs.unity3d.com