MonoDevelopだったら「コマンド + シフト + Y」
Xamarin Studioだったら「コマンド + シフト + R」
というショートカットをクラス名の部分にフォーカスした状態で使うと、そのクラスを使用している箇所の参照がリストアップされます。そのリストが空だったら、どこからも使用されていないと判断して、
「あ、このファイルどこからも参照されてないし、使ってないから消してしまおう!」
って思うことは開発中にはよくある話です。
しかし、Unityの場合は、コード上の参照がないからといって100%使用していないという保証はありません。
なぜなら2つの可能性があります。
※コード上参照が存在しないHoge.cs
というコンポーネントを例とします
1.シーンファイルに存在する場合
Prefabにもなってなくて、Hierarchy内のGameObjectにアタッチされている状態。
2.Prefabにアタッチされて存在する場合
Hierarchyにはなく、Projectブラウザにのみ存在するPrefabにアタッチされている状態。
以上2つのパターンでは、MonoDevelop、Xamarin StudioではHogeコンポーネントが使用されている事を確認することは出来ません。
ここからその調べ方を紹介していきます。
GUIDで検索
AddComponentされたコンポーネントはGUID
と呼ばれるユニークIDで管理されます。
Hoge.cs
コンポーネントのGUIDがd084434c9c3e54a3aac63090dab2b5e6
だったとすると、この値がシーンファイル、prefabどちらにも存在しないことが確認されて初めてHoge.csは使用されていないと断定できます。
私はgrepコマンドで調べちゃいます。 カレントディレクトリをAssetsにして、以下のコマンド実行します。
grep "d084434c9c3e54a3aac63090dab2b5e6" -r .
※-rオプション
は指定したディレクトリ配下を再帰的に検索します。
./dir/Foo.prefab: m_Script: {fileID: 11500000, guid: d084434c9c3e54a3aac63090dab2b5e6, type: 3} ./dir/Test.unity: m_Script: {fileID: 11500000, guid: d084434c9c3e54a3aac63090dab2b5e6, type: 3}
こんな風に検索に引っかかってしまうということは、Hoge.csは使用中という事になります。
GUIDの調べ方
GUIDは作成したファイル、ディレクトリと対で存在する.metaファイルに記載されています。
Hoge.csであれば、同階層にHoge.cs.metaというファイルが存在するのでそちらを開きます。
fileFormatVersion: 2 guid: d084434c9c3e54a3aac63090dab2b5e6 timeCreated: 1438604252 licenseType: Pro MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant:
guid
というキーを探し、そのバリューがGUIDという事になります。
ここではd084434c9c3e54a3aac63090dab2b5e6
がGUIDになります。
【注意】シーンファイルをテキストに変換
シーンファイルやPrefabファイルは設定によってはバイナリデータになっている可能性があります。
そうすると、GUIDを調べる事は出来ません。
そこでシーンファイルをテキストデータに変換してみます。
上部メニュー Edit > Project Settings > Editor
を開きます。
Asset Serialization
のModeをForce Text
にします。
こうすることでシーンファイル(.unity)やPrefabファイルがテキストファイル
として扱われるようになります。
./dir/Hoge.cs.meta:guid: d084434c9c3e54a3aac63090dab2b5e6
最終的に、Hoge.cs.metaだけが検索に引っかかる状態であれば、Hoge.csは使用されていないということになります。
まとめ
リファクタリングしている最中に発生しがちなファイルの削除ですが、Unityの場合はパッと見、使っていないように見えてしまうのが非常に厄介なところです。
しかも削除しただけだとコンパイルエラーは出ません(ランタイムエラーは出る可能性はあります)。
そのコンポーネントがアタッチされているGameObjectは、何か挙動がおかしい状態になり、インスペクタを確認するとMissing
と表示されます。
時間が経った後に見つかってしまうと、何のファイルが消されたのかさえ分からなくなります。複数人開発ならなおさらです。
非常に危険な状態です。
ファイルを削除するときは、シーンファイルとPrefabの2つのポイントに細心の注意を払いましょう!
私も以前痛い目を見たので、戒めとしてこの記事にまとめた次第です。