AssetBundleManagerでのローディング


AssetBundleを扱うときに、AssetBundleManagerを使うといままで以上に便利に扱えるんだけど、ローディング周りについてはとくに実装には含まれていないので自分なりにやらないといけないっぽい。
これでいいのかわからないけど、自分はこんな感じで実装しました。

まずはAssetBundleManager.csの

public static Dictionary<string, WWW> m_DownloadingWWWs = new Dictionary<string, WWW> ();

この変数がもともとはprivateなので、publicとして宣言。
アセットバンドルは自分の指定で複数に分けることができるので、読み込みたいアセットバンドルに含まれているファイルを1つずつ読み込ませる。
依存性があれば別のアセットバンドルも勝手に読み込まれるはず。
読み込ませた上で、下記のようにpublicにしたm_DownloadingWWWsのそれぞれのローディング具合を見てトータルのローディングを取得。

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using AssetBundles;

public class ABTest : MonoBehaviour {
	/// <summary>
	/// Image.
	/// </summary>
	[SerializeField]
	Image image;

	/// <summary>
	/// ロードを開始したかどうか。
	/// </summary>
	bool loadingStart = false;

	/// <summary>
	/// Start.
	/// </summary>
	IEnumerator Start() {
		AssetBundleManager.BaseDownloadingURL = "http://アセットバンドルのベースとなるURL/";

		#if DEVELOPMENT_BUILD || UNITY_EDITOR
		AssetBundleManager.SetDevelopmentAssetBundleServer();
		#else
		AssetBundleManager.SetSourceAssetBundleURL(ResourcesManager.AssetBundleBaseURL);
		#endif

		AssetBundleLoadManifestOperation request = AssetBundleManager.Initialize();

		if (request == null) {
			Debug.LogWarning("AssetBundleManager initialize failed.");
			yield break;
		}

		yield return StartCoroutine(request);

		StartCoroutine(LoadImageFromAssetBundles("images", "img01"));
		StartCoroutine(LoadImageFromAssetBundles("images2", "img01"));

		this.loadingStart = true;
	}

	/// <summary>
	/// Update.
	/// </summary>
	void Update() {
		if (this.loadingStart && AssetBundleManager.m_DownloadingWWWs.Values.Count > 0) {
			float progress = 0f;
			foreach (WWW www in AssetBundleManager.m_DownloadingWWWs.Values) {
				progress += www.progress;
			}

			print("Loading : " + progress / AssetBundleManager.m_DownloadingWWWs.Values.Count);
		}
	}

	/// <summary>
	/// Texture2Dとして、アセットを読み込む。
	/// </summary>
	IEnumerator LoadImageFromAssetBundles(string assetBundleName, string assetName) {
		AssetBundleLoadAssetOperation request = AssetBundleManager.LoadAssetAsync(assetBundleName, assetName, typeof(Texture2D));
		if (request == null)
			Debug.LogWarning("There is no asset with name \"" + assetName + "\" in " + assetBundleName + ".");
		
		yield return StartCoroutine(request);

		Texture2D texture = request.GetAsset<Texture2D>();
		Sprite sprite = Sprite.Create (texture, new Rect (0f, 0f, texture.width, texture.height), Vector2.zero);
		this.image.sprite = sprite;
		this.image.SetNativeSize();
	}
}

AssetBundleManagerを使う側でローディングしましたが、AssetBundleManager自体を拡張してもよさそう。
ただあまりアセットバンドルを分けたり、アセットバンドル読み込み時に別の読み込みを行っていたりするとhttpリクエストの最大に達してしまいローディングの値が増えたり減ったりすると思われるので注意が必要ですね。

コメントを残す