かずおの開発ブログ(主にRuby)

日々の開発のことを色々書きます。

新•Unity5の新しいAssetBundleSystemを使ってAssetをダウンロードする

前回のエントリーは不十分なところがかなり多かったので改めてUnity5におけるAssetBundleの使い方について説明したいと思います。

今回作るもの

動画 今回製作するものはこちらです。一見ただ顔がInstantiateされたように見えますが実際にはサーバーから落としてきたAssetからInstantiateされています。前回の不具合を治して、各OSに対応&参照も外れないようになっています。

下準備

下準備としてこちらのgitからコードを落としておいてください。 https://github.com/kazuooooo/Unity5AssetBundleSample.git

スクリプトをインポート

新しい空のプロジェクトを作成して、gitから落としたスクリプトの内AssetBundleMenu.csをEditorフォルダ(※必ずEditorという名前のフォルダにしてください。)に、残りの3つのスクリプトはScriptsフォルダにインポートしてください。

f:id:kazuooooo:20150826191915p:plain f:id:kazuooooo:20150826191926p:plain

続いてAssetBundleにするための何か適当なPrefabを作成します。

f:id:kazuooooo:20150826192454p:plain

今回はこんなかわいい顔を用意しました。 単純なCubeとかでもOKですが、参照情報が保持されていることを確認するために何か適当なマテリアルを貼り付けたりしておいたほうがベターです。

AssetBundleを作成

続いて先ほど用意したPrefabからAssetBundleを作成していきます。 まずPrefabを選択して右下に出てくるAssetBundleの右のNoneというところをクリックしてNewを選択します。

f:id:kazuooooo:20150826192928p:plain

ここでAssetBundleのタグを作成します。このタグが同じものが1つのAssetBundleファイルとしてまとめられます。 ちなみに/で区切ることで階層構造にすることも可能です。

f:id:kazuooooo:20150826193133p:plain

タグが設定出来たら、メニューからAssetBundleを選択(もし表示されていなければ、EditorフォルダにAssetBundleMenu.csが入っているか確認して下さい。)して、ビルドしたい対象のOSを選択してください。

f:id:kazuooooo:20150826193408p:plain

また、ここで設定したOSとBuildSettingの対象のOSが同じであることも確認してください。もし異なっていれば、SwitchPlatformで同じにしておいてください。

f:id:kazuooooo:20150826193525p:plain

最後にもう一度AssetBundleメニューを選択して一番下にあるBuildAssetBundlesをクリックしてください。ビルドするフォルダはデフォルト(Assetsと同じ階層)でいいかと思います。

f:id:kazuooooo:20150826195650p:plain

作成されたAssetBundleを確認

AssetBundleができていることを確認します。

f:id:kazuooooo:20150826194938p:plain

このようにAndroidとfaceという名前のAssetBundleが作成されていることが分かります。他のOSを設定した場合は その名前のフォルダが生成されます。

ちなみに少し説明するとこの(OSの名前).manifestというファイルが各AssetBundleの参照情報を保持している親玉的存在です。 Unity5でAssetBundleを用いる際には必ずこの.manifestファイルをロードしておく必要があります。

詳しくはこちらの動画を御覧ください。とても分かりやすく説明されています。 https://vimeo.com/125767164

作成したAssetBundleをサーバーにアップロード

上で作成したAssetBundleフォルダをサーバーにアップロードします。 今回はAndroidでビルドしたのでAndroidフォルダをアップします。 やり方についてはAssetBundleと直接関係ないのでここでは省略します。

シーンを準備

AssetBundleの準備が出来たので、検証するためのシーンを準備します。 まずヒエラルキー上にLoderという空のオブジェクトを作成します。 そこにインポートしたAssetManager.csとAssetBundleLoaderSample.csをアタッチしてください。

f:id:kazuooooo:20151003153526p:plain

続いてAssetManager.csのPath to Bundelsの項目に先ほどAssetBundleのフォルダをアップしたサーバーのURLを記載してください。このときの注意点としてOS名のフォルダ以下を指定するのでなくそのフォルダがある階層を指定するようにしてください。例えば×http://~/AssetBundle/Android/, http://~/AssetBundle/といった具合です。 理由としてはOS名の部分は環境に依存して自動的に補完されるからです。これによって、複数のOSに1つのコードで対応できます。

f:id:kazuooooo:20151003154253p:plain

最後にAssetBundleLoadSampleのBuldleNameにBundleの名前とロードしたいAssetの名前を記載します。 今回はBundleの名前がface、Assetの名前がFaceとなります。

f:id:kazuooooo:20151003154535p:plain

最後に本当にサーバーから落としていることを確認するためにもプロジェクトの中にあるFacePrefabは削除しておきます。

検証

準備が整ったのでシーンを再生してみましょう。 動画と同じように顔がinstantiateされたでしょうか?

スクリプトの細かい説明とかはしておりませんが、中を見ればだいたい分かると思います。 これはとても単純なものですが、このサンプルを参考に色々発展させてみてください!