読者です 読者をやめる 読者になる 読者になる

渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きく慣れるように。。。 ※所属団体とは一切関係がありません

Unityでファイルを削除するときに必ずチェックしたい2つのポイント


f:id:esakun:20150730215258g:plain

MonoDevelopだったら「コマンド + シフト + Y」
Xamarin Studioだったら「コマンド + シフト + R」

というショートカットをクラス名の部分にフォーカスした状態で使うと、そのクラスを使用している箇所の参照がリストアップされます。そのリストが空だったら、どこからも使用されていないと判断して、

「あ、このファイルどこからも参照されてないし、使ってないから消してしまおう!」

って思うことは開発中にはよくある話です。

しかし、Unityの場合は、コード上の参照がないからといって100%使用していないという保証はありません。

なぜなら2つの可能性があります。
※コード上参照が存在しないHoge.csというコンポーネントを例とします

1.シーンファイルに存在する場合

Prefabにもなってなくて、Hierarchy内のGameObjectにアタッチされている状態。

f:id:esakun:20150803220109p:plain

2.Prefabにアタッチされて存在する場合

Hierarchyにはなく、Projectブラウザにのみ存在するPrefabにアタッチされている状態。

f:id:esakun:20150803220116p:plain

以上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を開きます。

f:id:esakun:20150803220710p:plain

Asset SerializationのModeをForce Textにします。
こうすることでシーンファイル(.unity)やPrefabファイルがテキストファイルとして扱われるようになります。

./dir/Hoge.cs.meta:guid: d084434c9c3e54a3aac63090dab2b5e6

最終的に、Hoge.cs.metaだけが検索に引っかかる状態であれば、Hoge.csは使用されていないということになります。

まとめ

リファクタリングしている最中に発生しがちなファイルの削除ですが、Unityの場合はパッと見、使っていないように見えてしまうのが非常に厄介なところです。

しかも削除しただけだとコンパイルエラーは出ません(ランタイムエラーは出る可能性はあります)。
そのコンポーネントがアタッチされているGameObjectは、何か挙動がおかしい状態になり、インスペクタを確認するとMissingと表示されます。
時間が経った後に見つかってしまうと、何のファイルが消されたのかさえ分からなくなります。複数人開発ならなおさらです。

f:id:esakun:20150803222157p:plain

非常に危険な状態です。

ファイルを削除するときは、シーンファイルPrefabの2つのポイントに細心の注意を払いましょう!
私も以前痛い目を見たので、戒めとしてこの記事にまとめた次第です。