バージョン管理システムのAssetServerにファイルをコミット(アップロード)する際、「コミットするアセットが必要とするアセットも一緒にコミット」しやすくする、そんな便利機能があったので紹介します。
コミットするアセットが必要とするアセットって、
つまり…どういうことだってばよ!
「コミットするアセットが必要とするアセット」とは、
アセットが参照・使用しているアセット群の事です。
Unityのアセットは他のアセットを参照していることが多いです。例えばMaterialはTextureを参照していますし、AnimationControllerはAnimationClipを参照しています。
PrefabはScriptやMesh、Meshを描画するためのMaterialとShaderを参照していますし、SceneはPrefabを参照しているのでもっと複雑です。
アセットをAssetServerにコミットする際、これらの関連アセットが一緒にコミットされていないと、他の人がプロジェクトをロードした際にMissing(参照先が無い)となります。
これは参照先アセットが他の環境では存在しないからです。
整合性を保つには、アセットが参照しているアセットも一緒に他のサーバーで使えるようにコミットする必要があります。
例えばSceneをコミットしたとします。彼は勘違いして、シーンのみをコミットし、シーンが参照するほかのマテリアルやモデル・プレハブをコミットしませんでした。
彼の中では上の画像のように表示されますが、他の人が見ると下の画像のように、Prefabの参照が外れ赤く表示、モデルも無いので非表示といった出来損ないのシーンが表示されます。
全部コミットするのは安全だが時間がかかる
とりあえず必要なアセットが上がっていないケースの回避策として「全部コミット」がります。しかし、これは時間を無駄にします。
#fgj15 朝起きて、アップデートが、1.12GB pic.twitter.com/cQWu9oMulx
— 椿 (@tsubaki_t1) 2015, 8月 22
ファイルはものによっては大きく数百MBあったりします。特にAssetStoreのアセットは特化した単一以外のファイルも含まれていますので、そのままコミットすると、非常に大きなファイルを転送する事となります。
また量やファイルの種類によりインポートやコンバートの時間も発生し、これがかなりの時間を要求します。
逆に言えば、コミット対象を必要最低限にすることで、アップロード時間・ダウンロード時間・インポート時間・コミット時間・ビルド時間・ハードディスク容量・コーヒー代の等々を大きく節約することが期待できます。
必要なファイルのみをコミットする方法は
いつも通り Window > Version ControlでAssetServerの画面を開き、いつものOverviewではなく「commit」タブを押します。
これでコミットするファイルを選択・管理できるようになりますので、必要なファイルを選択し>>ボタンでChangesetへ移行します。
この際、たとえばシーンを移行する場合、シーンが必要とするすべてのアセットも一緒にステージングリストへ移行します。
あとはふつうにCommitすれば、AssetServerに最低限のファイルがコミットされます。
問題点はソースコードの参照認識が雑な点
問題点ですが、ソースコードとシェーダーの参照認識が雑です。具体的には、直接PrefabやシーンからアクセスされるコードはキッチリとChangesetに組み込まれますが、参照・継承しているファイルに関しては組み込まれません。
まあソースコードに関していえばインポート時間や転送・帯域に関しては余り無いですし、とりあえず全部突っ込んでも問題は無いと思います。
そのあたりの問題も含めて、今作ってる「不要アセットを消すアセット」の「参照関係マップを構築&ソースコード解析」が上手くハマりそうなので、これを使ってGitのステージングに必要なアセットを乗せる奴を作るのも面白いなーと思いつつ。
作ってる奴ですが、幾つかの条件(namespaceの中でnamespaceを定義する)で定義が見つからないって問題がありますが、他は概ね良い感じに動きます。とりあえずAssetStoreに上がってるアセットでは概ね問題なく動作します。
あとキャッシュを使う事で大分処理が高速化しました。デバッグシンボルから型を持ってくるようにすればもっと高速化できそうですが、読み方コレガワカラナイ。
プロジェクトで未使用のアセットをプロジェクトから消すエディタ拡張、ソースコード解析時間が大分短縮出来て良い感じ #Unity pic.twitter.com/uiyymGuyNH
— 椿 (@tsubaki_t1) 2015, 8月 17
元々AssetStoreからダウンロードしてきた無駄ファイルをコンバート・ビルド・コミットする際にファイルを減らす目的で作ってた訳ですが、ステージングへ持ってくファイルをコレで決めた方が効率的な気も凄くしてきましたむむむ。