Addressable Assets を触ってみた
環境
Unity2018.2f
Addressables System 0.2.2-preview
はじめに
Unite2018 の大前さんの講演で、AssetBundleに代わる新しいワークフローが発表されました。
AssetBundle、依存関係などは幸いなことに悩まされたことはない
(というか、依存関係が生まれるAssetBundleを使ったことがない)ですが、
Load/Unloadまわりだったりは、厄介なこともあったので、今回のアップデートはとても楽しみです
Addressable Assets の導入方法
Unity2018.2f にはまだ導入されておらず、
また、現在(2018/8/22時点)では Package Manager にも標準では表示されないようです。
なので、自分で
Packages > manifest.json を編集する必要があるみたいです。
他のパッケージ情報が並んでいる中に
"com.unity.addressables": "0.0.22-preview",
を追記してください。
※最新版で0.2.2がリリースされているみたいですね。(2018/8/22時点)
そうすることで、メニューの Window > Asset Management に Addressable Assets が追加されます。
AssetBundleの作成
Addressable Assets を実行すると、Addressables の window が表示されます。
早速、Create してみましょう。
Profile やら Asset Address やらなんかいろいろ出てきました。
Profile をクリックすると、AA Profiles というウィンドウがでてきました。
ざっと見た感じ、Addressable Assets の設定をここで追加・切り替えできる感じっぽいですね。
空いたところを右クリックで、新規 Group が生成できそうです。
Project View から Addressables View に Asset を D&D すると、それっぽい感じでリソースが追加されました。
とりあえず2つGroupを作成して試してみます。
また、Addressable Assets は Resources のようにリソース取得するために名前解決するみたいです。
その名前は追加した各Assetの項目にあるAsset Address を編集することで可能です。
AssetBundleの読み込み方法
まずは using UnityEngine.AddressableAssets; を追加しましょう。
これで AddressableAssets に関連する API を使用することが出来ます。
読み込むには大まかに3種類ありそうです
- 名前解決で読み込む方法 => Addressables.LoadAsset<>( "Address" )
- インスペクタで設定したAssetReferenceをから読み込む方法1 => Addressables.LoadAsset<>( "ref" )
- インスペクタで設定したAssetReferenceをから読み込む方法2 => ref.LoadAsset<>( "ref" )
どの読み込み方法も非同期で行われます。
なので読み込んだアセットを使用するには.Completed に処理を追加するか、
IAsyncOperation を保持し、yield で待機したり、IAsyncOperation の IsDone プロパティで終了を検知する必要があります
実際には読み込んだ後にはちゃんと開放する必要があります。
それについては後で記述します。
AssetBundleの読み込みテスト
Addressables の window の右のほうに歯車マークがあります。
これをクリックすると、 PlayMode を選択できるようになります。
Fast : AssetDatabase からアセットをロードします。AssetBundleを使用しない形ですね。
Virtual Mode だと Play する度に、仮のAssetBundleを構築するため、開発に時間がかかってしまいます。
Virtual Mode : 仮のAssetBundleを構築し、実際に読み込む処理を実行します。
最初はこちらで開発し、確認が終わったらFastで開発する思想でしょうか。
Packed : 実際にAssetBundleを作成し、そこからデータをロードします。
これらのモードを切り替えて、エディタで実行テストが行えます。
AssetBundle の開放
Addressables で asset を読み込む場合、参照カウントを ResourceManager が保持してくれており、
その参照カウントが0になった時に、自動的に AssetBundle を Unload してくれるみたいです。
参照カウントは LoadAsset や Instantiate で増えますので、これらで生成したオブジェクトはReleaseInstance で減らす必要があります。
ただ、個人的に今までは AssetBundle をロードしたら、中身をメモリ上に展開したらすぐに UnLoad していました。メモリ的な理由で。
そこらへんのメモリ使用量的な部分はどうなんでしょうか。
ResourceProfiler での確認
どのAssetがどれぐらい参照されているか、どれぐらい解放されているかを ResourceProfiler で確認することが出来ます。
ただし、現在は通常実行ではProfileされません。
どうすればいいかというと、Addressables のウィンドウの右にある歯車マークを押すと「Send Profile Events」という表示を確認できます。これにチェックを入れると、ResourceProfiler で確認することができます。
バグ?
私の環境だけなのかもしれませんが、以下の不具合っぽい挙動が起きました。
- Addressables Profile の LocalLoadPathを書き換えると、Packed モードで動かない
- Addresables の window 内の Build が非アクティブのまま。どうすれば Build だけできるんだろう
まとめ
自分の環境だけなのかわかりませんが、バグも顕在しているので現時点でどれだけ使用に耐えうるかはちょっとわかりませんね。
ただ、テストモードがいくつかありますし、他にもまだ試していない機能などもあるので、引き続き、調査していきたいと思います。