unityのasset bundle運用実例@lordofknights
DESCRIPTION
弊社でUnity3Dを使って開発したiPhoneアプリ(Lord of Knights)でのAssetBundle実例と、使いどころの話。TRANSCRIPT
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
AssetBundle クラス
Material,GameObject,etc.www
LoadLoad
デメリット
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 スクリプトを活用してワークフローを簡単に
質疑応答
● なにかあれば!
おわり