この記事はTCU-CTRL場外乱闘 Advent Calendar 2017 12日目の記事です
#環境
- Unity2017
- AssetBundleManager
#はじめに
ゲーム開発においてキャラクターの台詞や、敵のパラメーターなどを全てソースコード内に記述することは後の変更が難しくなるため、テキストファイルとして保存しておき読み込む方法がよくあるパターンです。
Unityにおいてもそのパターンは当てはまります。しかし、Unityのファイル読み込みでググるとResourcesフォルダを使った方法が多く出てきます。
Resourcesフォルダを用いたファイル読み込みはシンプルですが、アプリの起動時間やビルド時間が伸びたりコンテンツの更新が難しくなるなどの理由から公式チュートリアルでは推奨されていません。
その為今回はAssetBundleからTextファイルを読み込む方法を検証します。
#AssetBundleManagerの準備
AssetStoreからAssetBundleManagerをインポートします
インポートが終了したら、Assets->AssetBundlesからSimulation Modeがオンになっていることを確認します
#AssetBundleの用意
読み込むためのAssetBundleを用意します。
今回はTestData.txtを作成しました。
適当なTextファイルを作り、右下に有るAssetLabelからAssetBundleNameを設定します。
今回は新しくtest/data
というAssetBundleNameを作成し設定しました。
#AssetBundleのビルド
AsettBundleNameを設定したら、Assets->AssetBundlesからBuildAssetBundlesを選択してビルドを行います。
これでAssetBundleが生成されました。
#AssetBundleManagerをシングルトンにする
AssetBundleManagerによるファイルの読み込みはゲーム内の様々な場所で行われるのでシングルトンにしておくと楽ができます。
テラシュールブログさん(Unityで少しだけ高速なシングルトン)のシングルトンをもらってきて継承し、ファイルを読み込むためのメソッドを持つクラスを作ります。
LoadASync<T>(string assetBundleName, string assetName, Action<T> callback)
のassetBundleNameは2つ前の節で付けた名前、assetNameはファイルの名前になります。
このクラスをシーン上の適当なGameObjectにアタッチしておきます。
public class AssetBundleManagerSingleton : SingletonMonoBehaviour<AssetBundleManagerSingleton>
{
IEnumerator Start()
{
yield return StartCoroutine(Init());
}
IEnumerator Init()
{
var request = AssetBundles.AssetBundleManager.Initialize();
if (request != null)
yield return StartCoroutine(request);
}
/// <summary>
/// 非同期でAssetBundleからAssetを読み込む
/// </summary>
public void LoadASync<T>(string assetBundleName, string assetName, Action<T> callback)
where T : UnityEngine.Object
{
StartCoroutine(LoadASyncAssetBundle<T>(assetBundleName, assetName, callback));
}
IEnumerator LoadASyncAssetBundle<T>(string assetBundleName, string assetName, Action<T> callback)
where T : UnityEngine.Object
{
var request = AssetBundles.AssetBundleManager.LoadAssetAsync(assetBundleName, assetName, typeof(T));
if (request == null)
yield break;
yield return StartCoroutine(request);
T asset = request.GetAsset<T>();
callback(asset);
}
}
#Textファイルを読み込んで表示する
Textファイルの読み込みを開始するためのButtonと、読み込んだテキストを表示するためのTextをシーンに配置します。
そして以下のようなクラスを作成して、Buttonにアタッチします。
LoadASyncは非同期でAssetBundleを読み込むので、読み込んだデータの受取はコールバックで行います。
public class main : MonoBehaviour
{
[SerializeField] Button readButton;
[SerializeField] Text text;
private void Start()
{
readButton.onClick.AddListener(() => Onclick());
}
void Onclick()
{
AssetBundleManagerSingleton.Instance.LoadASync<TextAsset>("test/data", "TestData", (textAsset) =>
{
text.text = textAsset.text;
});
}
}
#結果
しっかりとAssetBundleからジュースハゲコピペが読み込まれているのが確認できます。
#感想
今回はAssetBundleからTextファイルを読み込む方法を検証しました。
実はAssetBundleのことをまともに調べたのは今回が初めてで、結果としてTextファイルの読み込みには成功しましたが、正直まだよくわかってないことが多いのでこれからも好きあらば調べていきたいところです。
てか公式のAssetBundleManager情報がこれしか見つからなかったので結構辛い。リファレンスどこ????
次回はまくらんく君(@cap_pepsi)です。よろしくお願いします