【Unity】Addressable Asset Systemを色々調査してみた

AddressableAssetSystem

この記事は Unity Advent Calendar 2020#3 5日目の記事です。
滑り込みアウト(遅刻)ごめんなさいmm

AddressableAssetSystemを色々と調査する機会があったので
その時に見知った情報を共有させていただきます。

使い方とか全体の概要などは↓のサイト様が参考になりました!
https://blog.applibot.co.jp/2020/06/15/introduce-addressable-assets-system/
https://qiita.com/k7a/items/b4fd298bcb64dc968ad1
https://light11.hatenadiary.com/entry/2019/12/26/225232
https://forpro.unity3d.jp/unity_pro_tips/2020/06/09/1252/

検証環境

  • Unity2019.4.15f1
  • Addressable Asset System 1.16.13

LocalとRemoteについて

  • Local
    • アプリ内の事を指す
    • {UnityEngine.AddressableAssets.Addressables.RuntimePath}は初期設定のままならStreamingAssetsフォルダを指定される
    • Resourcesの代わりに使うならこちらを利用すればOK
  • Remote
    • アプリ外(外部アクセスHTTP)を指す

Catalogについて

  • このファイルに全てのAssetの読み込みアドレス、読み込み方、使い方、Hash、名前等が登録されている
  • ビルド時にStreamingAssets配下にcatalog.jsonファイルとして生成される
    • エディタ上だと「Library/com.unity.addressables/aa/{BuildTarget}/catalog.json.
    • AddressableAssetSettingsのBuildRemoteCatalogにチェックをいれなくても必ず生成される
    • 初回アプリ起動時には必ずこのcatalog.jsonが読み込まれる
  • Runtime時にはcatalog.jsonを読み込み AddressablesImplのList<ResourceLocatorInfo> m_ResourceLocatorsに保存される
    • Locator -> 各Assetのアドレスなどの情報郡
    • LocalHash -> catalog.jsonのHash値
    • CatalogLocation -> catalog.json自体のアドレスなどの情報
  • Remote用のCatalog生成時にはcatalog.jsonとcatalog.hashが生成される
    • ビルド直ぐの状態の時にはRemoteのcatalog.jsonもLocalのcatalog.jsonも中身はまったく同じ
    • ※Localのcatalog.jsonにはLocal用のAssetだけとかでは無い
  • Remote用のCatalogはアプリを更新せずにAssetだけ更新したい時に使う
    • Remote用のCatalogのアドレスはsettings.jsonに記載される
    • settings.jsonも同様にStreamingAssets配下に格納される
    • catalog_xxx.hashっとなっているが読み込み時には.hashを.jsonにReplaceしている
      • なのでhashファイルとjsonファイルは同じ場所にないと死ぬ
    • Hash値が違い更新した場合(UpdateCatalogs)は、Application.persistentDataPath/ com.unity.addressablesにjsonとhashファイルが保存される
      • 保存後はStremingAssets配下のcatalog.jsonを使わずに保存したcatalog.jsonが使用されるようになる

運用について

AddressableAssetSystemは良くも悪くも呼び出す側はそのファイルがLocalなのかRemoteなのか意識しなくても大丈夫な設計になっている。
その為、よくあるパターンとしてアプリを起動してタイトル画面後にパッチDLという動きをするアプリの場合に、うっかりDLの前にRemoteに指定しているAssetを呼び出そうとすると、実際にネットアクセスが行われ取得しようとしてしまう。
これのきついところは、そのようになっている事に気づけない事(パッと見エラーではない為)
しかも呼び出したAsset自体はRemoteじゃないとしても、依存関係の先の先にRemoteが指定している場合はそれを取得しようとしまって更に気付きにくくなっている。
エディタでAddressables EventViewerで定期的に監視したりすると良いと思います。

Localに指定しているAssetで不慮の事故を防ぐためにはGroupt設定のBundle Namingを「FileName」にした方がよいと思いました。
初期設定の「Append Hash to Filename」だとRemoteでCatalogを更新した場合に、運悪くLocalのAssetの読み込みファイルも変更してしまい、呼び出そうとした時にnot foundとなってしまった事があったからです。

最後に

AddressableAssetSystemは現段階で基盤はよくできており、思想もとてもよいと思うので
今後かゆいとこにもっと手が届くようになることを期待
※catalog初期化とか

コメント

タイトルとURLをコピーしました