Addressablesなんもわからんからある程度使えるようになったのでメモ。
ポイント
- ロード
- 依存関係
- アンロード
- Prefab
- ハマりポイント
1. ロード
ロードは簡単。
AsyncOperationHandle<Sprite> handle;
handle = Addressables.LoadAssetAsync<Sprite>("HouseSprite");
Sprite sprite = await handle.Task;;
spriteRenderer.sprite = sprite;
※UniTask使用
2.依存関係
前提としてAddressableのGroupがAssetBundle一つ分の扱いになる。
ポイント
- 参照しているAssetも一緒にロードしてくれる
- 参照しているAssetは同じAssetBundleに含まれる
- 複数に参照されるAssetは直接AssetBundleに含ませる
2.1参照しているAssetも一緒にロードしてくれる
Sprite A は Texture B を含んでいる(を参照している)。
Addressables では A をロードすると
参照している B もロードしてくれる。
AssetBundle時代はこの仕組みを自作しなければならなかったらしい...。
2.2参照しているAssetは同じAssetBundleに含まれる
Sprite A を Addressable化すると、Texture B も同じAssetBundleに含まれる。
このときTexture B は 直接ロードすることはできない。
2.3複数に参照されるAssetは直接AssetBundleに含ませる
Sprite A (Texture B)
Sprite C (Texture B) をAddressable化した時
A と C のそれぞれに B が含まれることになり
A と C をロードすると、B が二個もロードされることになる。
B も直接Addressable化することで
A と C に含まれる B は同一のものになり無駄がなくなる。
3. アンロード
Addressables.Release(handle);
もしくは
Addressables.Release(sprite);
上記の二つの方法でアンロードしてみたところ
Sprite本体と、参照しているTextureのどちらも解放された。
(Unity の Sprite は Texture2Dの参照を持っているテキストファイルのようなもの)
4. Prefab
Addressables.InstantiateAsync("Hoge");
Addressables.ReleaseInstance(instance)
があるが、この場合だと勝手にインスタンスの数を数えておいてくれる。
ReleaseInstanceで0になった時に使用しているMaterialやTextureを解放してくれる。
ちゃんと数の管理が自分でできるなら
handle = Addressables.LoadAssetAsync<GameObject>("HogePrefab");
GameObject prefab = await handle.Task;;
GameObject instance = Instantiate(prefab);
Addressables.Release(prefab);
でも問題なさそう。
5. ハマりポイント
アンロードした際に、プロファイラを見ると
TextureやMaterial, Assetが減っておらず、「アンロードされていない!?」と焦った。
実際Editor上ではアンロードされていない。
原因はAddressablesのPlayMode。三種類あるうちの
Use Existing Build(requires built groups)
を選択することでアンロードされているのを見ることができる。
ほかの選択肢の状態では、実機とは異なる動作のためアンロードされず
ビルド時にはちゃんとアンロードされるようになる。
(どうやらAssetDatabese経由)