【C#】Unityの不要アセット削除ツールを作った話
本記事はプロモーションを含みます(笑)
BoothにUnityの不要なアセットを削除できるツール「Assets Deleter」を出品しています。
ツールがどんな仕組みでできているかなど、調査した内容やらロジックをちょっと書いていこうと思います。
ツールの作成経緯
友人のワールド作成の手伝いをしているなかで、アセットが肥大化して、もう大変・・・。
適当にフォルダを消したら、オブジェクトが紫になって、どのアセットを使用しているかわからん!
Assets Deleterとは
Unityプロジェクトで使用していない不要なアセットを判別・削除できるツールです。
アプリ概要
- Windows formアプリ(C#)
- .NETバージョン(確認中)
ロジック
- Unityプロジェクトフォルダ>Assetsフォルダ配下のリスト化
- .Unityファイルから使用中のアセットの取得
- 「2.」を基に削除対象をスキャン
- 削除実行
削除判定
Unityで使用中/未使用は.unityに記載されています。(例外あり)
もっと詳しく書くと、フォルダ/ファイル単位にGUIDという固有のIDが振られていて、使用しているアセットのGUIDが.unityファイルに刻まれています。
フォルダ/ファイルに割り当てられたGUIDは.metaファイルで確認することができます。
こんな感じで一対になってます。
SAKURAエディタなどのテキストエディタで、.metaファイルを開くと「guid」があります。
ちなみに、.unityファイルの中はguidだらけです(笑
あと特筆すべきは、全部が.unityで管理されているわけではないということです。
例外
「lilToon」シェーダーがいい例かもしれません、.unityは3Dオブジェクトに割り当ててるマテリアルやシェーダーは.unityの管理外みたいです。
まだ未調査ですが、使用していマテリアルやら、シェーダーは各オブジェクトなどの.metaファイルなどで管理されているっぽいです。
あと、なんでか「terrain」も管理対象外みたいです。
デバッグ中にliltoonが消えて紫になっちゃりしたので、発覚しました。
なので、ツールには、削除対象/対象外を任意に変更できる機能を仕込みました。
あとがき
例外の部分も自動で判定ができそうですが、結構骨が折れそうで、実装は見送っています。
スキャンに時間かかりそうなのと、もうちょい深くUnityの仕様を理解する必要がありそうです。
久しぶりにC#使ったので、ファーストリリースはちょっとグダちゃいましたが、今Verは比較的安定しているかも・・・。
是非使用感をお伺いしたいところではあります!
Discussion