エイリアンプログラム

主にゲームプログラミングに関するブログです。

アセットバンドルのロードについて

どうも2週間ぶりです。
今回はアセットバンドルについてブログを記載したいと思います。

さてアセットバンドルとは何でしょうか?
簡単に申しますとUnity版Zipファイルみたいなものです。
主に使う場面としては、スマフォゲームの開発ではビルドした時にアプリの容量を100MB以下に納めないといけません。 ただし、実際のゲームでは、モデル、テクスチャ、サウンド等のデータを大量に使っています。
そこで出てくるのがアセットバンドルです。
ゲーム中に使用する素材(モデル、テクスチャ、サウンド等)をアセットバンドルという形式でサーバーに置いときます。 そして必要なタイミングで、そのアセットバンドルをダウンロードして各ファイル形式にロードして行きます。
分かりやすいように以下の図を作成しました。少しでも参考になればと思います。
f:id:alien_program:20170903184136p:plain

アセットバンドルの作り方は以下の公式サイトに詳しく記載されています。
Unity - マニュアル: アセットバンドルのビルド

アセットバンドルをロードする方法は以下の通りとなります。

    public Image m_image;

    private IEnumerator Start()
    {
        string path = Application.dataPath + "/AssetBundles/other/alien.asset";
        Sprite sprite = new Sprite();
        yield return Load<Sprite>(path, "alien.png", (a) => { sprite = a; });
        m_image.sprite = sprite;
    }

    private IEnumerator Load<T>(string path, string fileName, UnityEngine.Events.UnityAction<T> callback) where T : Object
    {
#if UNITY_EDITOR
        AssetBundle bundle = AssetBundle.LoadFromFile(path);

        AssetBundleRequest request = bundle.LoadAssetAsync<T>(fileName);

        yield return request;

        T value = request.asset as T;
#else
        while (!Caching.ready)
        {
            yield return null;
        }


        WWW www = WWW.LoadFromCacheOrDownload(path, 5);

        AssetBundle bundle = www.assetBundle;

        AssetBundleRequest request = bundle.LoadAssetAsync<T>(fileName);

        yield return request;

        T value = request.asset as T;

        bundle.Unload(false);

        www.Dispose();
#endif

        callback(value);

        yield return null;
    }

上記に記載致しましたLoadメソッドで、アセットバンドルのロードを行っています。
色々調べて行くと、アセットバンドルをロードする場所がローカルなのかサーバーなのかによって処理の手順が変わります。 なので今回は、#if文を使って処理を分けてあります(ただし今回は実機での検証を行っていません)。
また必ずアセットバンドルのロードが終わった後、指定したファイル形式で取得するようにしてあります。
なので、ジェネリックで取得したいクラス(ファイル形式)を設定し、第三引数にコールバック(コルーチンだとrefが使えないため)を設定しました。

参考サイト Unity - マニュアル: アセットバンドル