Unity
AssetBundle

[Unity]AssetBundleとの歩み

AssetBundleとの歩み

Unityでモバイル開発と言えばAssetBundle。
AssetBundleと言えば毎年UniteTokyoやCEDECでもセッションが組まれる命題。
振り返れば自分もAssetBundleとの付き合いが長い。
そこでAssetBundleに対してこれまでどういったアプローチをかけてきたかを残しておこうと思います。

○1.触り始めの印象(Unity3系?の時代)

  • 管理クラスや内部の処理、エディタ拡張は他の担当者が実装していた。正直関心が薄かった。
  • 「Unity上のアセットをファイルに固めてダウンロードリソースに使える凄い機能」程度の認識。
  • Unity製スマホアプリ(実行ファイルそのものを最小にして公開する)ならほぼ必須。

○2.読み込み機能を一通り作ってみた(Unity4系から5系への変遷期)

  • 転職先でがっつりUnityを触ることになる。
  • しかし転職先では担当する人がいなかった。誰も居なかったので担当になる。
  • 圧縮設定がいくつもあってよく分からん。調べないと。
  • 予想よりもストレージ使用量が膨らんでいる何故だ。調べないと。
  • LoadFromCacheOrDownload は何やってるんや…。調べないと。
  • UniteTokyo2015のコロプラのセッションでの記事が印象的だった…。同じような問題に直面しつつあったため、似たような機能を作ろうかと着手。(安易)

○3.コロプラセッションの影響を受けて管理クラスを設計(Unity4系)

  • 独自スクリプトがアタッチされたPrefabは動的コンパイルで地雷する可能性がありキケン(浅い理解度、予防策)
  • アセットの依存関係の解消がコスト高(PushAssetDependencies と PopAssetDependencies)と判断し依存しないリソース設計を提唱…。
  • 出力するアセット名、バンドル名、圧縮設定、バージョンなどを記載したリソース設定ファイルを用意。それに則ってひたすら BuildAssetBundle、バージョンやCRC、ファイルサイズなどが記載されたJsonを使って管理する機能を開発。
  • ジョブスケジューラ「Rundeck」と連携し、バージョン管理ソフトとの連携、ビルドからアップロードまで自動化。
  • しかしこの機能を用いたプロジェクトはペンディングとなる。
  • まぁ使いまわせる機能だしな!と自分に言い聞かせる。

○4.Unity5の登場

  • Inspectorからオーサリング設定できるのか…神か。
  • manifest?なにそれ美味しいの?依存関係が管理されてるの?ありがたい…。
  • Unity4系で実装した処理が BuildAssetBundles にまとまってるやんけ…まじか…。
  • オーサリング設定できるのに肝心のビルドを行うにはエディタプログラムやコマンド叩く必要があるのは何でなのさ…。

○5.Unity公式のAssetBundleManagerと出会う

  • いやま゛っ↓てたよぉ!やっと公式さんが対応してくれたゆぉ!
  • と思ったのも束の間… LoadFromCacheOrDownload が用いられており、2.や3.の時代に起きた問題が脳内リフレイン。
  • アセットで公開されているプログラムを直接編集する事は更新時に手動マージが発生すると恐れ、参考にしつつオレオレAssetBundleManager設計へ着手することに…。
  • 多々問題になる音声データに関してはCRIに丸投げした。
  • やはり自社の都合の良いように開発した方が早いかな…。

○6.運用までに至れた時の理解度および印象

  • AssetBundle のほかに色々付随した機能を提供する必要があったため、それらを実装、サービスインに至る。
  • 自動化は常に並行作業。
  • このときはリソース量がそこまで多くないことが幸いし、エディタプログラムでゴリゴリ自動化し運用に耐えていた。
  • しかし仕組みを見直す必要を感じる。

○7.そしてUniteTokyo2017

○8.それでも残る課題や願望

  • PC版プラットホームとのマルチ展開がここ数年普及し始めている
    • PC版といえばなにより解析の敷居が低い(モバイルでも解析できますけども)
    • コンテンツ保護を厳密にするのであれば次の機能が欲しい
      • アセットバンドル生成後に生成されたアセットバンドルを暗号化する処理
      • 暗号化したアセットバンドルをランタイム動作時に複合化する処理
    • パフォーマンスの影響がなぁ…上手い具合に出来ないものか…と思案中
  • 端末種別によってバンドルに含める対象ファイルを変えたい
    • 同一のファイルをもとに生成するとどうしても妥協せざる得ない事象が発生する
    • 例えば iOS の Tex.unity3d には hoge.pvr を Android の Tex.unity3d には hoge.png を設定したい
  • 新しいアセットバンドルツールに機種ごとの設定を持たせるような機能入らないかな…(他力本願)
    • 「親フォルダで階層を分けてiOSバンドル生成時にはAndroid専有アセットの情報をクリアする」といった力技しかないのかなと悩み中。