【Unity】AddressableAssetSystemの復習
- AddressableAssetSystem の概要
- メモリ管理の仕組み
- LoadAssetAsync と InstantiateAsync の違い
- RetroSpriteAnimator.cs
- UniTask との連携
- 他メモ
自分が忘れないようメモ。初心者なので間違ってるところもあるかも…
バージョンアップでずいぶん仕様が変わってるので、過去記事は参考にならない場合がたまにある
AddressableAssetSystem の概要
メモリ管理の仕組み
LoadAssetAsync と InstantiateAsync の違い
どこのサイトを探しても見つからなかったので、
LoadAssetAsync と InstantiateAsync の違いについて付け足しをば。
InstantiateAsync は アセットのロードからインスタンスまでやってくれるので、
対応する ReleaseInstance でもデストロイまでやってくれます。
でも、LoadAssetAsync から Instantiate で実体化したオブジェクトは、
ReleaseInstance ではアセットを解放するところまでしかやってくれないです。
AddressableAssets をビルドした状態で実行すると、
関連づいたマテリアルやスプライトなんかは参照が消えるので見えなくなりますが、
オブジェクトは残ったままになります。
で、結論的には
LoadAssetAsync 後に Instantiate したオブジェクトは Destroy で消せばOK。
ただし、アセットはメモリにロードしたままになるので、
必要がなくなったら、Addressales.Release()で解放しましょう。
RetroSpriteAnimator.cs
ドット絵をアニメさせるのにいちいちアニメーター使うのはめんどくさい!
というとき用のコードです。詳細は下記。
このコードですが、AddressableAssetSystem で使う場合、ビルド時にエラーします。
理由は UnityEditor でしか使えない
AssetDatabase を OnValidate メソッドで使ってるからです。
OnValidate自体、UnityEditor上でしか読み込まないメソッドのはずなんですが、
どうもビルド時に走るようで、それでエラーしてる模様。
なのでOnValidate メソッドを プリプロセッサ UNITY_EDITOR でくくれば解決。
#if UNITY_EDITOR ~ #endif ってやつです。
UniTask との連携
ロード処理を IEnumerator から async ~ await に切り替えるやつです。
下記はスライダーでロードゲージを実装して、
async な Start メソッドから await を使って呼び出すメソッド。
handle.isDone だと 1 にならずに終了するので、handle.PercentComplete を使いました。
このあたりの資料は下記。
他メモ
- var handle = Addressables.LoadAssetAsync<GameObject>("Prefab名") の型(var)は
AsyncOperationHandle<GameObject> - var handles = Addressables.LoadAssetsAsync<Object>("Label名", null) の型(var)は
AsyncOperationHandle<IList<Object>> - handle = Addressables.InstantiateAsync("Prefab名") は
Addressables.ReleaseInstance(handle.Result) で解放 - handle = Addressables.LoadAssetAsync<GameObject>("Prefab名") 後に
Instantiate したゲームオブジェクトは Destroy(ゲームオブジェクト)で消去可。
アセットの解放は Addressables.Release(handle.Result)。
解放するとゲームオブジェクトに紐付けされた画像などの素材はすべて消える。
ただし Addressable Groups の Play Mode Script が Use Existing Build 以外では消えないので注意。
- 実際にデータベースを組もうとしてつまづいた際にまとめた補足ashtarte.hateblo.jp