第5回 渋谷Unity技術勉強会
ゆるロボ製作所開発事例        – ドローコール削減技 n 連発!




 株式会社ゲームポット
 スマートフォン開発部
 吉谷幹人
自己紹介


■吉谷幹人(ヨシヤミキト)と申します



■ゲームポットでモバイル向けアプリを開発してます
 ・ソーシャルゲームの開発に関わったり
 ・社会人2年目奮闘中


■Unity使い始めて半年
 ・3Dゲームの開発経験はまったくありませんでした
今日お話すること


■開発事例アプリ「ゆるロボ製作所」について


■デザイナ巻き込んだスクラム開発の話


■ドローコール削減について
ゆるロボ製作所
ゆるロボ製作所

■放置系キャラコンプゲーム
 ・ロボ生産マシンに材料と燃料をセット
 ・経過時間に応じてロボが製造
 ・図鑑コンプ目指す

■ゆるカワ3Dキャラ
 ・30体固有アクション



 ■傾けて出荷
 ・ロボを転がしてベルトコンベアに
ゆるロボ製作所


■リリース3日でApp Store
        ゲームカテゴリ(無料)1位


■Google Play ゲームカテゴリ(無料)1位



 ■完全無料
 ・AdMobの広告のみ
デザイナ巻き込んだスクラム開発
スクラムで開発



■開発手法としてスクラムを利用
 ・アジャイル開発の一種
 ・変化に柔軟に対応できる
 ・短期間の開発(スプリント)を何回もまわす
 ・スプリントごとにプレイ可能なゲームを作る
体制



 ■開発体制
     ・PM(スクラムマスター):1人 + 補佐1人
     ・デザイナー:メイン1人、3Dキャラヘルプ1人
     ・プログラマ:1人


 ■期間
     ・プロトタイピング:2週間
     ・製品版:2ヶ月(4スプリント)
スクラムで開発


 ■厳密なスクラムではない
  ・小規模、開発人数が少ない
  ・必要な要素のみ利用

 ■実践したこと
  ・プロダクトバックログでユーザーストーリー管理
  ・ストーリーポイントでの見積もり
  ・重要度による優先作業の明確化
  ・デイリースクラム(朝会)の実施
  ・タスクボードで進捗確認
  ・スプリント最終日でデモ、KPTで振り返り

  × タスク分解、バーンダウンチャート
    (効果よりオーバーヘッドのほうが大きいと判断)
使用したプラグインなど



 ■NGUI
 ・EZ GUIがEasyじゃないって何回も聴かされた
 ・他と比較した結果、使いやすさ・パフォーマンスが良かった
デザイナにもUnity使ってもらった


 ■全員が常にUnity上で最新版を確認
 ・デザイナにもバージョン管理システム(Git)使ってもらった




 ■素材の受け渡し・適用のオーバーヘッドゼロ
 ・デザイナが素材をUnityにプロジェクトに追加
 ・位置や細かいパラメータはデザイナが微調整
よくある開発の流れ

   プログラマ                        デザイナ

                               UIイメージ作成

                UIイメージチームで共有


    仮の素材でUI実装                    素材作成


                            素材Unityに取り込み
                   Gitで反映
     素材組み込み

                                 微調整

                  朝会などで確認


   フィードバック適用                   フィードバック適用
各スプリント内容



 ■ スプリント1
  ・基本システムの実装
  ・ロボ企画、3Dモデル(6体)
  ・ミニマムで遊べる状態




  ■ スプリント2
  ・チュートリアル
  ・ロボ行動ロジック
  ・ロボデザイン、3Dモデル(30体)着手
各スプリント内容



  ■ スプリント3
  ・広告の差し込み
  ・UIのブラッシュアップ
  ・ロボ3Dモデル完成(30体)




  ■ スプリント4
  ・ソーシャルメディア投稿機能
  ・ゲームバランス調整
  ・社内テストフィードバック適用(3回)
デザイナと一緒にUnity使ってスクラム開発して


 ■とにかく速い
 ・調整にかかるコストが減った



 ■スプリントごとにブラッシュアップが楽
 ・新しいUIの追加や改修が柔軟にできた



 ■各々の知識を補えた
 ・プログラマ(私)が全然グラフィック・3Dの知識ない
ドローコール削減
ゆるロボのゲームとしての要件



 ■ いろんなキャラをたくさん歩かせる
  ・15体ぐらいはわらわらさせたい



 ■いろんな機種でも対応させたい
  ・Android
  ・iPhone 3GS
ゆるロボのゲームとしての要件



 ■ いろんなキャラをたくさん歩かせる
  ・15体ぐらいはわらわらさせたい



 ■いろんな機種でも対応させたい
  ・Android
  ・iPhone 3GS




ドローコール減らす戦い
ドローコール数とは


 ■描画命令を送る回数


 ■コール数減らせばFPSが上がる


 ■GameペインのStatsから見れる
実際のドローコール目標値



  ■ 目安(iPhone4に関して)
  ・200コール:15fps
  ・100コール:30fps
  ・50コール:60fps




  ■ドローコール20を目標にした
   ・低スペックマシンでの動作も想定
ゆるロボを何も考えずにつくると


  ■ キャラ:32コール
   ・ロボ15体:15コール
   ・ねじこ(アシスタント):1コール
   ・影16体分:16コール

  ■ ロボ製造マシン:1コール

  ■ 背景:3 - 5コール

  ■ GUI:40 – 50コールくらい?
ゆるロボを何も考えずにつくると


  ■ キャラ:32コール
   ・ロボ15体:15コール
   ・ねじこ(アシスタント):1コール
   ・影16体分:16コール

  ■ ロボ製造マシン:1コール

  ■ 背景:3 - 5コール

  ■ GUI:40 – 50コールくらい?



20コールとか余裕でオーバー!
オーバーする主原因は?


  ■Blob Shadow Projector1つで1コール
    ・影の投影



  ■スキンメッシュオブジェクト1つで1コール
    ・ボーンアニメーションが入ってるオブジェクト




  ■OnGUIの呼び出し
    ・UnityデフォルトのGUI処理系
    ・ボタン表示等で1コール:OnGUI.Button();
改善法1:Blob Shadow Projector使わない



  ■非スキンメッシュの影ポリを足元に配置
     ・同じマテリアルならバッチ化され1コール




   ■注意:なるべくRayは飛ばさない
     ・地面の位置測定につかいたくなる
     ・Updateで行うと割と高負荷
     ・通常は固定値、必要になったら飛ばすなど
改善法2:スキンメッシュオブジェクトをまとめる


  ■背景オブジェクト全部まとめた
   ・全部ひっくるめて1コールに


  ■アニメーションはスクリプトで動かす
   ・出荷口の開く・閉じる
   ・ベルトコンベア
   ・工場のガジェット(歯車など)
改善法3:NGUIをうまく使う

  ■NGUI
   ・ドローコールを減らすためのポイントがある



  ■テクスチャをまとめる
   ・テクスチャ(アトラス)ごとにコールされる
   ・UIもフォントも一枚(1024x1024)におさめた



  ■パネルをまとめる
   ・UIPanelごとにコールされる
   ・GameObjectでグループ構造作って一つのパネルに
その他


■スカイボックスを利用しない
 ・もし空を表現する場合は半球にテクスチャ張って代用




■動かさないオブジェクトはStaticをOnに
 ・Static Batchingの対象にする



■Dynamic Batching分断に注意
 ・Transform.scaleが(-1,1,1) と(1,1,1)の物
                                      を交互に配置しない
 ・Renderer.receiveShadowsの設定が違う物
n連発の結果


  ■ キャラ:17コール
   ・ロボ15体:15コール
   ・ねじこ(アシスタント):1コール
   ・影16体分:1コール

  ■ ロボ製造マシン:1コール

  ■ 背景:1コール

  ■ NGUI:1コール
n連発の結果


  ■ キャラ:17コール
   ・ロボ15体:15コール
   ・ねじこ(アシスタント):1コール
   ・影16体分:1コール

  ■ ロボ製造マシン:1コール

  ■ 背景:1コール

  ■ NGUI:1コール



20コール達成!
まとめ
まとめ



 ■デザイナにもスクラムとUnity使ってもらった
  ・オーバーヘッドが激減
  ・ブラッシュアップが意欲的・柔軟にできる



 ■ドローコール減らすのが高速化の鍵
  ・バッチ化でコールをまとめる
  ・スキンメッシュオブジェクトに注意
  ・NGUIいいね




                         おわりです

ゆるロボ製作所開発事例 – ドローコール削減