
アセットバンドルの概要
Tutorial
intermediate
+10XP
60 mins
Unity Technologies

アセットバンドルは、メインのゲームまたはアプリケーションとは別に保存され、実行時に読み込まれる(またはモバイルアプリやオンラインアプリの場合はダウンロードされる)コンテンツです。これにより、顧客は必要な部品のみをダウンロードしてインストールできるため、ネットワークとシステムリソースへの影響を最小化できます。アセットバンドルは、リリース後のコンテンツ更新や追加にも使用できます。このチュートリアルでは、アセットバンドルと、それがどのようにプロジェクトに最も役立つか探ります。
Languages available:
1. はじめに
Unity 2019.3 以降を使用している場合は、ここをクリックしてください。
アセットバンドルは、メインのゲームまたはアプリケーションとは別に保存され、実行時に読み込まれる(またはモバイルアプリやオンラインアプリの場合はダウンロードされる)コンテンツです。これにより、顧客は必要な部品のみをダウンロードしてインストールできるため、ネットワークとシステムリソースへの影響を最小化できます。たとえば、顧客が車両を「試乗」できるVRアプリを開発している自動車メーカーは、アプリにすべての車両を含めたくないでしょう。そうすると、ダウンロードとインストールが法外に大きくなります。アセットバンドルを使うと、ユーザーは試乗したい車両のみを、プラットフォームがハンドルできる品質レベルでダウンロードすることができます。
2. アセットバンドルの利点
アセットバンドルは、リリース後のコンテンツ更新や追加にも使用できます。これには、ダウンロード可能なコンテンツ、期間限定のプロモーションイベント、正月のような休暇に関連したモデルなどのテーマコンテンツが含まれる場合があります。また、アセットバンドルでは自動更新が可能で、プロジェクト間でコンテンツ再利用することもできます。たとえば、コネクテッドアプリケーションの場合、ロゴや紹介動画などの独自のブランドをオンラインアセットバンドルとして保存できます。ブランドが変更された場合は、サーバー上の関連するアセットバンドルを更新するだけで済みます。リモートアセットバンドルを介してそれらのアセットをロードするアプリは、アプリの更新を必要とせずに、更新されたコンテンツを自動的に表示できます。これらのグラフィックをダウンロードするアプリは、オンラインアセットバンドルの変更を確認し、必要に応じてローカルに保存されているバンドルを更新するように事前にプログラムできます。
3. バリアント
アセットバンドルはさらに複数のバリアントに分けることができます。バリアントは、アセットバンドルと一緒に保存されているオプションまたはサブクラスです。Vehicles という名前のアセットバンドルがある場合、車用とトラック用に 1 つのバリアントがあるかもしれません。バンドルされたアセットをバリアントに割り当てる場合は、そのバンドルのすべてのアセットをバリアントに割り当てる必要があります。bundlename が同じ場合、bundlename.variant にアセットを持ちながら、bundlename (バリアンとなし) に別のアセットを含めることはできません。
アセットバンドルの整理に役立つバリアント使い方の 1 つを説明するために、マルチコンソールゲームのチュートリアルレベルを作成していると仮定しましょう。次の表は、プレイヤーに押すべきボタンを示す説明で使用される可能性のあるグラフィックスの一部をリストアップしています。コントローラーのレイアウトは現代のコンソールで共通していますが、アクションボタンのラベルはプラットフォームによって異なります。この例では、アクションボタンは、ラベルが異なっていても、ゲームの両バージョンで同じアクションを実行します。コードでは、ディレクショナルグラフィックス用のユニバーサルバリアントをロードしますが、実行時に特定のシステム用にボタンまたはキーボードグラフィックを含むバリアントをロードします。
アセットバンドルコントロールイメージの内容
あるいは、クロスプラットフォームデスクトップアプリケーションにてユーザーをトレーニングするために使用するキーの画像をバンドルしているとしましょう。コンソールAとコンソールBはそれぞれWindowsとmacOSになり、TopActionButtonはCmdCtrlのようなものになる可能性があります。
4. アセットバンドルの作成
現在、アセットバンドルをビルドする唯一の方法はスクリプトを使用することです。次のスクリプトは、この機能を Unity エディターに追加します。BuildAssetBundles には、アセットバンドルを作成するディレクトリ、非標準ビルドモード用の BuildAssetBundleOption (任意)、およびアセットバンドルのビルドターゲットの 3 つのパラメーターがあります。
- Assets フォルダー内に Editor という名前のフォルダーを作成します。
- エディター内で、CreateAssetBundles という名前の新しいC#スクリプトを作成します。
- 「CreateAssetBundles」をダブルクリックして Visual Studio を開き、すべてのコンテンツを削除します。
- 以下をタイピングします。
using UnityEditor;
using System.IO;
public class CreateAssetBundles
{
[MenuItem("Assets/Build AssetBundles")]
static void BuildAllAssetBundles()
{
string assetBundleDirectory = "Assets/StreamingAssets";
if (!Directory.Exists(Application.streamingAssetsPath))
{
Directory.CreateDirectory(assetBundleDirectory);
}
BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, EditorUserBuildSettings.activeBuildTarget);
}
}
- CreateAssetBundles はこれで実装完了です。変更保存して Visual Studio を閉じます。
- Unity Editor のアセットドロップダウンの下部に新しいオプションが追加されました:Build AssetBundles
5. CreateAssetBundles パラメーター
指定されたアセットバンドルディレクトリは、アセットバンドルがビルドされる前に存在している必要があります。BuildAssetBundleOptions パラメーターは任意で、何も指定されていない場合はデフォルトで None になります。重要なオプションは次のとおりです。
6. ターゲットプラットフォームオプション
アセットバンドルの必要な形式と処理はプラットフォームによって異なるため、以下のオプションを使用してターゲットプラットフォーム特定する必要があります。
7. シンプルなアセットバンドルの作成
アセットバンドルのロードをテストするために、1 つのゲームオブジェクトでアセットバンドルを作成します。このワークフローは、前節にて CreateAssetBundles スクリプトが完了していることを前提としています。プロジェクトのフォルダ構成をアセットバンドルの構成と同様にセッティングすると、必要に応じてバンドルされたアセットを簡単に見つけて更新できます。
- スプライトを Assets フォルダーにドラッグします。
- 新しいシーンで、BundledSpriteObject という名前のゲームオブジェクトを作成します。
- Sprite Renderer コンポーネントをアタッチし、ステップ 1 で作成したスプライトを割り当てます。
- Assets の中に BundledAssets というフォルダーを作成します。
- BundledAssets の中に、testbundle というフォルダーを作成します。
- BundledSpriteObject を testbundle にドラッグし、Hierarchy から削除します。
- Project ウィンドウで BundledSpriteObject をクリックして Inspector を開きます。Inspector の下の部分に注目してください。
- BundledSpriteObject をアセットバンドルに割り当てるには、AssetBundle の横にある「None」をクリックします。(Figure 01)
- 「New」をクリックし (Figure 02) 、「testbundle」と入力して「Enter」を押します。
- 「Assets」ドロップダウンから、「Build AssetBundles」を選択します。
- バリアントにアセットを割り当てるには、ステップ1~9に従い、中央下ではなく右下隅の「None」をクリックします。
8. ローカルに保存されているアセットバンドルの読み込み
エラーが発生しなければ、ローカルストレージからアセットバンドルをロードする準備が整いました。デモンストレーションを簡単にするために、バンドルを Start メソッドでロードしています。本番環境では、必要な場合にのみアセットバンドルをロードします。
- Main Camera の transform position の X, Y 座標を 0 に設定します。
- Loader という名前の新しいゲームオブジェクトを作成します。
- BundledObjectLoader という新しい C# スクリプトを作成し、Loader にアタッチします。
- BundledObjectLoader をダブルクリックして Visual Studio で開きます。
- Update メソッドを削除します。
- 4 行目に、次のように入力します。
using System.IO;- 7 行目から、次のように入力します。
public string assetName = "BundledSpriteObject";
public string bundleName = "testbundle";- Start メソッドにて、12 行目から次のように入力します。
AssetBundle localAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, bundleName));
if (localAssetBundle == null) {
Debug.LogError(“Failed to load AssetBundle!”);
return;
}
GameObject asset = localAssetBundle.LoadAsset<GameObject>(assetName);
Instantiate(asset);
localAssetBundle.Unload(false);- 変更を保存して Unity エディターに戻ります。
- 再生ボタンを押します。
- 先ほど作成したオブジェクトはすぐにロードされるはずです。(Figure 03)
- 再生モードを終了します。
- BundledObjectLoader コンポーネントを Loader から削除します。
アセットバンドルのロードに使用されるコマンド AssetBundle.loadFromFile は同期的です。つまり、コマンドがタスクを完了するまで (アセットバンドルが完全にロードされるまで) 戻りません。この例のような小さなバンドルの場合は問題ありませんが、自動車や建築のプリビジュアライゼーションプログラムや AAA ビデオゲームで見られるような大きなバンドルの場合、フレームレートや応答性が許容できないほど低下する可能性があります。より良いオプションは LoadFromFileAsync です。これはコルーチンとして実行され、アセットバンドルがロードされている間もプロジェクトを実行し続けることができます。
- BundleLoaderAsync という新しい C# スクリプトを作成し、Loader にアタッチします。
- BundleLoaderAsync をダブルクリックして Visual Studio で開きます。
- Update メソッドを削除し、Start メソッドの戻り値の型を void から IEnumerator に変更します。
- 4 行目に、次のように入力します。
using System.IO;- 次の変数には、それぞれバンドルとアセット名を入力する必要があります。クラス定義の中に、次のように入力します。
public string bundleName = "testbundle";
public string assetName = "BundledSpriteObject";- 11 行目で、「void」を「IEnumerator」に変更します。
- Start メソッドにて、12 行目から次のように入力します。
AssetBundleCreateRequest asyncBundleRequest = AssetBundle.LoadFromFileAsync(Path.Combine(Application.streamingAssetsPath, bundleName));
yield return asyncBundleRequest;
AssetBundle localAssetBundle = asyncBundleRequest.assetBundle;
if (localAssetBundle == null) {
Debug.LogError(“Failed to load AssetBundle!”);
yield break;
}
AssetBundleRequest assetRequest = localAssetBundle.LoadAssetAsync<GameObject>(assetName);
yield return assetRequest;
GameObject prefab = assetRequest.asset as GameObject;
Instantiate(prefab);
localAssetBundle.Unload(false);- BundleLoaderAsync はこれで実装完了です。変更を保存して Unity エディターに戻ります。
- 再生ボタンを押します。
- 前と同じように、バンドルされたオブジェクトがロードされるはずです。
- 再生モードを終了し、Loader から BundleLoaderAsync を削除します。
Web からのアセットバンドルのダウンロードは、ローカルストレージから読み込むのとよく似ています。この目的のために、ファイルはローカル Webサーバーの assetbundles という名前のディレクトリ内にホストされています。
- BundleWebLoader という名前の C# スクリプトを作成し、Loader にアタッチします。
- BundleWebLoader をダブルクリックして Visual Studio で開きます。
- 4 行目に、次のように入力します。
using System;- 7 行目から、次のように入力します。
public string bundleUrl = "http://localhost/assetbundles/testbundle";
public string assetName = "BundledSpriteObject";- 11 行目で、Start メソッドの戻り値の型を「void」から「IEnumerator」に変更します。
- 12 行目から、次のように入力します。
using (WWW web = new WWW(bundleUrl))
{
yield return web;
AssetBundle remoteAssetBundle = web.assetBundle;
if (remoteAssetBundle == null) {
Debug.LogError(“Failed to download AssetBundle!”);
yield break;
}
Instantiate(remoteAssetBundle.LoadAsset(assetName));
remoteAssetBundle.Unload(false);
}- BundleWebLoader が完成しました。変更を保存して Unity エディターに戻ります。
- 再生ボタンを押します。
- Web 接続の問題がない限り、前の 2 つの例と同じ結果になるはずです。
- 再生モードを終了します。
9. 結論
アセットバンドルは、開発者、ユーザー、プレイヤーに無数の可能性を提供します。それらをうまく機能させるための新しい方法を思いつくはずです。それらをマスターすることで、より効率的で用途の広いパーソナルなエクスペリエンスをユーザーに提供できるようになります。