強火で進め

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

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

【満員御礼/増員350名】第2回 渋谷Unity技術勉強会xコロプラ事例発表 : ATND
http://atnd.org/events/24706

Togetterまとめ。

2012/03/01_第2回 渋谷Unity技術勉強会xコロプラ事例発表( #ShibuyaUnity ) - Togetter
http://togetter.com/li/266118

Unity入門 第1回 - 赤坂玲音(@LeonAkasaka)さん

スライド資料はこちら
※赤坂玲音さんの講演はスライド資料が公開されているので自分が特に気になった部分とスライドに含まれていない解説やQAの部分についてだけ記述して置きます。

  • 以下の様な本を出されています。

Windowsゲームプログラミング 第2版 Game Developer

Windowsゲームプログラミング 第2版 Game Developer

これからはじめるVisualC++2010forマネージコードC++/CLI

これからはじめるVisualC++2010forマネージコードC++/CLI

  • 自身でゲームを作るような事はほとんど無いけどゲーム会社に新しい技術の指導に行く様な事は有るとの事でした
  • フリーランス

こちらのサイトでUnityの入門記事を掲載中。

本勉強会のこれからの予定

3月1日(本日)

  • Unityの基本的な構造を俯瞰
  • 構造上の注意点など

3月29日

  • グラフィックス
  • リソースの実行時生成などプロシージャルな手法

4月26日

  • Unity Editorの拡張
.NET Framework によくある誤解

iOSでは規約の問題でAOTによる事前コンパイルのみ
(筆者注)
AOT(Ahead-Of-Time)

事前コンパイラ - Wikipedia
http://ja.wikipedia.org/wiki/%E4%BA%8B%E5%89%8D%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9

アセンブラの実演

Visual Stduioに付属している逆アセンブラでメソッドを確認する実演。


会場への質問

プロジェクトにBooを使っている人居ますか?→会場の挙手 0

他のC#を使ったプロジェクトにも使える汎用的なライブラリを作る時の注意点
  • 作成するものは一般的な.NET FrameworkのDLLでOK
  • MonoBehaviourを継承する様なものだと他の環境では使えない
  • .NET Framework 2.0相当の機能に限定する
    • 最新バージョンは4.0だが、Unityで利用することを考えるとスマートフォン向けのプロファイルが2.0相当
Unity依存のライブラリを作成する時の注意点
  • 可能な限り型安全に。SendMessageなどは極力避ける
Unityでオブジェクトと言っている場合には全部で3つの可能が有るので注意
  • System.Object
    • 全てのオブジェクトの基底クラス
  • UnityEngine.Object
    • UnityEngineによって管理されるオブジェクト
    • ゲームオブジェクト、コンポーネント、アセットの基底クラス
  • UnityEngine.GameObject
    • UnityEngine.Objectから派生
    • シーンに配置されているオブジェクト
GCの話
  • GameObjectは常にUnityエンジンから参照されている
    • スクリプトで参照が失われてもGCの対象にならない
    • Destroy()メソッドによる明示的な削除
      • 複数のスクリプトで共有しているオブジェクトの破棄に注意
勘違いされがちな this
  • スクリプト自身はMonoBehaviourのインスタンス
    • よくthisの結果をゲームオブジェクトと混同している
      • Destroy(this) は何を消すのか
    • thisはスクリプト自身でありゲームオブジェクトではない
      • ゲームオブジェクトは this.gameObject
自動メモリ管理でもメモリリークする
  • 不要なオブジェクトを参照し続けるとガベージとしてマークできないためメモリリークする
    • 配列の要素として格納したまま忘れる
    • デリゲートをイベントに追加したまま忘れる
QA

UnityのUnitテストはどの様にしてますか?

  • オープンソースの物を使う
  • ライブラリ化し、ライブラリをしっかりテストする

コロプラのUnity事情2 〜リズムコイン!〜 - 株式会社コロプラ 馬場 功淳さん

  • 月に3本ゲームをリリースするのが目標
  • Unityチームは現在13人
  • Unity製のゲームは全世界合計で250万〜300万DLくらい
難易度調整Tips
  • プレイの完全自動化と高速化をしよう
  • 注意点
    • ゲーム内の時間に左右される処理は「Time.deltaTime」等の値を考慮してスクリプトを組む
    • Animationが正しく挙動しないことがある
    • コリジョン、物理計算などが不安定になる
  • メリット
    • バランス調整という、一番時間が掛かり尚かつ重要な作業を短縮できる
    • 複数台の端末でゴリゴリ回すと、眠っていた不具合が突然出てくる事などもある
  • テスト用に自動でコインを落とすモード
  • 10倍速度で動作するモード
  • 自動的に何時間も動作させる様なテストも行った
  • 結果データを保存していて後でExcelで見れる様にしている
  • 特定の機種のみ発生するバグ→このモードで動かす事でデバッグした
チューニング1
  • Deep Profileで(ONにした状態で)プロファイリングしながら探す
  • Deep profileはONでメソッドの奥まで確認出来る。
  • 感覚で探さない。プロファイリングして負荷の上位(ボトルネック)から順に最適化しよう!
チューニング2

ヒエラルキーなどツリーを検索する以下のメソッドは極力使わない

GameObject.Find("Name")
GameObject.FindObjectsWithTag("TagName")
GameObject.GetComponents()
GameObject.SetActiveRecursively(bool)
※特にUpdate()では絶対に使用禁止☆

× GameObject obj = GameObject.Find("Wall");
◯ public GameObject wall;

チューニング3

DateTime型/TimeSpan型を使わない

TimeSpan delta = DateTime.Now - startTime;
long elapsed = delta.TotalMilliseconds;

といった処理をUpdate()で毎フレーム行うと計算コストが非常に高い。しかもこれだとゲーム内時間ではなく実経過時間となってしまうので、ゲームオブジェクトの管理に使うにはとても都合が悪い。

private float delta = 0.0f;
delta += Time.deltaTime;

など

(※関連するTwitterでのツイート)

チューニング5

(筆者注:あれ?チューニング4をメモするの忘れたかな?)

  • RayCastを節約する
  • くまの影(の板ポリ)の座標を求めるためにUpdate毎にRayCastしていた(Deep ProfileでCPU Load 2.5%くらい)
  • RayCastする回数を抑える。ジャンプする以外は使わないので、状態判定を行なって飛んでないときは処理をカット → 2%改善


チューニング6

パーティクルは大きく少なく

処理負荷はパーティクルの数に比例する
→粒の数を減らして大粒にする。表示されない方向に飛ばないように速度を与えるように設定値をしっかり見直す

例) コインの変化等のパーティクルが200出てた(とんでもなく重い)→20まで減らして大粒に

機種依存情報1

フィーバータイム中の背景のクマスクリーン

  • Screenモデルを用意
  • Mesh RendererのマテリアルにRender Texture

▲現象
該当機種:Docomo Galaxy S
フィーバータイム開始時、もしくは終了時にアプリケーションが停止する。(GUITextureに転送して2Dとして表示するぶんには問題無し)

▲原因
起動時にセットするとフリーズ

▲対処
必要な時に設定する。不要になったら削除

KumaCamera.camera.targetTexture = RenderTexture;
KumaCamera.active = true;

機種依存情報2

▲現象
該当機種:Docomo Galaxy S2
極まれに端末リブート

▲原因
Audio Sourceが付加されたゲームオブジェクトで

audio.clip = Source
audio.Play()

というロジックでサウンドを短いスパン(1秒間に複数回)を何度も繰り返すことによって発生

▲回避方法
元からAudio Sourceに対してAudio Clipを設定しておき

audio.PlayOnShot();

に変更することによってクラッシュを回避

  • コードを1個1個削っては自動動作を2時間位流してクラッシュするを繰り返して確認。バグを見つけるのに2日かかった。
  • 本などでは「回避方法」の様な記述が書かれている。しかし、今回は音のクロスフェードをしたかった為にこの様な実装にしていた。

(筆者注:LTが懇親会の時に行われていて、他の方々と話ていてLTが始まっているの気がつくのが遅れてあまりメモが取れていません。メモれた部分だけ書いときます)

(LT)三次元解剖学書ネタか、今作ってる猫アプリのネタ by 金田さん

  • 3Dの人体模型アプリを作った時の話
  • 作成する必要が有る3Dモデルの数が膨大で有ったため依頼を受けた大学でアルバイトを募った
  • 80人もの応募が有った
  • そんなには面接は出来ない為、指定した部位の筋肉のモデルをメタセコイアで作って貰う事
  • 40人も提出が有った
  • その中から数人(※人数を言われていたはずですが忘れちゃいました。3人くらいだったと思います)を採用

(LT)2Dアセット系まとめ - 時村 良平さん

スライド資料はこちら
こちらもスライド資料が有るので自分が気になった所だけ。

  • 2DToolKitは「2Dの見た目とPhysicsの組み合わせが可能」。Angly Birdsみたいな簡単に作成出来る。この時、物理演算はUnity標準のものが使用可能
  • 2Dの見た目とPhysicsが一致しているためこの様なトゲトゲなもの場合にもトゲの部分にのみ当たり判定が有る

  • ex2DはUIについては×(筆者注:一応、ボタンくらいは作れる仕組みが有ります。でもまぁ、基本的には非対応な感じです)
まとめ
  • 2DToolKit
    • 絵に合わせた当り判定が必要なアプリ
    • AngryBirdsなど
  • eX2D
    • ちゃんとしたコマ送りアニメが必要な2Dゲーム
  • NGUI
    • GUI主体のゲームならこれがベター
  • EZGUI
    • もう役割は終えた?