Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Unityのasset bundle運用実例@lordofknights

25,828 views

Published on

弊社でUnity3Dを使って開発したiPhoneアプリ(Lord of Knights)でのAssetBundle実例と、使いどころの話。

Published in: Technology
  • Be the first to comment

Unityのasset bundle運用実例@lordofknights

  1. 1. Unity のAssetBundle 運用事例@Lord of Knights 株式会社 Aiming リードソフトウェアエンジニア 細田幸治 2012/06/01
  2. 2. こんばんはこんばんは
  3. 3. 細田幸治といいます。http://www.facebook.com/kouji.hosodaMMORPG のサーバーを書いたり、通信ライブラリを書いたり、ブラウザゲームを作ったりして、現在はスマートフォンでオンラインゲームを作ってます。
  4. 4. AssetBundleつかっていますか? ( ・∇・)ノ
  5. 5. 話すこと1. AssetBundle の特徴 ○ 概説 ○ メリット ○ デメリット2. Lord of Knights での実例紹介 ○ 何のために使ったか? ○ どう実装したか? ○ 運用ワークフロー
  6. 6. 結論を言うと● アップデート時のコンテンツ追加に便利● だけどいろいろ注意点がある● ポイントをおさえて使おう
  7. 7. AssetBundle の特徴
  8. 8. 概説● Unity 専用の外部素材フォーマットのこと● GameObject、Material、Prefab などが入る● サーバーなどに置いてアプリで読み込んで使う● AssetBundle の作成は Unity Pro Only
  9. 9. メリット1. アプリケーションサイズを小さくできる2. Apple 審査をしなくてもコンテンツを追加できる3. キャッシュが効く4. アプリ本体と AssetBundle とでワークフロー(プ ロジェクト)分けられる
  10. 10. デメリット1. 他の素材方式よりもメモリを消費する ○ AssetBundle クラス自体がアセットを内包した状態でメモ リに乗る ○ 上記 AssetBundle クラスから Material などを Load すると それもメモリに乗る memorywww Material,GameObject,etc. AssetBundle Load クラス Load
  11. 11. デメリット2. 非同期読み込みになるので“待ち”の実装が必 要 ○ Resources.Load のように同期的には読み込めない ○ 待ち時間処理のためにコードが複雑になりがち
  12. 12. デメリット3. 通信状態によっては読み込めない ○ 通信できない環境だと Load できない ○ タイムアウトでも Load に失敗する ○ Load できなくてもなるべく遊べるような設計が望ましい
  13. 13. デメリット4. プラットフォーム間で互換性がない ○ Android、iPhone、WebPlayer でそれぞれ別ファイル フォーマット ○ AssetBundle のビルド時にプラットフォームを指定して書 き出す必要がある ○ ビルド時のプラットフォームの切り替えに時間がかかる ○ ちなみに Editor ではどのフォーマットでも読み込める
  14. 14. デメリット5. バージョンを指定しても更新されない時がある ○ ブラウザやサーバーのキャッシュに乗るため、更新したく てもうまく反映されない場合がある ○ 読み込む際にファイル名の後ろにタイムスタンプなどをつ けてキャッシュ無効化するべし ○ 例:http://www.foo.com/foo.asset?time=201106011930
  15. 15. デメリット6. スクリプトは AssetBundle に入れられない (iPhone ではコードの動的生成 NG だから)7. Unity がバージョンアップすると読み込めなくな る(Unity3.5.1 から下位互換されたかも) ○ 3.4系のときは別バージョンでビルドしたAssetBundleを読 み込もうとすると、実機でキャッチできないエラー出して読 み込めなかった。
  16. 16. Lord of Knights 実例
  17. 17. 何のために使ったか?
  18. 18. 何のために使ったか?● 追加コンテンツ ○ カードイラスト
  19. 19. 何のために使ったか?● 追加コンテンツ ○ チュートリアルの説明用スライド
  20. 20. 何のために使ったか?● 追加コンテンツ ○ アドバイスポップアップ素材
  21. 21. 何のために使ったか?● アプリサイズ削減 ○ BGM (後にアプリ本体に埋め込み) ○ 背景画像(後にアプリ本体に埋め込み) ○ カード枠(後にアプリ本体に埋め込み) ○ などなど容量が大きい素材たちAppleStore の3G回線でのダウンロードサイズ制限が 20 MB だったときに使用した↓現在は 50 MB まで OK になったので再埋め込み
  22. 22. どう実装したか?
  23. 23. どう実装したか?● メモリ管理 ○ 最初は1つの AssetBundle に複数素材を入れていたが、 ばらばらに分けて読み込み時のメモリを削減 ○ メモリが少ないデバイス(iPod touch など)の場合は使用 メモリ量が 120 MB 以上になったらシーン切り替え時に AssetBundle をいったん Unload するようにした
  24. 24. どう実装したか?● “待ち”の扱い ○ 動的に扱う素材はインジケーターでアピール ○ 静的に扱う素材はフェードアウト中に先読み
  25. 25. どう実装したか?● キャッシュ ○ 開発当時は Unity のキャッシュがまだなかった、と思う ○ 独自キャッシュの仕組みを実装 ■ WWW.LoadFromCacheOrDownload と同じ挙動 ○ 最新バージョン番号をサーバーから教えてもらい、クライ アントでキャッシュしているバージョン番号と一致しなかっ たら再読み込みする ○ ファイル名の後ろにクエリストリングでタイムスタンプをつ けて予期せぬキャッシュを避ける
  26. 26. どう実装したか?● バージョン、プラットフォーム、言語の切り分け ○ 同じファイル名でもプラットフォームごとに違うフォーマット のファイルが必要 ○ バージョン、プラットフォーム、言語でディレクトリ構造を作 ることで同名ファイルを配置分け ■ /version1_0/iPhone/ja/Card_001.asset ■ /version1_1/Android/en/Card_001.asset ○ クライアントから条件を指定してファイルパスをサーバー から教えてもらう
  27. 27. 運用ワークフロー
  28. 28. 運用ワークフロー● アプリ本体とは別のプロジェクトで作成 ○ アプリ本体の修正を気にせずに作業できる● ファイルサイズはなるべく小さくパック ○ AssetBundle ファイル単位でメモリに読み込むため ○ 同時に使わない素材は別ファイルに分ける ○ メモリ使用量と読み込み速度を気にかける
  29. 29. 運用ワークフロー● 規約 ○ シンプルなフォルダ構造にして企画やデザインの人が直 接いじりやすいようにする ○ プロジェクト内のフォルダ構造、ファイル名から自動的に 出力ファイルの名前や配置場所が決まるようにする● 一発ビルドコマンド ○ Editor スクリプトで一括ビルドコマンドを実装 ○ 書き出されたフォルダをそのままサーバーに配置すれば OK
  30. 30. まとめ● アップデート時のコンテンツ追加に便利 ○ Apple の審査を待たなくて良い● いろいろ注意点がある ○ 予期せぬキャッシュに注意 ○ 非同期プログラミングが必要 ○ 読み込めないときの対応をきちんとする● ポイントをおさえて使おう ○ プラットフォーム毎にアセットを切り替えられるように ○ アセット1個1個はメモリと速度を気にして小さめに ○ Editor スクリプトを活用してワークフローを簡単に
  31. 31. 質疑応答● なにかあれば!
  32. 32. おわり

×