Uintyブログを見ているとAddressableAssetSystemにしれっと同期読み込みが追加されていることに気付く。
https://blogs.unity3d.com/jp/2021/04/14/find-out-whats-new-for-the-addressable-asset-system/
試してみることにした。
環境
- Unity2019.4.22f1
- Addressables 1.17.17
Addressableのインストール
環境の準備
今回はCubeのPrefabをAddressableで同期読み込みしてみる。
PrefabをクリックしAddressableにチェックを入れ、アドレスをいい感じに設定する
Cubeという名前にした
読み込み処理を書いてみる
早速読み込みのコードを書いてみる
using UnityEngine;
using UnityEngine.AddressableAssets;
/// <summary>
/// Addressableのテストクラス
/// </summary>
public class AddressableTest : MonoBehaviour
{
private void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
var cube_prefab = Addressables.LoadAssetAsync<GameObject>("Cube").WaitForCompletion();
if (cube_prefab == null) return;
Instantiate(cube_prefab, Vector3.zero, Quaternion.identity);
}
}
}
.WaitForCompletion()
をつけてやると読み込み完了まで同期で待ってくれる。
このスクリプトをMainCameraにでもくっつけて実行してみる。
Aキーを押したらPrefabがInstantiateされた。動いてそうである。
AssetReferenceにしてみる
文字列でのアドレス指定ではなくAssetReferenceでも読み込めるか一応確認してみる
using UnityEngine;
using UnityEngine.AddressableAssets;
/// <summary>
/// Addressableのテストクラス
/// </summary>
public class AddressableTest : MonoBehaviour
{
[SerializeField] private AssetReference cubeAssetReference = null;
private void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
var cube_prefab = Addressables.LoadAssetAsync<GameObject>(cubeAssetReference).WaitForCompletion();
if (cube_prefab == null) return;
Instantiate(cube_prefab, Vector3.zero, Quaternion.identity);
}
}
}
同様に動作した。特に今までのAddressableの使い方を変えずに対応できそうだ
ローカルに無いDLが必要なアセットを同期読み込みしてみる
ユーザー体験的には絶対やっちゃ駄目なのだが、DLが発生する場合のリソース読み込みを同期でできるのか、試してみた。
Downloadというグループを作りそこにCubeを移動させる
そしてBuildPathをRemoteBuildPath,LoadPathをRemoteLoadPathにする
AWSのS3にバケットを作成し、publicな状態でファイルをアップロードできるようにしておく(検証用なので雑設定)
AddressableのProfileのRemoteLoadPathをS3のファイルDLURLにしておく
そしてAssetBundleをビルドする
プロジェクト直下のServerDataフォルダにプラットフォームフォルダとアセットバンドルが生成される
最後にEditorで実行した際に実際のAssetBundleを読みに行くように設定を変更する
先程のコードのままこれで実行してみる
Aキーを押したところ1秒ほど立ってから表示された(画像じゃわからんね)
DLされてそうだ
一度実行するとキャッシュされちゃうのでキャッシュ削除処理をStartに追加して何度か試してみる
private void Start()
{
Addressables.ClearDependencyCacheAsync("Cube");
}
押す度に時間がかかるようになってるので再DLされてそうだ。
最後にS3からデータを消して落とせなくしてみる
バッチリ例外が出まくってる。これで今まで確実にDLしてたのが明らかになった。
DLする必要があってもちゃんと同期読み込みが可能であった。
UX的には不親切極まりないので非推奨だが覚えておいて損は無さそうだ。
まとめ
Addressableは出た当初、非同期読み込みが一切できないという事が発覚しフォーラムが大変盛り上がっていたがUnity側も理解してくれてちゃんと同期APIが提供されたのは嬉しい限り。
起動時に設定ファイルを読み込む、みたいなユースケースだと非同期だと気にする範囲が多く、どうしても使いにくさを感じていたがこれにより解消された感がある。
今回のアップデートでAddressableがいよいよ実用的になったと感じる。
Resources.Loadをプロジェクトから完全に撲滅できるという人も多そうである。