Unityのasset bundle運用実例@lordofknights

32
Unity AssetBundle 運用事例 @Lord of Knights 株式会社 Aiming リードソフトウェアエンジニア 細田幸治 2012/06/01

description

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

Transcript of Unityのasset bundle運用実例@lordofknights

Page 1: Unityのasset bundle運用実例@lordofknights

Unity のAssetBundle 運用事例

@Lord of Knights

株式会社 Aimingリードソフトウェアエンジニア

細田幸治2012/06/01

Page 2: Unityのasset bundle運用実例@lordofknights

こんばんは

こんばんは

Page 3: Unityのasset bundle運用実例@lordofknights

細田幸治といいます。

http://www.facebook.com/kouji.hosoda MMORPG のサーバーを書いたり、

通信ライブラリを書いたり、ブラウザゲームを作ったりして、現在はスマートフォンでオンラインゲームを作ってます。

Page 4: Unityのasset bundle運用実例@lordofknights

AssetBundle つかっていますか?

( ・∇・)ノ

Page 5: Unityのasset bundle運用実例@lordofknights

話すこと

1. AssetBundle の特徴

○ 概説○ メリット○ デメリット

2. Lord of Knights での実例紹介

○ 何のために使ったか?○ どう実装したか?○ 運用ワークフロー

Page 6: Unityのasset bundle運用実例@lordofknights

結論を言うと

● アップデート時のコンテンツ追加に便利

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

● ポイントをおさえて使おう

Page 7: Unityのasset bundle運用実例@lordofknights

AssetBundle の特徴

Page 8: Unityのasset bundle運用実例@lordofknights

概説

● Unity 専用の外部素材フォーマットのこと● GameObject、Material、Prefab などが入る● サーバーなどに置いてアプリで読み込んで使う● AssetBundle の作成は Unity Pro Only

Page 9: Unityのasset bundle運用実例@lordofknights

メリット

1. アプリケーションサイズを小さくできる2. Apple 審査をしなくてもコンテンツを追加できる3. キャッシュが効く4. アプリ本体と AssetBundle とでワークフロー(プ

ロジェクト)分けられる

Page 10: Unityのasset bundle運用実例@lordofknights

デメリット

1. 他の素材方式よりもメモリを消費する○ AssetBundle クラス自体がアセットを内包した状態でメモ

リに乗る○ 上記 AssetBundle クラスから Material などを Load すると

それもメモリに乗る

memory

AssetBundle クラス

Material,GameObject,etc.www

LoadLoad

Page 11: Unityのasset bundle運用実例@lordofknights

デメリット

2. 非同期読み込みになるので“待ち”の実装が必要○ Resources.Load のように同期的には読み込めない○ 待ち時間処理のためにコードが複雑になりがち

Page 12: Unityのasset bundle運用実例@lordofknights

デメリット

3. 通信状態によっては読み込めない○ 通信できない環境だと Load できない○ タイムアウトでも Load に失敗する○ Load できなくてもなるべく遊べるような設計が望ましい

Page 13: Unityのasset bundle運用実例@lordofknights

デメリット

4. プラットフォーム間で互換性がない○ Android、iPhone、WebPlayer でそれぞれ別ファイル

フォーマット○ AssetBundle のビルド時にプラットフォームを指定して書

き出す必要がある○ ビルド時のプラットフォームの切り替えに時間がかかる○ ちなみに Editor ではどのフォーマットでも読み込める

Page 14: Unityのasset bundle運用実例@lordofknights

デメリット

5. バージョンを指定しても更新されない時がある○ ブラウザやサーバーのキャッシュに乗るため、更新したく

てもうまく反映されない場合がある○ 読み込む際にファイル名の後ろにタイムスタンプなどをつ

けてキャッシュ無効化するべし○ 例:http://www.foo.com/foo.asset?time=201106011930

Page 15: Unityのasset bundle運用実例@lordofknights

デメリット

6. スクリプトは AssetBundle に入れられない(iPhone ではコードの動的生成 NG だから)

7. Unity がバージョンアップすると読み込めなくなる(Unity3.5.1 から下位互換されたかも)○ 3.4系のときは別バージョンでビルドしたAssetBundleを読

み込もうとすると、実機でキャッチできないエラー出して読み込めなかった。

Page 16: Unityのasset bundle運用実例@lordofknights

Lord of Knights 実例

Page 17: Unityのasset bundle運用実例@lordofknights

何のために使ったか?

Page 18: Unityのasset bundle運用実例@lordofknights

何のために使ったか?

● 追加コンテンツ

○ カードイラスト

Page 19: Unityのasset bundle運用実例@lordofknights

何のために使ったか?

● 追加コンテンツ

○ チュートリアルの説明用スライド

Page 20: Unityのasset bundle運用実例@lordofknights

何のために使ったか?

● 追加コンテンツ

○ アドバイスポップアップ素材

Page 21: Unityのasset bundle運用実例@lordofknights

何のために使ったか?

● アプリサイズ削減

○ BGM (後にアプリ本体に埋め込み)

○ 背景画像(後にアプリ本体に埋め込み)

○ カード枠(後にアプリ本体に埋め込み)

○ などなど容量が大きい素材たち

AppleStore の3G回線でのダウンロードサイズ制限が 20 MB だったときに使用した↓現在は 50 MB まで OK になったので再埋め込み

Page 22: Unityのasset bundle運用実例@lordofknights

どう実装したか?

Page 23: Unityのasset bundle運用実例@lordofknights

どう実装したか?

● メモリ管理

○ 最初は1つの AssetBundle に複数素材を入れていたが、ばらばらに分けて読み込み時のメモリを削減

○ メモリが少ないデバイス(iPod touch など)の場合は使用メモリ量が 120 MB 以上になったらシーン切り替え時にAssetBundle をいったん Unload するようにした

Page 24: Unityのasset bundle運用実例@lordofknights

どう実装したか?

● “待ち”の扱い

○ 動的に扱う素材はインジケーターでアピール

○ 静的に扱う素材はフェードアウト中に先読み

Page 25: Unityのasset bundle運用実例@lordofknights

どう実装したか?

● キャッシュ

○ 開発当時は Unity のキャッシュがまだなかった、と思う

○ 独自キャッシュの仕組みを実装

■ WWW.LoadFromCacheOrDownload と同じ挙動

○ 最新バージョン番号をサーバーから教えてもらい、クライアントでキャッシュしているバージョン番号と一致しなかったら再読み込みする

○ ファイル名の後ろにクエリストリングでタイムスタンプをつけて予期せぬキャッシュを避ける

Page 26: Unityのasset bundle運用実例@lordofknights

どう実装したか?

● バージョン、プラットフォーム、言語の切り分け

○ 同じファイル名でもプラットフォームごとに違うフォーマットのファイルが必要

○ バージョン、プラットフォーム、言語でディレクトリ構造を作ることで同名ファイルを配置分け

■ /version1_0/iPhone/ja/Card_001.asset■ /version1_1/Android/en/Card_001.asset

○ クライアントから条件を指定してファイルパスをサーバーから教えてもらう

Page 27: Unityのasset bundle運用実例@lordofknights

運用ワークフロー

Page 28: Unityのasset bundle運用実例@lordofknights

運用ワークフロー

● アプリ本体とは別のプロジェクトで作成

○ アプリ本体の修正を気にせずに作業できる

● ファイルサイズはなるべく小さくパック

○ AssetBundle ファイル単位でメモリに読み込むため

○ 同時に使わない素材は別ファイルに分ける

○ メモリ使用量と読み込み速度を気にかける

Page 29: Unityのasset bundle運用実例@lordofknights

運用ワークフロー

● 規約

○ シンプルなフォルダ構造にして企画やデザインの人が直接いじりやすいようにする

○ プロジェクト内のフォルダ構造、ファイル名から自動的に出力ファイルの名前や配置場所が決まるようにする

● 一発ビルドコマンド

○ Editor スクリプトで一括ビルドコマンドを実装

○ 書き出されたフォルダをそのままサーバーに配置すれば OK

Page 30: Unityのasset bundle運用実例@lordofknights

まとめ

● アップデート時のコンテンツ追加に便利

○ Apple の審査を待たなくて良い

● いろいろ注意点がある

○ 予期せぬキャッシュに注意

○ 非同期プログラミングが必要

○ 読み込めないときの対応をきちんとする

● ポイントをおさえて使おう

○ プラットフォーム毎にアセットを切り替えられるように

○ アセット1個1個はメモリと速度を気にして小さめに

○ Editor スクリプトを活用してワークフローを簡単に

Page 31: Unityのasset bundle運用実例@lordofknights

質疑応答

● なにかあれば!

Page 32: Unityのasset bundle運用実例@lordofknights

おわり