UnityでMissingになっているScriptを特定する

作業をしようと思ったら Missing の文字が。多分リファクタリングの過程で削除したスクリプトの残滓だと思うので放置しても良いが、重要な何かだったら困るので確認をする。

guidを特定する

対称のGameObjectが配置されているシーンファイルをVisualStudioなどで開き、ファイル内検索などを使って対称のGameObjectの項へ移動する。

GameObjectの名前はシーンファイルに記述されているので、GameObjectの名前で検索すれば開けるはず。

Generalという名前のオブジェクトはGeneralで検索すると出る
こんな感じ

GameObjectの情報が見れたら、その下は次のGameObjectが出てくるまで対象のGameObjectに関する情報になっているので、 MonoBehaviour: という記述を追っていく。

GameObjectにスクリプトをいくつかアタッチしている場合は、同数のMonoBehaviourに関する項目があるので、それぞれの

m_Script: {fileID: ******, guid: ***************, type: *}

という記述を見る。

これで、アタッチされているすべてのスクリプトのguidが追える

ファイルの存在確認

この時点で、GameObjectに3つのスクリプトをアタッチしていたのであれば、3つのguidが取得できていることになる。

これを、プロジェクトに追加されているすべてのスクリプトのmetaファイルに記述されている、guidと比較していく。

方法はなんでもよくて、VSの機能を使うなり、エクスプローラーの機能を使うなり、Linux, UNIX系なら find ./Assets/Scripts -type f -name "*.meta" | xargs grep "guid" などすれば全スクリプトのguid一覧が見れるので検索するなりすればよい。

ファイルがある場合

上記までの手順でguidの一致が確認できた場合は、アタッチされているはずのスクリプトが何らかの理由でMissingになってしまっているということなので、原因を探して解消すると良い。

ファイルがない場合

ファイルがない場合考えられる大きな可能性は2つで、

1つはファイルを削除してしまっている場合。

もう1つはファイルをリネームするなどしてguidが変わっている場合。

どちらも、Gitを使っていれば git log --diff-filter=D --summarygit log --diff-filter=R --summary などで終えるので、直近の変更を確認してみると良い。

変更をさかのぼるなどしてguidの一致を確認できるはずだ。