Unity3D
Unity
qnoteDay 16

Unity5系でのAsset Bundle使い方まとめ

More than 3 years have passed since last update.

こちらはqnote Advent Calendar 16日目の記事となります。

最近Asset Bundleを使うことが多い(ってか必須になってる)ので、使ったことない人向けにざっくりと使い方をまとめてみました。


Asset Bundleの概念

Unityでゲーム開発する際、アプリのアップデート無しにコンテンツを増やしたい場合はAsset Bundleを使うと便利です。

画像とか音声とかテキストとかのファイル(Asset)をUnityで固めて「Asset Bundle」にします。

こいつをサーバに配置し、ゲーム中にDL・展開して使います。


Asset Bundleを固めてみよう

まずはAsset Bundleを固めてみましょう。

※ちなみに、本記事はAndroid/iOSアプリ向けを想定しています。

(他OSアプリの場合、Asset Bundleビルド時のプロパティを変える必要があります)


Assetの準備

cat.pngをcat.pngとして保存、Unityにインポートします。

今回は、Texture TypeはSpriteにします。

スクリーンショット 2015-12-16 0.09.54.png


Asset Bundleの登録

cat.pngのInspectorの↓を見てみると、Asset Bundleのプルダウンがあります。

プルダウンでNew...を選択し、新しくAsset Bundleを作成します。

今回は「catbundle」にしました。

スクリーンショット 2015-12-16 0.12.35.png

ちなみに、ひとつのAsset Bundleには複数のAssetを含ませることが可能です。


Asset Bundle作成用のスクリプトを準備

公式ドキュメント

http://docs.unity3d.com/ja/current/Manual/BuildingAssetBundles5x.html

に記載はありますが、ちとわかりにくい&Android/iOS向けにはカスタムする必要があります。

ってことで、下記を使えばOKです。


CreateAssetBundles.cs

using UnityEditor;

public class CreateAssetBundles
{
[MenuItem("Assets/Build AssetBundles")]
static void BuildAllAssetBundles()
{
// Android用
BuildPipeline.BuildAssetBundles("Assets/AssetBundles/Android", BuildAssetBundleOptions.None, BuildTarget.Android);
// iOS用
BuildPipeline.BuildAssetBundles("Assets/AssetBundles/iOS", BuildAssetBundleOptions.None, BuildTarget.iOS);
}
}


こいつをAssetsディレクトリに配置すると、Assetsメニューに「Build AssetBundles」の項目が追加されます。

スクリーンショット 2015-12-16 0.22.46.png


Build AssetBundles実行

Asset Bundle出力用に下記2つのディレクトリを作成してから、「Build AssetBundles」を実行してみてください。

Assets/AssetBundles/Android

Assets/AssetBundles/iOS

こんな感じで、各OS用のAsset Bundle「catbundle」が作成されました。

スクリーンショット 2015-12-16 0.28.19.png

ちなみに、catbundleに含まれているファイルは、同ディレクトリに生成されたcatbundle.manifestに記載されています。


Asset Bundleをサーバに配置する

上記で生成されたAndroid/iOS用「catbundle」をサーバに配置します。

DropBoxでもParseでも、好きなところに置いてください。


Asset Bundleを使用する

Asset Bundleを使用するには、


  • ダウンロード

  • 読み込み

の手順が必要です。


Asset Bundleを管理するスクリプト

ダウンロード後はキャッシュしておいた方が扱いやすいので、そのあたりの処理を超シンプルにするとこんな感じです。


AssetBundleManager.cs

using UnityEngine;

using System;
using System.Collections;

public class AssetBundleManager : MonoBehaviour
{
// AssetBundleのキャッシュ
private AssetBundle assetBundleCache;

// Asset Bundleをロードするコルーチンです
public IEnumerator LoadAssetBundleCoroutine()
{
// Asset BundleのURL
var url = "";
#if UNITY_ANDROID
url = "http://Android用catbundleを配置したURL";
#else
url = "http://iOS用catbundleを配置したURL";
#endif

// ダウンロード処理
var www = WWW.LoadFromCacheOrDownload(url, 1);
while (!www.isDone)
{
yield return null;
}

// TODO エラー処理とか

// Asset Bundleをキャッシュ
assetBundleCache = www.assetBundle;

// リクエストは開放
www.Dispose();
}

// Asset BundleからSpriteを取得します
public Sprite GetSpriteFromAssetBundle(string assetName)
{
try
{
return assetBundleCache.LoadAsset<Sprite>(string.Format("{0}.png", assetName));
}
catch (NullReferenceException e)
{
Debug.Log(e.ToString());
return null;
}
}
}


サンプルなので極力シンプルに書きましたが、本来は


  • Asset BundleのURLをサーバから取得するように

  • Asset Bundleを複数管理可能に

  • Asset Bundleのバージョン管理も可能に(バージョンが変わっている場合のみダウンロード)

などの処理を入れた方が良いです。


Asset Bundleを使う側の処理

Asset Bundleを使う側はこんな感じです。


SceneController.cs

using UnityEngine;

using UnityEngine.UI;
using System.Collections;

public class SceneController : MonoBehaviour
{
public AssetBundleManager assetBundleManager;
public Image image;

public IEnumerator Start() {
// Asset Bundleのロード処理
yield return StartCoroutine(assetBundleManager.LoadAssetBundleCoroutine());
// ロード完了後、Assetが取り出せるようになる
image.sprite = assetBundleManager.GetSpriteFromAssetBundle("cat");
}
}



実行してみる

シーンにUnity UIのImageオブジェクトを配置します。

その後、Canvasに「AssetBundleManager」「SceneController」をアタッチします。

SceneControllerのプロパティに、AssetBundleManagerとImageをひも付けておきます。

スクリーンショット 2015-12-16 1.49.47.png

実行してみると、Imageにcat.pngが反映されました!

Asset Bundleバッチリ使えてますね〜

スクリーンショット 2015-12-16 1.53.29.png


まとめ

Asset Bundle、Unityでそこそこの規模のゲームを作る場合は必ず使うことになるかと思います。

制御は意外と簡単ですので、ぜひチャレンジしてみてください。