Unity の
AssetBundle 運用事例
@Lord of Knights


                 株式会社 Aiming
           リードソフトウェアエンジニア
                     細田幸治
                   2012/06/01
こんばんは
こんばんは
細田幸治といいます。

http://www.facebook.com/kouji.hosoda

MMORPG のサーバーを書いたり、
通信ライブラリを書いたり、
ブラウザゲームを作ったりして、
現在はスマートフォンでオンラインゲームを作って
ます。
AssetBundle
つかっていますか?
   ( ・∇・)ノ
話すこと
1. AssetBundle の特徴
   ○ 概説
   ○ メリット
   ○ デメリット

2. Lord of Knights での実例紹介
   ○ 何のために使ったか?
   ○ どう実装したか?
   ○ 運用ワークフロー
結論を言うと
● アップデート時のコンテンツ追加に便利

● だけどいろいろ注意点がある

● ポイントをおさえて使おう
AssetBundle の特徴
概説
●   Unity 専用の外部素材フォーマットのこと
●   GameObject、Material、Prefab などが入る
●   サーバーなどに置いてアプリで読み込んで使う
●   AssetBundle の作成は Unity Pro Only
メリット
1.   アプリケーションサイズを小さくできる
2.   Apple 審査をしなくてもコンテンツを追加できる
3.   キャッシュが効く
4.   アプリ本体と AssetBundle とでワークフロー(プ
     ロジェクト)分けられる
デメリット
1. 他の素材方式よりもメモリを消費する
  ○   AssetBundle クラス自体がアセットを内包した状態でメモ
      リに乗る
  ○   上記 AssetBundle クラスから Material などを Load すると
      それもメモリに乗る

          memory

www
                                Material,GameObject,etc.
           AssetBundle
  Load        クラス        Load
デメリット
2. 非同期読み込みになるので“待ち”の実装が必
   要
 ○   Resources.Load のように同期的には読み込めない
 ○   待ち時間処理のためにコードが複雑になりがち
デメリット
3. 通信状態によっては読み込めない
 ○   通信できない環境だと Load できない
 ○   タイムアウトでも Load に失敗する
 ○   Load できなくてもなるべく遊べるような設計が望ましい
デメリット
4. プラットフォーム間で互換性がない
 ○   Android、iPhone、WebPlayer でそれぞれ別ファイル
     フォーマット
 ○   AssetBundle のビルド時にプラットフォームを指定して書
     き出す必要がある
 ○   ビルド時のプラットフォームの切り替えに時間がかかる
 ○   ちなみに Editor ではどのフォーマットでも読み込める
デメリット
5. バージョンを指定しても更新されない時がある
 ○   ブラウザやサーバーのキャッシュに乗るため、更新したく
     てもうまく反映されない場合がある
 ○   読み込む際にファイル名の後ろにタイムスタンプなどをつ
     けてキャッシュ無効化するべし
 ○   例:http://www.foo.com/foo.asset?time=201106011930
デメリット
6. スクリプトは AssetBundle に入れられない
   (iPhone ではコードの動的生成 NG だから)
7. Unity がバージョンアップすると読み込めなくな
   る(Unity3.5.1 から下位互換されたかも)
  ○   3.4系のときは別バージョンでビルドしたAssetBundleを読
      み込もうとすると、実機でキャッチできないエラー出して読
      み込めなかった。
Lord of Knights 実例
何のために使ったか?
何のために使ったか?
● 追加コンテンツ
  ○ カードイラスト
何のために使ったか?
● 追加コンテンツ
  ○ チュートリアルの説明用スライド
何のために使ったか?
● 追加コンテンツ
  ○ アドバイスポップアップ素材
何のために使ったか?
● アプリサイズ削減
  ○ BGM (後にアプリ本体に埋め込み)
  ○ 背景画像(後にアプリ本体に埋め込み)
  ○ カード枠(後にアプリ本体に埋め込み)
  ○ などなど容量が大きい素材たち

AppleStore の3G回線でのダウンロードサイズ制
限が 20 MB だったときに使用した
↓
現在は 50 MB まで OK になったので再埋め込み
どう実装したか?
どう実装したか?
● メモリ管理
  ○ 最初は1つの AssetBundle に複数素材を入れていたが、
     ばらばらに分けて読み込み時のメモリを削減
 ○   メモリが少ないデバイス(iPod touch など)の場合は使用
     メモリ量が 120 MB 以上になったらシーン切り替え時に
     AssetBundle をいったん Unload するようにした
どう実装したか?
● “待ち”の扱い
  ○ 動的に扱う素材はインジケーターでアピール




 ○ 静的に扱う素材はフェードアウト中に先読み
どう実装したか?
● キャッシュ
  ○ 開発当時は Unity のキャッシュがまだなかった、と思う
  ○ 独自キャッシュの仕組みを実装
    ■ WWW.LoadFromCacheOrDownload と同じ挙動
  ○ 最新バージョン番号をサーバーから教えてもらい、クライ
     アントでキャッシュしているバージョン番号と一致しなかっ
     たら再読み込みする
 ○   ファイル名の後ろにクエリストリングでタイムスタンプをつ
     けて予期せぬキャッシュを避ける
どう実装したか?
● バージョン、プラットフォーム、言語の切り分け
  ○ 同じファイル名でもプラットフォームごとに違うフォーマット
     のファイルが必要
 ○   バージョン、プラットフォーム、言語でディレクトリ構造を作
     ることで同名ファイルを配置分け
     ■ /version1_0/iPhone/ja/Card_001.asset
     ■ /version1_1/Android/en/Card_001.asset
 ○   クライアントから条件を指定してファイルパスをサーバー
     から教えてもらう
運用ワークフロー
運用ワークフロー
● アプリ本体とは別のプロジェクトで作成
  ○ アプリ本体の修正を気にせずに作業できる
● ファイルサイズはなるべく小さくパック
  ○ AssetBundle ファイル単位でメモリに読み込むため
  ○ 同時に使わない素材は別ファイルに分ける
  ○ メモリ使用量と読み込み速度を気にかける
運用ワークフロー
● 規約
  ○ シンプルなフォルダ構造にして企画やデザインの人が直
     接いじりやすいようにする
 ○   プロジェクト内のフォルダ構造、ファイル名から自動的に
     出力ファイルの名前や配置場所が決まるようにする
● 一発ビルドコマンド
  ○ Editor スクリプトで一括ビルドコマンドを実装
  ○ 書き出されたフォルダをそのままサーバーに配置すれば
     OK
まとめ
● アップデート時のコンテンツ追加に便利
  ○ Apple の審査を待たなくて良い
● いろいろ注意点がある
  ○ 予期せぬキャッシュに注意
  ○ 非同期プログラミングが必要
  ○ 読み込めないときの対応をきちんとする
● ポイントをおさえて使おう
  ○ プラットフォーム毎にアセットを切り替えられるように
  ○ アセット1個1個はメモリと速度を気にして小さめに
  ○ Editor スクリプトを活用してワークフローを簡単に
質疑応答
● なにかあれば!
おわり

Unityのasset bundle運用実例@lordofknights