Unity開発・AssetBundleを作成して読み込む簡単なサンプル

 

UnityのAssetBundleの使い方をざっくり解説しますね

 

UnityのAssetBundleが使えると、リソースの一部をサーバーなどの外部ストレージに置いたりすることにより(アプリ申請時)IOS,Androidアプリの容量を減らすことができたり、

必要なタイミングでテクスチャを読み込んだりしてメモリ管理をすることができます。

 

特に、IOSについてはアプリ容量が150Mを超えてしまうとwifiでしかダウンロードができなくなるため、アプリをインストールしてくれるユーザが減ってしまいます。

AssetBundleの技術は、スマホのアプリを作る上で必須の技術と言えます。

 

この記事では、AssetBundleの作成および読み込みについてサンプルを交えて解説します。

 

アセットバンドルを使ったメモリ管理は、以下の記事が参考になります。

 

 

サンプルソースの全体は、GitHubにあるので必要があれば参考にしてください!

https://github.com/jshirius/unity-AssetBundleSample

 

 

AssetBundleを作成して読み込んで見る

 

■開発環境

Unity5.6.6

 

 

リソースに関する説明

 

■テクスチャ(画像)

以下の画像(テクスチャ)用意する

・image1(3Mほど)

 

 

■プレファブ

以下の1つのプレファブを用意します。

 

PrefabA

・image1テクスチャを使用

 

 

AssetBundleを作成する

 

 

AssetBundleは、依存関係を自動的に解決してくれます。

今回の例では、PrefabAにimage1テクスチャを使っています(依存関係)が、アセットバンドル作成時、image1も梱包してくれるのです。

 

 

 

アセットバンドルを作成する

■概要

PrefabAのみを指定してアセットバンドル「prefab_bundle_prefabA_only」を作ります。

その結果、prefab_bundle_prefabA_onlyには、

・PrefabA

・PrefabAの依存関係にあるimage1

が梱包されます。

 

■手順

 

(1)ソースコードを作成する

以下のようなソースコードを作成しEditorフォルダの下に設置します。

 

Gitの例では、以下の場所にソースコードを作成しています。

Assets -> Editor -> BuildAssetBundlesExample.cs

 


	//AssetBundleにprefabA(image1.pngを参照)だけ含めるケース
	[MenuItem("Example/Build  prefab_bundle_prefabA_only")]
	static void PrefabBundlePrefabAOnly()
	{
		// Create the array of bundle build details.
		AssetBundleBuild[] buildMap = new AssetBundleBuild[1];


		buildMap[0].assetBundleName = "prefab_bundle_prefab_A_only";
		string[] prefabAssets = new string[1];
		prefabAssets[0] = "Assets/AssetBundle/PrefabAssets/PrefabA.prefab";
		buildMap[0].assetNames = prefabAssets;

		//この場合、アセットバンドルprefab_bundle_prefab_A_onlyには、prefabA,image1.pngが追加される

		BuildPipeline.BuildAssetBundles("Assets/ABs", buildMap, BuildAssetBundleOptions.None, BuildTarget.iOS);	
	}

 

このソースコードでは、PrefabAおよびPrefabAの依存関係にあるimage1をアセットバンドルに梱包しています。

 

(2)メニューからアセットバンドル作成の実行

 

メニューから選択してアセットバンドルファイルを作成します。

 

GitHubの例では、メニューから以下のように選択してアセットバンドルを作成します。

Example -> Build prefab_bundle_prefabA_only

 

 

(3)作成されたアセットバンドルファイルをサーバーに置く

(2)で作成されたアセットバンドルファイルは「Assets/ABs」に書き出されます。

一式をサーバーに置きます。

 

 

アセットバンドルを読み込む

 

 

■手順

(1)アセットバンドルファイルをダウンロードする

 

WWW.LoadFromCacheOrDownload(url)を呼び出してサーバに置いたアセットバンドルファイルをダウンロードします。

なお、一度ダウンロードするとキャッシュ化され、次回、同じ処理が呼び出されたときは、サーバにアクセスせずに端末に保存(キャッシュ化された)したデータから読み込まれます。

 

(2)アセットバンドルファイルから詰め込んだデータファイルを読み込む

 

ダウンロード後、アセットバンドルファイルから詰め込んだデータファイルを読み込み、

インスタンス化します。

 


	IEnumerator LoadPrefabBundlePrefabAOnly(){
		Debug.Log("LoadPrefabBundlePrefabAOnly begin");


		using (var www = WWW.LoadFromCacheOrDownload("http://localhost/assetbundles/prefab_bundle_prefab_a_only", 5))
		{
			yield return www;
			if (!string.IsNullOrEmpty(www.error))
			{
				Debug.Log(www.error);
				yield return null;
			}

			//Debug.Log(String.format "LoadFromCacheOrDownload {0}" , www.assetBundle.ToString());


			var myLoadedAssetBundle = www.assetBundle;

			Debug.Log("LoadFromCacheOrDownload OK");

			foreach (string s in myLoadedAssetBundle.GetAllAssetNames()) {
				Debug.Log(s);
			}


			//アセットバンドルデータ
			//prefabAsset = myLoadedAssetBundle;

			AssetBundleRequest assetdata = myLoadedAssetBundle.LoadAssetAsync("PrefabA");
			GameObject obj = (GameObject)Instantiate( assetdata.asset );
			obj.transform.SetParent(Canvas.gameObject.transform, false);


		}
	}

 

 

■このときメモリに展開されるものは?

prefab_bundle_prefabA_onlyを展開してPrefabAを読み込んだときは、

メモリーに以下のデータが展開されます。

・PrefabA

・PrefabAの依存関係にあるimage1

 

 

以上が、AssetBundleを作成方法、および読み方法です。

 

 

まとめ

 

まとめます。

AssetBundleの作成から読み込みまでの手順は、ざっくり以下の通りになります!

 

 

まとめ

  1. buildMapを作成する
  2. アセットバンドルファイルに必要なファイル類(プレファブ、テクスチャなど)を梱包する
  3. BuildPipeline.BuildAssetBundles関数を呼び出してアセットバンドルファイル作成
  4. 作成アセットバンドルファイルをサーバーに置く
  5. WWW.LoadFromCacheOrDownloadを呼び出してアセットバンドルを読み込む
  6. ファイルを指定してインスタンス化する

 

 

最新情報をチェックしよう!
>プログラミングスクール検索・比較表サイト

プログラミングスクール検索・比較表サイト

ワンクリック、さらに詳細に条件を指定してプログラミングスクールの検索ができます。さらに比較表により特徴を細かく比較できる!

CTR IMG