【Unity】Addressable Asset System 公式マニュアルの和訳 Part3

これはゲーム開発エンジン Unity に関する記事です。
この記事は、
https://docs.unity3d.com/Packages/com.unity.addressables@1.1/manual/AddressableAssetsGettingStarted.html
に書かれている内容を日本語に翻訳したものです。

2021/01/07
非同期命令の説明に Assembly Definition ファイルについての補足を追加。

※この記事では、Addressable Asset System をAASと省略して書きます。

アドレッサブル・アセット・パッケージのインストール

重要
AASを使うには Unity 本体のバージョンが 2018.3 以上である必要があります。

パッケージのインストール方法は、パッケージ・マネージャーのドキュメント(英語)を参照してください。

アドレッサブル・アセットの準備
アセットを「アドレッサブル」としてマーキングする

Unity エディタでは、2つの方法でアセットをアドレッサブルに指定できます。

  • オブジェクトのインスペクターで
  • Addressables ウィンドウ」で
インスペクターを使用

プロジェクトウィンドウでインスペクターに表示したいオブジェクトを選択します。
インスペクターで Address チェックボックスをクリックして、アセットを識別するための名前を入力します。

アドレッサブル・ウィンドウを使用

Window > Asset Management > Addressables の順に選択して、Addressables(アドレッサブルズ)ウィンドウを開きます。
次にプロジェクトウィンドウから Addressables ウィンドウ内のアセット・グループ(~Group と書かれている)のひとつにアセットをドラッグします。

アドレスを指定

デフォルトのアドレスはプロジェクト内にあるアセットのパスになります(例えば、Assets/images/myImage.png)。
Addressables ウィンドウでアセットのアドレスを変更するには、アセットを右クリックして Rename(名前変更)を選びます。

アドレッサブル・アセットを初めて使う場合、AASはプロジェクト内にエディタ用とランタイム用データアセットを Assets/AddressableAssetsData ファイルに保存します。
このファイルをお使いのバージョン管理システムにチェックイン(管理対象に追加)してください。

アドレッサブル・アセットをビルド

AASはアプリケーションをビルドする前に、実行中のゲームが使用できる形式のファイルにアドレッサブル・アセットをビルドする必要があります。これは手動で行います。アドレッサブル・アセットのビルドは Unity エディタ上からでも行えますし、API を使っても行えます。

  • Unity エディタでアドレッサブル・アセットをビルドするには、Addressables ウィンドウを開き、Build > Build Player Content を選びます。
  • API を使ってアドレッサブル・アセットをビルドするには、AddressableAssetSettings.BuildPlayerContent() を使います。
補足
アドレッサブル・アセットのビルドと、アプリケーションのビルドは別物です。
なので、アドレッサブル・アセットをビルドした後に、アプリケーションのビルドをする必要があります。
アドレッサブル・アセットを使う
アドレスを使ってローディングやインスタンス化

実行時にアドレッサブル・アセットをロードしたりインスタンス化できます。
アセットのローディングでは、メモリから全ての依存関係にある他のアセット(当てはまればアセットバンドルのデータも含む)をロードし、必要なときに必要なアセットを使うことができます。それによってシーン内にアセットが配置されるわけではありません。シーンにアセットを追加するには、インスタンス化しなければいけません。アドレッサブルのインスタンス化インターフェースを使うことでアセットがロードされ、直ちにシーンに追加されます。

ゲームスクリプトで文字のアドレスを使ってアセットにアクセスするには、UnityEngine.AddressableAssets 名前空間を定義し(スクリプトの冒頭に using UnityEngine.AddressableAssets; と書く)、以下のメソッドを呼び出します。

Addressables.LoadAssetAsync(“アセットのアドレス”);

このようにアドレスを指定してアセットをロードします。

Addressables.InstantiateAsync(“アセットのアドレス”);

このようにアドレスを指定してアセットをインスタンス化し、シーンに追加します。

注意
上記の LoadAssetAsyncInstantiateAsync は、非同期命令です。ロード終了時にコールバックさせることもできます(詳しくは Async operation handling を参照)。

using System.Collections;
using System.Collections.Generic;
using UnityEngine.AddressableAssets;
using UnityEngine;

public class AddressablesExample : MonoBehaviour {

	GameObject myGameObject;

	void Awake()
	{
		Addressables.LoadAssetAsync<GameObject>("AssetAddress").Completed += OnLoadDone;
	}

	private void OnLoadDone(UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle<GameObject> obj)
	{
		// In a production environment, you should add exception handling to catch scenarios such as a null result.
		myGameObject = obj.Result;
	}
}
サブアセットとコンポーネント

サブアセットとコンポーネントはアセットのローディングでは特殊なケースです。

  • コンポーネント
    ゲームオブジェクトのコンポーネントを直接ロードすることはできません。ゲームオブジェクトをロードするかインスタンス化してから、コンポーネントの参照を取得しなければいけません。
  • サブアセット
    AASはサブアセットのローディングをサポートしていますが、特殊な方法を使う必要があります。例えば、スプライトシート内にあるスプライトを持つサブアセットや、FBX ファイル内にあるアニメーションクリップなどのことです。そういったものをロードするには、以下の方法を使います。

Addressables.LoadAssetAsync<IList<Sprite>>(“MySpriteSheetAddress”);

AssetReference クラスの使用

AssetReference クラスは、アドレスが分からなくてもアドレッサブル・アセットにアクセスできるようにします。以下の手順で AssetReference クラスを使ってアドレッサブル・アセットにアクセスします。

  1. シーンのヒエラルキーか、プロジェクトウィンドウにあるゲームオブジェクトを選択。
  2. インスペクターで Add Component ボタンをクリック。シリアライズ可能なコンポーネント(例えば、ゲームスクリプト、ScriptableObject、その他シリアライズ可能なクラス)は AssetReference 変数をサポートします。
  3. public な AssetReference 変数をコンポーネントに追加(例、public AssetReference explosion;)。
  4. インスペクターで、オブジェクトとリンクしているアドレッサブル・アセットを選択、または、プロジェクトウィンドウから public な AssetReference フィールドにいずれかのアセットをドラッグ、または、
    プロジェクトで既に定義しているアドレッサブル・アセットをドロップダウンリストから選択(下図参照)。

AssetReference アセットをロードまたはインスタンス化するには、以下のメソッドを呼び出します。


AssetRefMember.LoadAssetAsync<GameObject>();
または

AssetRefMember.InstantiateAsync(pos, rot);

注意
通常のアドレッサブル・アセットのように、LoadAssetAsyncInstantiateAsync は非同期命令です。ロード終了時にコールバックさせることもできます(詳しくは Async operation handling を参照)。

ビルドで気を付けること
StreamingAssets(ストリーミングアセット)にあるローカルデータ

AASには、実行時にどのようにロードするかを知るためのファイルが必要です。そのファイルはアドレッサブル・アセットをビルドするときに生成され、ビルド内の全てのファイルを含む Unity の特別なフォルダである StreamingAssets フォルダに格納されます。アドレッサブル・アセットをビルドする際、AASはライブラリ内から必要なものをコピーします。そのあとに、アプリケーションのビルドでAASは必要なファイルを StreamingAssets にコピーし、ビルドを行い、そのフォルダからコピーしたファイルを削除します。この仕組みによって、関連するデータのみを各ビルドに含めながら、複数のプラットフォームのデータをビルドできます。

ローカルで使用するために、アドレッサブル固有のデータを追加してビルドしたグループは、プラットフォーム固有の場所に配置されているライブラリでも使用します。これが機能することを確認するには、
[UnityEngine.AddressableAssets.Addressables.BuildPath] および {UnityEngine.AddressableAssets.Addressables.RuntimePath} で始まるプロファイル変数にビルドパスとロードパスをそれぞれ設定します。これらの設定は AddressableAssetSettings インスペクターで指定できます(デフォルトではプロジェクトの Assets/AddressableAssetsData フォルダに設定されています)。

事前ダウンロード

Addressables.DownloadDependenciesAsync() メソッドを呼ぶことで特定のアドレスやラベルを使った依存関係にあるアセットをロードできます。通常これはアセットバンドルです(???)。

AsyncOperationHandle 構造体はダウンロード状況を表示する目的で使うことができる PercentComplete アトリビュートを含めた呼び出しによって返されます。コンテンツがロードされるまで待つアプリで使用することもできます。

ダウンロード前にユーザーに同意を求める場合は、Addressables.GetDownloadSize() を使えば、特定のアドレスまたはラベルからコンテンツをダウンロードするために必要なスペースを調べることができます。
これは、Unityのアセットバンドルキャッシュにまだ残っている、以前ダウンロードしたバンドルのアカウントを考慮することに注意してください。
(※訳は合っていると思いますが、内容が意味不明です。)

アプリのアセットを事前にダウンロードしておくと便利な場合もありますが、ダウンロードしないように選択する場合もあります。

例えば:

  • アプリが大量のオンライン・コンテンツを持っていて、ユーザーがその中の一部しか利用しないと予想される場合。
  • オンライン接続しないと使えないアプリがある。所有している全アプリのコンテンツが小規模なバンドルの中にあり、必要に応じてコンテンツをダウンロードするかどうかを選ぶ場合。

コンテンツがロードされるまで待機するためにパーセント完了値を使用する代わりに、事前ロード機能を使用して、ダウンロードが開始されたことを示してから続行できます。この実装では、アセットが必要な時間までにロードを完了していないアセットのインスタンスを処理するために、ロードまたは待機画面が必要になります。

マルチプラットフォーム用ビルド

AASはアドレッサブル・アセットを含むアセットバンドルを生成します。アセットバンドルはプラットフォーム依存ですので、サポート予定のプラットフォーム毎にビルドし直さなければいけません。

デフォルトでは、アドレッサブルなアプリデータをビルドする際、アドレッサブル・アセットのビルドパスで指定されたフォルダの直下にプラットフォーム毎のデータが保存されます。実行時に使用するパスはそれらのプラットフォームのフォルダと見なされ、適切なアプリデータを指し示します。

注意
Unity エディタのプレイモードで、Addressables(アドレッサブルズ)の BuildScriptPackedPlayMode スクリプトを使用する場合、Addressables は現在の有効なビルドターゲット用データをロードしようとします。そのため、現在のビルドターゲット用データが現在の Unity エディタで選択しているプラットフォームと互換性がない場合、問題が発生する可能性があります。詳細は Play mode scripts 参照。

まとめ

日本語に翻訳しても意味が分からないw

「【Unity】Addressable Asset System 公式マニュアルの和訳 Part3」への2件のフィードバック

  1. 1か月前にはヒットしなかったけど埋もれてるホームページはたくさんあるんですねぇ。
    このページに早く出会ってれば、、、、

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です