【満員御礼/増員441名】第4回 渋谷Unity技術勉強会 xコロプラUnity事例発表【テクニカル講座】第3回勉強会に引き続き講師は WisdomSoft赤坂氏です! : ATND
http://atnd.org/events/25102
スクリプトによるエディタ制御 - WisdomSoft 赤坂玲音さん(@LeonAkasaka)
スライドとサンプルコードは以下のページで公開されています。
イベント/スクリプトによるエディタ制御 - WisdomSoft
http://www.wisdomsoft.jp/321.html
スライドの23ページで出てくるデザインガイドとはこちらの事。
デザイン上の警告
http://msdn.microsoft.com/ja-jp/library/ms182125.aspx
【スライドに書かれているもの以外のメモ】
- ステートフル → 何からのデータが紐付いてるもの。データを持ち続けているもの
- シャープ製のAndroid端末が不具合あるものが多いので注意
Unity事例発表 - 株式会社コロプラ
本日のあらすじ
- 1Sceneのメリット・デメリット
- 1Sceneでのメモリ管理
- 実例紹介
Kuma the bearのビジョン
スマートフォン×ネイティブゲームのチーム
オフラインで動作するアプリである事
- デバイスや通信環境に依存しないプラットフォームとして。できるだけ多くの端末をカバーするために
グローバルである事
- App Store/Google Playのプラットフォームで展開する以上、ローカライズも積極的に
ゲームとして面白いものである事(Not クソゲー)
絶賛!修行中!
Kuma the bear新タイトル「海賊射的!」、昨日(4/25)Android版リリース!
Google Playのリンク
1Sceneのメリット
- ユーザのローディング待機の場面を減らせる
1Sceneのデメリット
- メモリの使用量が肥大化
- 最悪プログラムの終了なんてことも…
そもそもSceneとは…
Sceneはその名のとおり「舞台」
ここに、3Dモデル・GUI・音・プログラムなどの
舞台装置(Asset)を配置するという仕組みが大本に成っています。
1Sceneにした方が良いケース
Unityではシーンの切り替えは簡単に行う事ができます。
ただし、Scene初期化時には、Hierarchyに置いたオブジェクトなどのキャッシングをUnityが適切に行うため、シーンを開く時間がかかりがちです。
特にスマートフォンでは、そのロード時間が顕著に出ます。
- Galaxy S II → 10秒!
- iPhone 4 → 20秒か…
- iPhone 3GS → タイムアウト!
APKベースで起動時のメモリ使用量が100MBを超えるとヤバイ
まずはPrefabとHierarchyとの関係のおさらい
1. PrefabはUnity上のAssetを束ねた再利用可能なテンプレートでクラスの様なもの。
2. GameObjectにはPrefabを関連付ける事が可能で、GameObjectからはPrefabの定義を使ってInstanceを生成する事ができる。
シーンとオブジェクトとメモリの関係
1. Hierarchyへオブジェクトの配置は必要に応じて
→GameObjectはactiveのスイッチがあるが、こちらはメモリは抱えっぱなし
2. Hierarchyオブジェクトに関連付けられたPrefabもシーンロード時にキャッシュされる
→まだシーン上に生成されていないくてもシーンロード時にキャッシュされる
ワンシーンでのメモリ管理方法
1. Resources.Loadを使って、Resourcesパスからの動的読み込みに変更。
→Resources.Loadを使って読み込んだAssetもキャッシュをされるので、変数の参照を外して(nullを代入して)からResources.UnloadUnusedAssets
private Texture2D mTexture; private void Appear() { mTexture = (Texture2D)Resources.Load("UI/Button"); } private void DisAppear() { mTexture = null; Resource.UnloadUnusedAssets(); }
※テクスチャのResources.Load/Unloadがメモリ使用量には一番効きます。
※Assetファイル名からの動的読み込みなので、ファイル名の正規化は重要。
Unityの流儀には反するがファイル名指定では無く、 UI/Button の様にパス指定でロードするのが重要
2. Resources.Loadは同期ロードなので必ず一瞬、停止してしまう
Resources.Loadを行うタイミングと読み込むオブジェクトのサイズを選別する事も重要
「海賊射的!」ではクマが景品を置き直す為に一瞬、後ろを向くタイミングでロード
GUI(ヘルプ画面)を閉じた時のUnload処理の効果はProfilerのグラフでもしっかりと確認可能。
※緑のラインがメモリのデータ。ガクンと値が下がっているが確認出来ます。
- データファイルはResourcesのフォルダに置く
- ヘルプは縦が2500ピクセルくらいの画像ファイル。常に持っておくのはキツイ
- GUI周りは動的ロードが結構楽。EzGUIなどテクスチャアトラスに変換してるようなものでは却って大変かも
- PhysicMaterialのデータまで外に持っている
【関連情報】
Unity Script Reference – Resources
http://unity3d.com/support/documentation/ScriptReference/Resources.html
まとめ
1. 1Sceneで作るメリットはユーザーメリット。ロード時間は嫌われる
2. シーンのオブジェクトの未インスタンス化Prefabでもシーンロード時にはキャッシュされる。
3. 動的読み込みには Resources.Load/UnloadUnusedAssets を使う。ただし、参照が残っているとUnloadされないので注意が必要。
4. テクスチャのメモリ動的読み込みがメモリの使用サイズ削減には最も有効
5. 何を動的読み込みにするかどうかは、使用頻度とサイズに応じて考慮する必要あり。