この記事は、2019年5月時点の技術内容です。
Unityのバージョンは、「Unity5.6.6」で検証しているため、技術的には古い内容になります。
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の作成から読み込みまでの手順は、ざっくり以下の通りになります。
- buildMapを作成する
- アセットバンドルファイルに必要なファイル類(プレファブ、テクスチャなど)を梱包する
- BuildPipeline.BuildAssetBundles関数を呼び出してアセットバンドルファイル作成
- 作成アセットバンドルファイルをサーバーに置く
- WWW.LoadFromCacheOrDownloadを呼び出してアセットバンドルを読み込む
- ファイルを指定してインスタンス化する
\IT未経験者からのサポートあり!転職サービス3選!!/
サービス名 | |||
---|---|---|---|
未経験 | 未経験OK | 未経験の転職専用 | 経験者向け |
公開の求人数 | ITエンジニア全体で1万件以上 ITエンジニア未経験で600件以上 |
未公開 | 5,000件以上 |
利用対象 | 全職種 | IT特化 | IT特化 |
特徴 | ✓誰もが知る転職サービス ✓経歴を登録しておくとオファーが来る |
✓企業担当者と条件交渉 ✓スキルの身につく企業を紹介 |
✓IT専門のエージェントが対応 ✓転職成功すると年収200万円以上の大幅アップがある |
転職サポート内容 |
|
|
|
公式サイト | リクナビネクスト | テックゲート | レバテックキャリア |