7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Unity] AddressableAssetSystemの同期読み込み(Synchronous Addressables API)を試す

Last updated at Posted at 2021-04-27

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のインストール

いつもどおりPackageManagerから
image.png

環境の準備

今回はCubeのPrefabをAddressableで同期読み込みしてみる。
image.png

PrefabをクリックしAddressableにチェックを入れ、アドレスをいい感じに設定する
image.png
Cubeという名前にした
image.png

Groupウィンドウにも登録されているのを一応確認しておく
image.png

読み込み処理を書いてみる

早速読み込みのコードを書いてみる

AddressableTest.cs
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にでもくっつけて実行してみる。

image.png

Aキーを押したらPrefabがInstantiateされた。動いてそうである。

AssetReferenceにしてみる

文字列でのアドレス指定ではなくAssetReferenceでも読み込めるか一応確認してみる

AddressableTest.cs

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

InspectorからCubeを指定し読み込ませてみる
image.png

同様に動作した。特に今までのAddressableの使い方を変えずに対応できそうだ
image.png

ローカルに無いDLが必要なアセットを同期読み込みしてみる

ユーザー体験的には絶対やっちゃ駄目なのだが、DLが発生する場合のリソース読み込みを同期でできるのか、試してみた。

Downloadというグループを作りそこにCubeを移動させる
image.png

そしてBuildPathをRemoteBuildPath,LoadPathをRemoteLoadPathにする
image.png

AWSのS3にバケットを作成し、publicな状態でファイルをアップロードできるようにしておく(検証用なので雑設定)

AddressableのProfileのRemoteLoadPathをS3のファイルDLURLにしておく
スクリーンショット_2021_04_28_2_15.png
そしてAssetBundleをビルドする
image.png
プロジェクト直下のServerDataフォルダにプラットフォームフォルダとアセットバンドルが生成される
image.png

このプラットフォームフォルダごとS3にアップロードする
image.png

最後にEditorで実行した際に実際のAssetBundleを読みに行くように設定を変更する
image.png

先程のコードのままこれで実行してみる
Aキーを押したところ1秒ほど立ってから表示された(画像じゃわからんね)
DLされてそうだ
image.png

一度実行するとキャッシュされちゃうのでキャッシュ削除処理をStartに追加して何度か試してみる

AddressableTest.cs
    private void Start()
    {
        Addressables.ClearDependencyCacheAsync("Cube");
    }

押す度に時間がかかるようになってるので再DLされてそうだ。

最後にS3からデータを消して落とせなくしてみる
image.png
バッチリ例外が出まくってる。これで今まで確実にDLしてたのが明らかになった。
SampleScene_-aas_test-PC__Mac___Linux_Standalone-Unity_2019_4_22f1_Personal__Personal___Metal__と_aas_test–_AddressableTest_cs.png

DLする必要があってもちゃんと同期読み込みが可能であった。
UX的には不親切極まりないので非推奨だが覚えておいて損は無さそうだ。

まとめ

Addressableは出た当初、非同期読み込みが一切できないという事が発覚しフォーラムが大変盛り上がっていたがUnity側も理解してくれてちゃんと同期APIが提供されたのは嬉しい限り。
起動時に設定ファイルを読み込む、みたいなユースケースだと非同期だと気にする範囲が多く、どうしても使いにくさを感じていたがこれにより解消された感がある。

今回のアップデートでAddressableがいよいよ実用的になったと感じる。
Resources.Loadをプロジェクトから完全に撲滅できるという人も多そうである。

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?