はじめに
プログラマーであればソースコード等のバージョン管理システムを使ったことがある方はかなり多いのではないでしょうか。
また、Unityでの開発においてもバージョン管理システムを使うことがあるかと思います。パッケージの開発や配布をするときにもGitHubなどのGitのホスティングサービスに置いておくと開発の管理や利用者の導入導線の確保など色々な利点があると考えます。
動作環境
- Unity 2021.3以上
- ファイル名がUTF-8で記述されたインデックスファイル
使い方
以下のリポジトリを導入すると、Git管理下にあるアセットをUnityエディターのProjectウィンドウで移動したりリネームしたりした時に自動的にGitに反映されるようになります。
アセットのファイルを管理しているインデックスファイルを探すようになっているため。UnityでよくあるGitの使われ方であるプロジェクトフォルダー以下をGitで管理している場合や、Packagesフォルダー内の個別フォルダー以下をGitで管理している場合などに対応できるようになっています。
成果物・導入方法
リポジトリ(詳しい導入方法はREADMEに記載しています)
ライセンス
MITライセンスです
発生していて解決したかった事象
Unityのエディター上でアセットの移動や名前変更を行う際にGitのインデックスの更新のことを考えなければならない、またはUnityのエディターの機能を使わずにgit mv
などでアセットとmetaファイルを手動で移動しなければならないこと。
方針を立てる
その1
まず、ファイル保存ウィンドウを使用して移動先または変更後のパスを取得し、アセットとmetaファイル機能をアセットの右クリックメニューから呼び出せるようにする機能を作りました。
ですが、使っているうちにコマンドでやっていた時と大して手間が変わらないでは・・・と思うようになってきました。
その2
次は、AssetModificationProcessor.OnWillMoveAssetを使ってアセットの移動やリネームを検知し、移動やリネームの処理をUnityのものからgit mvを呼び出す独自処理に変更する機能を作りました。
使用感としてはそれなりに自然ではあったのですが、Gitのコマンドを呼び出している都合で、同時に移動するアセットの数が増えると処理にそれなりに時間がかかるようになったり、Gitの管理下にあるファイルやフォルダーと管理下にないファイルやフォルダーで移動処理自体を変えなければならない(管理下にないファイルや、そのフォルダー以下にひとつも管理下になっているファイルがないフォルダーに対してはgit mv
はエラーを出す)ため実装が複雑になったりと、長い目で見ると使い続けるにはちょっと堪えないのではないか・・・と思うようになりました。
その3(今回の成果物で採用)
今回は、
- AssetModificationProcessor.OnWillMoveAssetを使ってアセットの移動やリネームを検知してリストアップする
- アセットの移動やリネームがひととおり終わったら、アセットファイルやmetaファイルの移動やリネームを直接Gitのインデックスファイルに反映する
という方針で実装しました。
以前の2つ(特に方針その2)の課題点を、
- アセットの移動/リネーム処理が複雑に
→ 移動やリネーム自体はUnityエディターに一任し、自前ではインデックスファイルの更新のみを行うことにより、管理下かどうかによる処理の分岐はインデックスファイルに移動/リネーム元のレコードが存在するかというインデックスファイル更新時の事前判定レベルの処理にまでコンパクトにできた - 大量のアセットを移動した時に時間がかかる(+通常カーソルとビジーカーソルを行ったり来たりする)
→ 外部プロセスの実行(git mv
の呼び出し)を行わず、エディターから実行されるC#コードのみでGitへの反映を行ったり、更新作業(特にインデックスファイルの読み込みや保存などの処理)をひとまとめにしたりすることにより、処理を高速化できた
といった感じに解決しています。