【Unity】異なるプロジェクトでAssetbundleを構築する際の注意点
今回は「異なるProjectにてAssetBundleを構築するとどうなるのか」についてです
別のプロジェクトで作ったAssetBundleは読める
まず別のプロジェクトで作成したAssetBundleですが、問題なくロードする事が出来ます。
これはAssetBundleをビルドするプロジェクト1と、AssetBundleをロードするプロジェクト2があった場合、プロジェクト1でビルドしたAssetBundleをプロジェクト2で読めるという事です。
よくあるのが、Jenkins等のCIにAssetBundleの構築をお願いし、実際のゲームでAssetBundleの読込を行う処理です。
複数のプロジェクト間で作成したAssetBundleの依存関係
では「複数のプロジェクトでAssetBundleを作成」した場合の依存関係はどうでしょうか。
例えば、プロジェクト1にて「キャラクター」のAssetBundleを作成し、プロジェクト2で「キャラクターを使用したPrefab」のAssetBundleを作成した場合です。
これは、プロジェクト2の中から参照しているキャラクターのGUIDがプロジェクト1のキャラクターと一致しており、かつプロジェクト2でもキャラクターのAssetBundleを作成」しているならば、ロード出来ます。
つまり、プロジェクト2でプレハブを作成しておき、プロジェクト1でキャラクターの中身を少し差し替えた状態でロードした場合も、正常にロード出来るという事です。
確認方法
ややこしいので、実際に確認する方法を書きます。
プロジェクト2の作業
まず、プレハブとキャラクターのAssetBundleを作成するプロジェクト2(Project2)を用意します。
キャラクターはStandardAssetsのEthan(StandardAssets>Character)を使用します。
キャラクターをAssetBundleに格納したいので、ThirdPersonCharacterのassetbundle nameはethanとでもしておきます。
次にethanを使用しているPrefabを作成します。
AssetBundleNameはcharacterとでもしておきます。
後はAssetBundleをビルドして、ethanとcharacterのAssetBundleを作成します。
AssetBundleの作成については、こちら。
プロジェクト1の作業
新しくプロジェクト1(Project1)を作成します。
プロジェクト1では、ethanのAssetBundleだけを作成します。
プロジェクト2と同様にStandardAssets>Characterからパッケージをインポートし、ethanを取得します。
ただ折角なので、プロジェクト2のethanのマテリアルの色は少し変えておきます。
同様にAssetBundleをビルドします。作成したのはethanのAssetBundleだけです。
プロジェクト2とプロジェクト1が作成したAssetBundleを読む
最後にプロジェクト2にてプロジェクト1が作成したAssetBundleを読みます。
やることは簡単で、プロジェクト1が作成したethanと、プロジェクト2が作成したcharaのAssetBundleをStreamingAssetsに突っ込んでエクシーズ召喚するだけです。
現われろ、ランク4 Ethan!
スクリプトもGUIDで依存関係を構築
このアプローチでは、スクリプトを使用した場合も同様に「スクリプトがプロジェクト間で同一のGUIDを持っていれば」、同様に設定してくれます。
また、public等を設定してInspectorに露出したパラメータも、保持されます。
なお最終的にロードするプロジェクトが持つスクリプトが優先されます。逆を言えば、最終的にロードするプロジェクト以外で中身が空でも問題ないという事です。
例えば左のようにInspector露出用のパラメータをとりあえず作っておいて、中身をゴリゴリ書いていくという感じも出来なくもないです。
注意点
GUIDで依存関係を設定しているので、GUIDを合わせにくい状態では少々使い勝手が悪いです。例えばFBXの中に含まれるAnimationやmeshを全く別のFBXと差し替えるのは少々面倒かもしれません。
AssetFileHashは中身が同一のAssetBundleでも同じ値にはなりません。ファイルのフルパスやらOSやら、その他何らかの物が影響してるみたいです。