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

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】異なるプロジェクトでAssetbundleを構築する際の注意点

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とでもしておきます。

f:id:tsubaki_t1:20160718234038j:plain

次にethanを使用しているPrefabを作成します。
AssetBundleNameはcharacterとでもしておきます。

f:id:tsubaki_t1:20160718234650j:plain

後はAssetBundleをビルドして、ethanとcharacterのAssetBundleを作成します。

f:id:tsubaki_t1:20160719000018j:plain

AssetBundleの作成については、こちら。

tsubakit1.hateblo.jp

プロジェクト1の作業

新しくプロジェクト1(Project1)を作成します。

プロジェクト1では、ethanのAssetBundleだけを作成します。

プロジェクト2と同様にStandardAssets>Characterからパッケージをインポートし、ethanを取得します。

ただ折角なので、プロジェクト2のethanのマテリアルの色は少し変えておきます。

f:id:tsubaki_t1:20160718235159j:plain

同様にAssetBundleをビルドします。作成したのはethanのAssetBundleだけです。

f:id:tsubaki_t1:20160719000004j:plain

プロジェクト2とプロジェクト1が作成したAssetBundleを読む

最後にプロジェクト2にてプロジェクト1が作成したAssetBundleを読みます。
やることは簡単で、プロジェクト1が作成したethanと、プロジェクト2が作成したcharaのAssetBundleをStreamingAssetsに突っ込んでエクシーズ召喚するだけです。

f:id:tsubaki_t1:20160719000351j:plain

f:id:tsubaki_t1:20160719000238j:plain

現われろ、ランク4 Ethan!

f:id:tsubaki_t1:20160719000606j:plain

スクリプトもGUIDで依存関係を構築

このアプローチでは、スクリプトを使用した場合も同様に「スクリプトがプロジェクト間で同一のGUIDを持っていれば」、同様に設定してくれます。
また、public等を設定してInspectorに露出したパラメータも、保持されます。


なお最終的にロードするプロジェクトが持つスクリプトが優先されます。逆を言えば、最終的にロードするプロジェクト以外で中身が空でも問題ないという事です。

例えば左のようにInspector露出用のパラメータをとりあえず作っておいて、中身をゴリゴリ書いていくという感じも出来なくもないです。

f:id:tsubaki_t1:20160719001329j:plain

注意点

GUIDで依存関係を設定しているので、GUIDを合わせにくい状態では少々使い勝手が悪いです。例えばFBXの中に含まれるAnimationやmeshを全く別のFBXと差し替えるのは少々面倒かもしれません。

AssetFileHashは中身が同一のAssetBundleでも同じ値にはなりません。ファイルのフルパスやらOSやら、その他何らかの物が影響してるみたいです。

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp