強火で進め

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

「サイバーエージェント×Unity×デザイン塾」に行って来ました

応募ページ

サイバーエージェント×Unity×デザイン塾 | CREATIVE VILLAGE | クリーク・アンド・リバー社 | Creative Village
http://www.creativevillage.ne.jp/lp/cyberagent/

Unity開発者が見たウチ姫誕生の瞬間

  • 講師:アメーバ事業部 ウチ姫開発チーム クリエイター 新井隆祥

■ウチ姫リリースまでの流れ
2012年6月 キックオフブレスト

モチーフ

  • 舞踏会
  • 良い大奥を作る(大奥対決)
  • エストはナンパ
  • エストに姫を入れない

主人公

  • 二枚目
  • 自信過剰な自由人の王子様
  • 次男坊

バトル

  • 封印された戦士を助ける
  • ボーリングでタイマンをする
  • かわいい女の子さがし→ユーザ間で戦って女の子を奪い合う

  • シンデレラ・ストーリー
  • お姫様不思議力
  • 女の子同士の絡みがある(合間合間)

ゲームの仕様についてのMTGを行いながら、モックをつくりはじめる。

Unityの経験が無かったのでここで一通り覚えた

■最終的な着地
3投式 ボーリングバトル

ルール

  • 画面おくに行くとターン(1投)終了
  • 敵は貫通する
  • 3投終えると、敵が突っ込んで来る(攻撃)

非エンジニアが知ってると得するUnityの知識|1 pixel|サイバーエージェント公式クリエイターズブログ
http://ameblo.jp/ca-1pixel/entry-11718229785.html



■2012年11月 ウチ姫クライシス
悪い事情がいくつか重なり、今まで進めていたものを一度全て白紙に

メンバーが他のプロジェクトへ移動して行き、6人まで人員が減る


■2013年2月 雪解け
様々な事象を乗り越え離散したメンバーが戻ってくる

引いて離して反射して、の骨子が完成



■2013年8月13日 リリース!

リリース後、リーダースキル導入・BGM他刷新、
Andorid版リリース、ボイスの導入、アビリティ、ボススキルの登場、など日々運用開発中

そして、2015年、いよいよ、アノ機能が登場?!

※アノ機能とはローカルでのローカルでのマルチ(協力)プレイとの事


■現在のウチ姫
2015年3月現在 400万ダウンロード トップセールス 最高5位

意識している部分

  • 誰でも直感的に出来る
  • 毎日やっても飽きない(面白すぎない。ゲーム部分そのものにハマりすぎない)

「爽快」である事を自分の一番のこだわりにした


■直感的かどうか
社内でゲームをあまりしなさそうな女性にプレイしてもらってその手元を上から録画し、どのようにプレイして、どのような事をしゃべり、どのような事でつまづき、どのように集中をきらし、連打してチュートリアルを読み飛ばすかが分かった

奥にフリックする人が多かった


■手触り感
カエルのスピード、ヒットした感覚、滞在時間、カメラの動き、角度、減速する・しない、ジャンプボタン、Transformの反転、引いた距離で移動距離が変わるなど思いつくものは大体試した
※ジャンプボタンはちょっと遅れて反応する様な印象を受けたので搭載しない事にしたそうです。


■立ち位置まとめ
デベロッパー側にある程度の裁量を持たせて貰っている。ある程度こうしたいという事はプランナーやディレクター、デザイナーから聴くが、最終的には開発側でイメージをふくらませて実装している。

ウチ姫の実装で注意した事された事

■Find系メソッドはなるべく使わない
transform.Find、GameObject.Findなど、prefabの構造や名前を変えたら、実行時にゲームが落ちる。

GameObjectはコンポーネントでSerializeFieldする

[SerializeField]
private GameObject damegeAreaObj;
...
DamageArea damage = damageAreaObj.GetComponent<DamageArea>();
damage.Exe();

と、GameObject自体でSerializeFieldするよりは、

[SerializeField]
private DamageArea damage;
...
damage.Exe();

と、コンポーネントでしたほうがコード量が減る。


■prefab名とクラス名を同じ名前にする
違う場合、実装者以外の人が処理を探すのが大変で非効率。新しい人が入った時に特に問題


■SendMessageはなるべく使わない
使い方次第では便利だけど、文字列指定ではソースが追い辛くなる。デバッグもしづらい。
また、Find Referencesなど、エディタが持っている便利機能の恩恵を受けれず、結果 cmd+shift+Fで全文検索して、ダブルクリックの繰り返しに。

Xamarinの場合にはFind Referencesの機能で定義位置に直に飛べる。

まとめ

小規模だとまだ良いが、運用が重なって規模が大きくなると、かなり厄介。

特に新しい人が入ってきた時、古くから居る人が抜けたときに混乱が起きやすい

仕様や構造を変える事を恐れない設計を心掛ける!

QA

Q : エフェクトはUnityで?
A : Shurikenで作った


Q : ステージの作成やバランス調整は何人で?
A : 3〜5人。イベントがある時などは増える


Q : モーションは?
A : iTweenを使っていたけど途中からHOTweenに変更した。iTweenは記述が多くなり、煩雑になってきた為


Q : 2Dの演出アニメやガチャ演出の実装は?
A : HOTweenで実装


Q : UIは?
A : NGUI


Q : Unityのバージョンは?
A : もとは3.4か3.5。そのあと4や4.5に。5は保留


Q : マルチプレーヤーの処理の実装方法は?
A : クライアントにオーナーを立てて、他の人が参加する形。オーナーがサーバにデータを送る


Q : 新人へのGitや使うツールの情報共有は?
A : 社内のWiki


Q : チート対策は
A : クライアントではやっていない。サーバには設定している。何投したかなどをチェック


Q : サウンドで工夫した事は
A : サウンドマネージャーを自作。BGMは1つのみ鳴る。SEは8個まで、それ以上は鳴らない


Q : 課金周りはアセットを使ってる?
A : 昔はPrime[31]。いまは自作


Q : 64bit対応は?
A : 4.6で対応


Q : 長年運営しているとバランス調整が大変になるかと思いますがどうしてますか?
A : プランナーの一存。2chチェック。告知をした後に調整


Q : ユーザーの情報はどこから収集している?
A : Twitterやカスタマーサポートに届いたものをチェック

ウチ姫におけるビルド環境自動化と実行時負荷軽減手法

  • 講師:アメーバ事業部 ウチ姫開発チーム エンジニア 渡邉俊光



■AssetBundle作成時の効率化方法
Unityの外部ファイル配信方法の主な方法としてAssetBundleが用意されている

UnityEngnie.Objectなら簡単にパックして圧縮してくれるので便利ですが...


■AssetBundleの欠点

  • ビルドする必要のあるファイルかどうかが分からない
  • 依存関係を含むビルドをしようとすると複雑なスクリプトが必要
  • プラットフォーム毎に個別でビルドする必要がある



■ウチ姫での生成方法
1. スクリプト呼び出し
2. シェーダ等の共通ファイルをビルド(複数回のシェーダコンパイルによるランタイム生成負荷を防ぐため)
3. PushAssetDependencies
4. 指定フォルダ以下のフォルダ内を全てハッシュ計算し、変更が有ったもの or Unityのバージョンが違う場合ビルド
5. PopAssetDependencies
6. 完了
7. 出力ファイルをSVNにコミット


■差分ビルド方法
ビルド結果を一覧化するためにもエクセルのシートを自動出力するようにした
モンスターなどのタイプごとにSheetを分け、中のセルを自動更新しています。ライブラリにはNPOIを使用

Unity 5では...

こんな面倒なことはしなくていい!

ウチ姫はUnity 4系なので使えませんが...


■新規開発では

  • BuildAssetBundlesを呼べば変更があるファイルだけビルドされる
  • スクリプトの数値1つ変えるだけでも確実にビルドしてくれる



■環境に合わせたアプリの出力フロー

  • モバイルアプリでは運用のために複数のサーバが存在する

例) Develop/Staging/Product

  • 環境ごとに設定を変える為のEditor拡張をウチ姫で使用



■一連のフロー
1. 環境ごとの設定(BundleIDやC#の定義等)をリポジトリにコミット
2. その設定を使用してJenkinsでUnityのバッチビルド
3. HockeyAppに環境ごとにアップロード
4. 申請ipaはApplicationLoaderで送信


■環境ごとにビルド設定を行う

  • 切り替え用のEditorWindowを作成
  • Saveを押すとScriptableObjectにデータを書き込む
  • 全てC#で実装することでビルド時の環境の違いを減らす
  • レイヤー、タグ、シーン名も定数としてC#ファイルを同時出力



■Jenkinsジョブ実行

-batchMode -executeMethod 実行メソッド STG,iOS -quit

ビルド時に引数を以下のメソッドで取得

var commands = System.Environment.GetCommandLineArgs();

これで複数の追加プロパティをbatchModeでUnityのメソッドに送る事ができる。


■HockeyAppとは?

  • Android,iOS等のアプリケーションを配信するサービス(類似サービスTestFlight)
  • 12月にMicrosoftに買収された
  • 端末のブラウザから簡単にインストールでき、バージョン違いを見る事も可能



■HockeyAppに登録

  • JenkinsのHockeyApp Pluginを使用してipa,apkをアップロード
  • 申請版を含め各種環境ごとに上げることで全環境の最新版を確認することが可能



■実行時の描画負荷軽減方法

1. フィルレート(主に透過系)
2. SkinnedMeshのポリゴン、ボーン数
3. シェーダ
4. DrawCall


■フィルレート

  • グラフィックチップ(GPU)の性能値の一つ描画ターゲットのピクセル書き込み速度を表す
  • 不透過で描画できる3Dよりも透過になりがちなUI側で非常に消費する
  • UnityEditor上のProfilerでは差が出る事はほぼ無いので注意



ベンチマーク




■ウチ姫では

  • 背景画像など透過する必要のないオブジェクトはUnlit/Textureを利用
  • 画面全体に描画する半透明の背景などのデザインは極力避ける

最近はGPUの性能が非常に高いのでここまでやる必要はもう無いのかも知れませんが...


■描画領域の確認

色が濃い所ほど何度も描画が行われている

まとめ
  • AssetBundleはシェーダファイルはまとめ、変更を検知するシステムを作成
  • ビルドフローを自動化し、申請時の負荷を軽減
  • 常に描画される面積とそのピクセルに走るシェーダコードを意識するように
QA

Q : AssetBundleの展開時のメモリ問題は
A : リソースマネージャーを作成。リファレンスカウンタ形式で管理


Q : ドローコールの基準は?
A : 20〜30くらい。バッチが効く様な構造にして貰っている

Unity4.6から入ったuGUIを使ったUIシステムについて

  • 講師:荒川巧也

宴の時村さんのuGUI本オススメ



■スライド