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

この記事は、2019年5月時点の技術内容です。
Unityのバージョンは、「Unity5.6.6」で検証しているため、技術的には古い内容になります。

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フォルダの下に設置します。


	//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);	
	}

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

Assets -> Editor -> BuildAssetBundlesExample.cs

 

上記のソースコードでは、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. ファイルを指定してインスタンス化する

 

\IT未経験者からのサポートあり!転職サービス3選!!/

サービス名
未経験 未経験OK 未経験の転職専用 経験者向け
公開の求人数 ITエンジニア全体で1万件以上
ITエンジニア未経験で600件以上
未公開 5,000件以上
利用対象 全職種 IT特化 IT特化
特徴 ✓誰もが知る転職サービス
✓経歴を登録しておくとオファーが来る
✓企業担当者と条件交渉
✓スキルの身につく企業を紹介
✓IT専門のエージェントが対応
✓転職成功すると年収200万円以上の大幅アップがある
転職サポート内容
  • 求人検索
  • 企業担当者と交渉
  • 求人紹介
  • ライフプランのサポート
  • キャリア相談
  • 求人紹介
  • 提出書類の添削
  • 面接対策
公式サイト リクナビネクスト テックゲート レバテックキャリア
最新情報をチェックしよう!