読者です 読者をやめる 読者になる 読者になる

ぷらこあ

雑記/ゲームアイデア帳/成果物ぺろり

【Unity】AssetBundleについて調べたメモ

Unityメモ

AssetBundleを使う機会がありそうなのですが
これまで全くと言っていい程触れてこなかった機能なので
個人的に少し調べてみたメモ。

大まかなフローを教えて!

  • (1) Unity(Editor): Inspector下部にて一つの AssetBundle として束ねたい Asset に同一の名前を設定する (20160713修正)
    • path形式で階層化することも可能
    • フォルダに対してバンドル定義を行うこと、でフォルダ以下のアセットを全て格納することも可能
  • (2) Unity(Editor): AssetBundleをBuildするScriptを作成し、実行する
  • (3) サーバ: BuildしたAssetBundleを静的ファイルとして配信する
  • (4) Unity(Player): WWW (UnityWebRequest) でAssetBundleを取得する

AssetBundleの生成は手動でやる必要がある?

  • コマンドライン上から実行できるようにしてCI回しましょう
  • 下記が参考になりました!

github.com

バージョン管理のフローはどういうイメージ?

qiita.com

アセットバンドルのキャッシュの保存先は?

  • 保存先を指定出来る場所が無く、変更出来なさそう
  • Android: /mnt/sdcard/Android/data/[Bundle Identifier]/files/UnityCache/
  • iOS: /var/mobile/Containers/Data/Application/{App ID}/Library/UnityCache/
    • AssetBundle が iCloud のバックアップ対象になってしまう問題があるので注意

d.hatena.ne.jp

キャッシュバージョン管理で新しいバージョンに更新すると古いバージョンのデータは自動で端末から消える?

  • されないっぽいです... (白目)
  • Caching.maximumAvailableDiskSpace で制御する方法くらいしか...
    • 指定サイズを超えた場合、タイムスタンプの古いキャッシュから削除される
  • CRCを常に違う値を渡すことでUnity5.3未満では削除される挙動となっていた
    • このアプローチはQiita等で頻繁に見かけるが、5.3ではこのハックは使えなくなった

いまさら書けないAssetBundleのcache周りの知見
Unite2015 RoundTableに巻き込まれた話

www.slideshare.net

キャッシュの削除は各AssetBundle毎に個別に行える?

  • 出来ないっぽいです... (一括は可能)

キャッシュは無期限に保持される?

  • expireはデフォルト150日になっています

docs.unity3d.com

PF毎にAssetBundleを吐き出す必要がある?

  • 必要に応じてiOS/Androidでそれぞれで吐き出す必要がありそう
    • シェーダーやテクスチャの形式が各PLatformによって異なるため

docs.unity3d.com

バンドルはプラットフォーム間で互換性がないことに注意してください。バンドルのビルドは、それぞれ個別で行われます。
各プラットホーム (Web Player を含む) では、そのプラットホーム用のものだけしか読み込むことができません。 
また iOS 用のバンドルビルドは、 Android とは互換性がありませんし、逆もまた同様です。
これは、それぞれのデバイスで使用されるシェーダーやテクスチャの形式など、各アセットタイプが本質的に異なる形式であるためです。

AssetBundle同士に依存性が発生するのだけど?

  • 主にAssetBundleにSceneやPrefabを含め、そこから別AssetBundle内の画像を参照するケース等
  • AssetBundleManager を使うと依存性考慮してくれるっぽい

tsubakit1.hateblo.jp

AssetBundleは暗号化した状態でやり取りできる?

  • Unity側の機能としては提供されていないので自前で用意する必要がありそう

docs.unity3d.com qiita.com

AssetBundle生成時に圧縮できる?

  • できます
  • BuildPipeline.BuildAssetBundle を叩くときに assetBundleOptions を指定しましょう
  • Unity5.3から採択されたLZ4なんかパフォーマンス的に期待できそう

qiita.com tsubakit1.hateblo.jp

まとめ

  • アセットバンドル自体は大規模リソースのゲームにおいては必須の仕組み
    • 圧縮されたリソースを少ない通信回数で取得することが可能
  • UnityWebRequest.GetAssetBundle (= WWW.LoadFromCacheOrDownload ) および Caching がもう少し使いやすければなぁ、と思う
    • コロプラCygamesなんかは LoadFromCacheOrDownload を使用していない
      • 1年くらい前の話だと思いつつ、事例があまり落ちていないので貴重
    • キャッシュ周りはAssetBundle導入するにしても独自に仕組み整えた方がハンドル握れそう
      • どこかにいい感じのAsset無いかなーーーー