強火で進め

このブログではプログラム関連の記事を中心に書いてます。

「第4回 渋谷Unity技術勉強会xコロプラUnity事例発表」に参加して来ました

【満員御礼/増員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のビジョン

スマートフォン×ネイティブゲームのチーム

オフラインで動作するアプリである事

  • バイスや通信環境に依存しないプラットフォームとして。できるだけ多くの端末をカバーするために

グローバルである事

ゲームとして面白いものである事(Not クソゲー)

  • スマートフォンバイスの性能から、携帯の付加機能のゲームではなく、ゲームプラットフォームそのものとして考える。

絶賛!修行中!

Kuma the bear新タイトル「海賊射的!」、昨日(4/25)Android版リリース!

Google Playのリンク

1Sceneのメリット
  • ユーザのローディング待機の場面を減らせる
1Sceneのデメリット
  • メモリの使用量が肥大化
  • 最悪プログラムの終了なんてことも…
そもそもSceneとは…

Sceneはその名のとおり「舞台」
ここに、3Dモデル・GUI・音・プログラムなどの
舞台装置(Asset)を配置するという仕組みが大本に成っています。

Unity上ではHierarchyは開いているSceneそのものです。

1Sceneにした方が良いケース

Unityではシーンの切り替えは簡単に行う事ができます。

ただし、Scene初期化時には、Hierarchyに置いたオブジェクトなどのキャッシングをUnityが適切に行うため、シーンを開く時間がかかりがちです。

特にスマートフォンでは、そのロード時間が顕著に出ます。

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関連も動的に読み込んでいる。
  • GUIを開いた(表示した)時に読込み、閉じた時に開放。

GUI(ヘルプ画面)を閉じた時のUnload処理の効果はProfilerのグラフでもしっかりと確認可能。
※緑のラインがメモリのデータ。ガクンと値が下がっているが確認出来ます。

  • データファイルはResourcesのフォルダに置く
  • ヘルプは縦が2500ピクセルくらいの画像ファイル。常に持っておくのはキツイ
  • GUI周りは動的ロードが結構楽。EzGUIなどテクスチャアトラスに変換してるようなものでは却って大変かも

Resourcesフォルダのファイルレイアウト。

  • PhysicMaterialのデータまで外に持っている

【関連情報】

Unity Script Reference – Resources
http://unity3d.com/support/documentation/ScriptReference/Resources.html

まとめ

1. 1Sceneで作るメリットはユーザーメリット。ロード時間は嫌われる
2. シーンのオブジェクトの未インスタンス化Prefabでもシーンロード時にはキャッシュされる。
3. 動的読み込みには Resources.Load/UnloadUnusedAssets を使う。ただし、参照が残っているとUnloadされないので注意が必要。
4. テクスチャのメモリ動的読み込みがメモリの使用サイズ削減には最も有効
5. 何を動的読み込みにするかどうかは、使用頻度とサイズに応じて考慮する必要あり。

QA

Q : GCはメモリ削減は行なってい無いのでしょうか?
→Prefabのキャッシュ向けには効かない

Q : テクスチャサイスが大きいものはロード時間が長くなってしまいますがその対策は?
GUIは無圧縮
→MipMapを切る
→それぞれのモバイル環境向けの圧縮形式で圧縮したものを使用