はじめに
今回はAddressable Asset System
の基礎的な使い方を知る目的のため、ローカルにAddressable Assets
からアセットバンドルをビルドして利用してみたいと思います。
概要
Addressable Asset System
とはアドレスを用いてアセット(例. プレハブ、テクスチャ、マテリアル、オーディオクリップ、アニメーション)を簡単にロードできる機能になります。
The Addressable Asset System provides an easy way to load assets by “address”. It handles asset management overhead by simplifying content pack creation and deployment.
環境
Unity 2020.3.18f1
Addressable 1.18.19
インストール
PackageManager
によりインストールを行います。
※ Unity 2018.2 or later
Addressable Assetとしてマークをする
Addressable Asset
としてマークをつけると、Addressable Asset System
を用いて、まさにResources
フォルダに入っているアセットをResources.Load
を読み込むように、どこからでも呼び出せるようになります。
このAddressable Asset
としてマークをつける手法は以下の二つがあります。
対象アセットのインスペクターによるマーク
対象アセットのインスペクターの上の方にAddressable
というボタンが追加されていると思うので、そちらにチェックマークをつければOKです。
Addressable Windowにてマーク
メニューバーよりWindow -> Asset Management -> Addressables -> Group
を選択し、Addressables Groups Window
を開きます。
Addressable Asset
としてマークしたいアセットをAddressables Groups Window
にドラッグ&ドロップすればマーク完了です。
フォルダごとマークする
フォルダ毎ドラッグ&ドロップしてあげると、フォルダの中に入っているアセットを一気に登録することができます。
またフォルダ内のアドレスが固定になることに注意してください。(フォルダのアドレス/〇〇
)
Addressの変更
各Addressable Asset
に割り当てられているAddress
はデフォルトではAssets/Sprites/a.png
のようにAssets
からの相対パスが入力されます。
ただしこの形でなければならないというわけではなく、一意であれば大丈夫なので自由に変更することができます。
※必ず一意でなければならないというわけではなく、同じアドレスに設定は一応できるみたいです。ただ思わぬバグの発生の元だと思うので非推奨。
Assetをロードする
基本はAddressables.LoadAssetAsync
とAddressables.InstantiateAsync
を利用します。
Class Addressables | Package Manager UI website
private async void Start() { // Spriteをロード var sprite = await Addressables.LoadAssetAsync<Sprite>("Assets/Sprites/a.png").Task; // ロードに失敗しても、Debug.LogErrorに表示されるだけで、エラーにはならない模様 var sprite2 = await Addressables.LoadAssetAsync<Sprite>("hoge").Task; if (sprite2 == default) { // defaultであれば、ロードに失敗している Debug.LogError("ロードに失敗しました"); } // 使い終わったらメモリから開放する Addressables.Release(sprite); // GameObjectをInstantiateする場合は以下のメソッドを利用すると良い // LoadAssetAsyncをした時とメモリ管理の挙動がことなるので注意 // 参考 : https://light11.hatenadiary.com/entry/2020/01/04/193512 var gameObject = await Addressables.InstantiateAsync("Sample.prefab").Task; // 使い終わったらゲームオブジェクトと共にメモリから削除する Addressables.ReleaseInstance(gameObject); // 以下のコードでゲームオブジェクトを削除するとメモリリークするので注意(Addressables Event Viewerで確認済) // Destroy(gameObject); }
またAddressable Asset System
でメモリに読み込んだアセットは、明示的に開放しなくてはいけないことに注意してください。
具体的にはAddressables.Release
やAddressables.ReleaseInstance
ですね。
加えてAddressable.Release
の引数はAsyncOperationHandle
でなければいけないのかなと最初は思ったのですが、上記のコードでも正しく開放ができているようです。(Addressable Event Viewer
により確認)
// Spriteをロード AsyncOperationHandle<Sprite> handle = Addressables.LoadAssetAsync<Sprite>("Assets/Sprites/a.png"); await handle.Task; if (handle.Status == AsyncOperationStatus.Succeeded) { // ロード成功 Sprite sprite = handle.Result; // 開放する Addressables.Release(handle); }
Assetをロードする(AssetReferenceを利用する)
AssetReference
を利用することで、アドレスの文字列を知らずともAsset
をロードすることができます。
Class AssetReference | Package Manager UI website
// Sprite用のAssetReference [SerializeField] private AssetReferenceSprite spriteReference; // GameObject用のAssetReference [SerializeField] private AssetReferenceGameObject gameObjectReference; private async void Start() { // Spriteをロードする var sprite = await spriteReference.LoadAssetAsync<Sprite>().Task; // 使い終わったらメモリから開放する spriteReference.ReleaseAsset(); // ゲームオブジェクトをインスタンス化する var gameObject = await gameObjectReference.InstantiateAsync().Task; // 使い終わったらメモリから解放する gameObjectReference.ReleaseInstance(gameObject); }
AssetReference〇〇
はいくつか種類があるみたいなので、適したものを見つけてあげてください。
Class AssetReference | Package Manager UI website
アセットバンドルを作成する
Addressable Groups Window
のPlay Mode Script
を押すと、Play Mode
というアセットの読み方の手法を設定することができます。
Use Asset Database
とSimulate Groups
の場合はエディタ上ではAsset Database
を利用してアセットをロードするためアセットバンドルを作成する必要はありません。
しかし実機ビルドをする場合やUse Existing Build
の場合は、Addressable Assets
からアセットバンドルをビルドする必要があります。
Addressable Assets development | Package Manager UI website
※名前が変わっているようなので注意
バンドルを作成するには、Addressable Group Window
にてBuild -> New Build -> Default Build Script
を選択すれば完了です。