90
81

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

qnoteAdvent Calendar 2015

Day 16

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

Last updated at Posted at 2015-12-15

こちらは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でそこそこの規模のゲームを作る場合は必ず使うことになるかと思います。
制御は意外と簡単ですので、ぜひチャレンジしてみてください。

90
81
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
90
81

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?