新•Unity5の新しいAssetBundleSystemを使ってAssetをダウンロードする
前回のエントリーは不十分なところがかなり多かったので改めてUnity5におけるAssetBundleの使い方について説明したいと思います。
今回作るもの
動画 今回製作するものはこちらです。一見ただ顔がInstantiateされたように見えますが実際にはサーバーから落としてきたAssetからInstantiateされています。前回の不具合を治して、各OSに対応&参照も外れないようになっています。
下準備
下準備としてこちらのgitからコードを落としておいてください。 https://github.com/kazuooooo/Unity5AssetBundleSample.git
スクリプトをインポート
新しい空のプロジェクトを作成して、gitから落としたスクリプトの内AssetBundleMenu.csをEditorフォルダ(※必ずEditorという名前のフォルダにしてください。)に、残りの3つのスクリプトはScriptsフォルダにインポートしてください。
続いてAssetBundleにするための何か適当なPrefabを作成します。
今回はこんなかわいい顔を用意しました。 単純なCubeとかでもOKですが、参照情報が保持されていることを確認するために何か適当なマテリアルを貼り付けたりしておいたほうがベターです。
AssetBundleを作成
続いて先ほど用意したPrefabからAssetBundleを作成していきます。 まずPrefabを選択して右下に出てくるAssetBundleの右のNoneというところをクリックしてNewを選択します。
ここでAssetBundleのタグを作成します。このタグが同じものが1つのAssetBundleファイルとしてまとめられます。 ちなみに/で区切ることで階層構造にすることも可能です。
タグが設定出来たら、メニューからAssetBundleを選択(もし表示されていなければ、EditorフォルダにAssetBundleMenu.csが入っているか確認して下さい。)して、ビルドしたい対象のOSを選択してください。
また、ここで設定したOSとBuildSettingの対象のOSが同じであることも確認してください。もし異なっていれば、SwitchPlatformで同じにしておいてください。
最後にもう一度AssetBundleメニューを選択して一番下にあるBuildAssetBundlesをクリックしてください。ビルドするフォルダはデフォルト(Assetsと同じ階層)でいいかと思います。
作成されたAssetBundleを確認
AssetBundleができていることを確認します。
このように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をアタッチしてください。
続いてAssetManager.csのPath to Bundelsの項目に先ほどAssetBundleのフォルダをアップしたサーバーのURLを記載してください。このときの注意点としてOS名のフォルダ以下を指定するのでなくそのフォルダがある階層を指定するようにしてください。例えば×http://~/AssetBundle/Android/, http://~/AssetBundle/といった具合です。 理由としてはOS名の部分は環境に依存して自動的に補完されるからです。これによって、複数のOSに1つのコードで対応できます。
最後にAssetBundleLoadSampleのBuldleNameにBundleの名前とロードしたいAssetの名前を記載します。 今回はBundleの名前がface、Assetの名前がFaceとなります。
最後に本当にサーバーから落としていることを確認するためにもプロジェクトの中にあるFacePrefabは削除しておきます。
検証
準備が整ったのでシーンを再生してみましょう。 動画と同じように顔がinstantiateされたでしょうか?
スクリプトの細かい説明とかはしておりませんが、中を見ればだいたい分かると思います。 これはとても単純なものですが、このサンプルを参考に色々発展させてみてください!