AddressableAssetの導入方法について

お疲れ様です。開発のIです。

Unity2020を使用してアプリ開発/運営を行っていますが、現在関わっているプロジェクトではアセットの管理を全てAddressableAssetで行っています。

今回は復習も兼ねてAddressableAssetの導入方法をまとめました。

AddressableAssetSystemとは

特徴

  • Unity2019LTS以降でサポートされているアセット管理システム
  • 従来のアセットバンドルシステムでは自分で実装する必要があったファイル管理の仕組みや実装が用意されている
  • アセットバンドル同様、アプリのバイナリにデータを含めずサーバからダウンロードして読み込めるため、追加コンテンツ配信が可能になる
  • Sprite、PrefabなどのUnityのアセットにアドレスを登録し、Resources以下のフォルダにかかわらず、アドレスを使用してアセットをロードすることができる
  • Unity上のローカルアセット、サーバのリモートアセットのロードが呼び出し側は気にせず実装することができる

 

今回の記事では、Unityからアセットビルド前の生データのロード、ローカルアセットのロード、リモートアセット(ローカルサーバ)のロードを試します。

 

<<ローカルアセット>>

アプリビルド時にapkやipaなどのアプリの実行ファイルに含まれるデータ

 

<<リモートアセット>>

アセットビルドデータをサーバなどに配置して実行時にダウンロードして使用するデータ

として記載しています。

導入方法

今回は2021.3.3f1で新しいプロジェクトを作成してテストしています。

プロジェクトにインストール

PackageManager > Addressablesを選択してインポートします。

Window > Asset Management > Addressables > Group を表示

「Create Addressables Settings」をクリックで Assets > AddressableAssetsData 以下に設定ファイルが生成されます。

 

アセットデータ作成

アセットにしたい適当なPrefabを作成します。

 

Addressables Group 上で右クリックし、Create New Group > Packed Assets を選択して新しいグループを作ります。

 

新しく作ったグループにアセットにしたいprefabをドラッグ&ドロップして登録します。

 

登録されたkey `Assets/Asset/SpriteAsset.prefab` でGameプレイ中にロードできるようになります。

ロードするスクリプトの実装

Startでロードするスクリプトを実装して、コンポーネントとしてアタッチします。

今回2DのPrefabをAddressableにしたので、Canvasにアタッチしました。

 

private AsyncOperationHandle<GameObject> handle;
    
    // Start is called before the first frame update
    async Task Start()
    {
        handle = Addressables.LoadAssetAsync<GameObject>("Assets/Asset/SpriteAsset.prefab");
        await handle.Task;

        if (handle.Status == AsyncOperationStatus.Succeeded)
        {
            var o1 = Instantiate(handle.Result, transform);
        }
    }
    
    private void OnDestroy()
    {
        if (handle.IsValid())
            Addressables.Release(handle);
    }

Editorで実行するとPrefabがロードされてInstantinateされるのが確認できます。

これでアセットをビルドしていない状態で、単純なロードが確認できました。

ローカルのロードテスト

Addressables Groupのメニューから PlayModeScript のドロップダウンを選択して 「Use Existing Build」 を選択します。

 

PlayModeScriptはAddressableのロード方法を変更します。

Use Asset DatabaseとSimulate Groupsは動作確認と修正を素早く繰り返せるモードで、

アセットバンドルを作成しなくても確認することができます。

Editorでしか動作することができません。

 

Use Existing Buildは実際の動作を再現するモードで、ローカル/リモートのアセットからロードを行います。

実機同様の動作を確認する時に使います。Editor、実機で確認することができます。

 

Asset1.assetの設定をInspectorで確認し、Build&LocalPathsが「Local」になっていることを確認します。

 

GroupウィンドウのNew Build > Default Build Script を実行し、アセットバンドルデータを生成します。

 

ローカルのビルドはLibrary/com.unity.addressables/ 以下に出力されます。

一緒にビルドされているcatalog.jsonはアセットの依存関係が記載されているデータです。

 

Editorを実行すると画面にロードされることが確認できます。

リモート(ローカルサーバー)アセットのロード

Remoteで読み込むための適当なアセットを作成します。

 

「Asset2」グループを追加してリモートからロードするアセットにします。

Addressables Group ウィンドウでCreate New Group > Packed Assets からAsset2グループを作成します。

 

Asset2.assetの「Build & Load Paths」を「Local」から「Remote」に変更します。

 

Assetグループを追加したので、もう一度GroupウィンドウのNew Build > Default Build Script を実行します。

今回はリモートデータなので、プロジェクト直下のServerData/[BuildTarget]に生成されます。

ローカルサーバの設定を行う

Window > Asset Management > Addressables > Hosting を開き、Create > Local Hosting 選択でローカルサーバーを作成します。

 

「Enable」にチェックを入れて有効にするとポートが割り当てられます。

Window > Asset Management > Addressables > Profile ウィンドウを表示

ここでリモートの接続先や、ローカルのどのフォルダからロードするか設定します。

Editor Hostingでローカルサーバーを使用する場合自動的にパラメータが入力されます。

 

追加で作成したリモートアセットをロードする処理をStart()に追加します。

 

handle = Addressables.LoadAssetAsync<GameObject>("Assets/Asset/RemoteAsset.prefab");
        await handle.Task;

        if (handle.Status == AsyncOperationStatus.Succeeded)
        {
            var o1 = Instantiate(handle.Result, transform);
        }
    }

Editorを実行すると、オレンジの四角と青い四角が並んで表示されます。

 

これでUnityのビルド前のデータロード、リモート、ローカルのアセットロードをテストすることができました。

まとめ

AddressableAssetSystemを使うと、ローカルアセットにするのか、サーバーからダウンロードするアセットにするのか、容易に設定してテストすることができました。

サーバからのダウンロードもローカルサーバの設定がUnityEditor上で完結するため気軽に試せることが確認できます。

この記事がAddressableAssetSystemを触る方のきっかけになると幸いです。

 

 


 

ココネでは一緒に働く仲間を募集中です。

ご興味のある方は、ぜひこちらの採用特設サイトをご覧ください。

https://www.cocone.co.jp/recruit/contents/

Category

Tag

%d