sound sepher's PASTIME

ゲーム開発で思ったことや、趣味などの話を書き綴っていきます。

【Unity】AddressableAssetSystemの復習

自分が忘れないようメモ。初心者なので間違ってるところもあるかも…
バージョンアップでずいぶん仕様が変わってるので、過去記事は参考にならない場合がたまにある

AddressableAssetSystem の概要

blog.applibot.co.jp

kan-kikuchi.hatenablog.com

メモリ管理の仕組み

light11.hatenadiary.com

LoadAssetAsyncInstantiateAsync の違い

どこのサイトを探しても見つからなかったので、
LoadAssetAsyncInstantiateAsync の違いについて付け足しをば。

InstantiateAsync は アセットのロードからインスタンスまでやってくれるので、
対応する ReleaseInstance でもデストロイまでやってくれます。

でも、LoadAssetAsync から Instantiate で実体化したオブジェクトは、
ReleaseInstance ではアセットを解放するところまでしかやってくれない
です。

AddressableAssets をビルドした状態で実行すると、
関連づいたマテリアルやスプライトなんかは参照が消えるので見えなくなりますが、
オブジェクトは残ったままになります。

で、結論的には
LoadAssetAsync 後に Instantiate したオブジェクトは Destroy で消せばOK
ただし、アセットはメモリにロードしたままになるので、
必要がなくなったら、Addressales.Release()で解放しましょう。

RetroSpriteAnimator.cs

ドット絵をアニメさせるのにいちいちアニメーター使うのはめんどくさい!
というとき用のコードです。詳細は下記。 

baba-s.hatenablog.com

このコードですが、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 を使いました。

f:id:Ashtarte:20200711235819p:plain

 このあたりの資料は下記。

qiita.com

tech.cygames.co.jp

他メモ

  • 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