mattak's blog

気の向くままに書く

Unite 2015 Day2 めも

Session1: Autodesk Session & Workshop

建築用のデータ (BIM) -> ゲーム用のデータ (FBX)

階層で分ける

  • みえるところ
  • 床、地面など

ゲームに特化する

  • 建築は厚みがあるが、ゲームでは板ポリでよいものがおおい
  • 底の厚さを削除. ある程度の粒度でまとめてしまう
  • 階段一枚の板ポリにする

UV

  • 必要ならMayaでUVつくる
  • 気軽に取り組めばよい

Material

  • Mayaで管理しやすいように色分けする. データを作り分ける
  • 要素ごとの色分け. 壁、床、エレベータ、・・・

Data Conversion

  • REVit ARCHITECTURE -(fbx)-> Maya -(fbx)-> Unity

Unityでの配置

  • Texture / Materialの設定
  • 2pattern: 一つ一つ作って配置? Mayaで全部作って1ファイルで持ってくる?
  • ひとつひとつ配置すると結構大変. ある程度壁をまとめるとよい

Lighting

  • Unityの中でbakeしている

重要な点

  • BIMデータはリッチだが、ゲームには大げさ.
  • 小さくデフォルメするのが良い
  • あくまでテンプレート程度に考える

Session2: Unityのシーンを紐とき把握するには?

山村

  • Unity Field Engineer
  • 技術的な相談

今回の話

  • プロジェクトをさくっと読む方法 => 再利用性を高く
  • サンプルシーンの解析
  • コード書くの面倒
  • 昔作ったプロジェクトが読めない
  • もっと楽に解析できれば...

Unityの構造

  • Project > Scene > Object > Component > Assets

コンポーネントはコールバック

  • Start / Update / FixedUpdate / OnCollisionEnter2D ...
  • 基本コールバックから始まる

GameObject間では参照が必要

  • GetCompoentns / AddCompoennt /..

生成ルール

  • Object: Instantiate / New GameObject..
  • Resource: Resources / AssetBundle / AddComponent / Prefabs...

どのコンポーネントがいつ動くのか?

  • ランタイムで減ったり増えたりする
  • OnCollider / SendMessage / ...

Compoennt List => Callback List

  • 実行時にEditor拡張で設定

コンポーネント参照元の確認

  • 無理. すべてのリストを列挙すれば参照元がわかる

参照先の座標の確認

  • 矢印を貼るとわかりやすい
  • 参照. 被参照. Editor上にを引く
  • 閉じたら線を表示しないなどで参照数を減らす

参照関係のないオブジェクト

  • 自己完結型.
  • 砂漠から砂を拾うような感じになる
  • それ以外をHierarchyに表示するようにすればスッキリ

コンポーネントの依存関係

グラフ化

  • 参照をグラフに
  • dot / gmlのフォーマットで。
  • コード解析がなければ正規表現で.
  • yEd

Model

  • Component間の参照とは別に、なんかのクラスがあるとき => GameManager的なゲームの進行管理に使われているかも

Manager系のObject

  • Singleton
  • 役割は様々
  • 何かイベントを食らったら操作を行う系がおおい

ギミック系オブジェクト

  • 自己完結型のオブジェクト
  • ステージ作る系のギミックとか

Updateで頑張るドン

  • Updateやコルーチンで自発的に動く

そのObjectはどうやって参照された?

参照先の状態を知る

  • 「誰をみる」ではなく「どうやって見るかる」なので。

参照関係を把握する

  • 自分で動かす or 管理される
  • 動き出すと参照がつくのがある

検索パターン

  • FindWithTagで検索される
  • Uniqueなタグを保つ場合FindWithTagで検索される

対マネージャー (シングルトン)

なぜ参照を保つ必要がある?

  • キャッシュ
  • 位置を知る
  • ...

そのオブジェクトはどっから持ってきたのか?

生成コードの検索

  • シーン内に最初から配置?
  • Instantiateで検索? ObjectPpoolで検索?

該当のPrefabをもつシーンを探す

  • Reference Viewer (Unite2014) anchan828/unitejapan2014/tree/master/ReferenceViewer
  • LoadLevelAdaptiveの場合、ロードするシーンを探す

シーン (YAML) をGREP検索

  • SerializedObject <=> YAML / 検索
  • Smart Marge : シーンやプレハブをマージ可能に

近いうちに公開する予定

  • 5分くらいでガガッと把握できるように

Session3: エディター拡張マニアックス 2015

  • 安藤圭吾
  • Field Engineer
  • Unity部 もくもく会
  • SlackにUnityコミュニティつくった

Unity 5.1ベースの話

  • 資料は後日Uniteページに公開
  • ソースも公開予定
  • Animation Data Auto Generationについて話す
  • Sprite Animationを題材

Sprite Animationの作成

    1. プロジェクトview -> Scene ViewにDrag&Drop. AnimationClip & AnimationController生成
    1. Animation WindowでCreate New Clipでやる
    1. 選択 Create -> Animationでアニメーションクリップが生成される
  • Inspectorを Debugモードにすると下の方に配列でSpriteが表示される
  • でも画像で見たい

CustomPreviewを使って実装するといい?

  • defaultは変更できない.. ? => 変更可
  • AssetPreview.GetAssetPreview(target) -> sprite -> textureを取得
  • custom previewにはtextureは表示できない

Sprite Animationをスクリプトで作成する

ObjectReferenceKeyFrame

  • keyframeのobject版
  • floatの代わりにObjectを設定可能

EditorCurveBinding

  • ...

Property名を知るには?

  • component -> SerializedObjectに変換
  • property取得
  • バックログで吐く
  • YAMLじゃなくてもSerialized Objectを直接触ればいける
  • 手段としてYAMLを直接いじるのはあり

Animator Override Controller

  • Spriteだけ変更
  • Animationは同じ
GetComponent<Animator>().runtimeAnimatorController = overrideController;

複数のAnimatorOverride Controllerを作成するなら

  • ScriptableWizardで作成する

ReorderbleList

UnityEditorInternalだけど使えばいい

EditorのLifeCyble

  • EditorApplication.update
  • Package Import
  • Update Window
  • Update Inspector
  • EditorApplication.delayCall

都合がわるくなったとき

  • EditorApplication.delayCall += () => {}

Unity5の新機能

  • InitializeOnLoadMethod
  • UnityEditor.Menuの追加
  • UnityEngine.HelpURLAttribute
[HelpURL("http://...")]
public class Example: {}

GUI.Scope

  • Scopeの作成が楽に
using (new BackgroundColorScope(Color.yellow)) {
GUILayout.Button("")
}

SceneViewクラス

  • Editor.OnSceneではなく、GlobalなonSceneGUIDelegateがある

ProjectWindowUtil.CreateAssetは覚えておくと良い

  • project treeのアイテムを作成できる

ActiveEditorTrackerクラス UnityStatsクラス ComponentUtilityクラス

  • componentコピーが行える

Unity上でTwitterが見たい

  • reflectionを利用して、publicクラスじゃないものを使う
  • UnityEditor.Webview...

アセンブリブラウザでみる

  • EditorGUIの中身がみれる
  • ScriptableObject / Window.GUIの中身は必見

Session4: MOBIUS FF における Unity開発事例

  • はまぐち
  • りーどぷろぐらま

コンセプト

  • スマフォで動くHDクオリティのゲームの驚きを、より多くの人に

ナンバリングタイトルを手がけてきたスタッフ陣が作成!!

Theme

  • リッチなクオリティをスマホでやるには?
    1. 大規模開発でのUnityの注意点
    1. HDクオリティのゲーム制作をする心得

大規模開発での心得

基本

  • 同じファイルを同時に触る人が増える

複数人のデータ編集のイメージ

  • プランナー、ヒット判定、サウンドセクション、エフェクト・セクション
  • それぞれの専門の人が自分でデータを入れたくなる

Hierarchyで編集する.scene, .prefabを同時に編集できるか?

  • ここが一番のネックだった
  • Unityはこれが非常に苦手

Hierarchyで依存関係を作らない

attack.prefab
|- motion.prefab
|- plan.prefab
|- sound.prefab

基本:

  • 一つのアセットとしてattachを設定する
  • Hierarchy上で依存をつくらず、Inspectorで設定
  • コミットを検知してCommitHookサーバーが最新の依存関係をattack.prefabに更新してcommit
  • NOTE: 依存関係は .metaに記載されているguidによって構築されるので

視認性が落ちる

  • Unity上にツールをつくった
  • hierarchy / Inspectorでは編集を諦めて専用のタイムラインツール

MOBIUSの開発環境

  • Graphics -> Maya -> prefab
  • Sound -> soundは自社ツール
  • Timeline -> タイムラインツールは自作
  • xls -> .asset (yaml) -> unityで取りやすいクラスに吐き出す
  • menu -> nGUI
  • effect -> ShurikenMaker

データ確認フロー

  • AssetBundle Build Server.
  • Console ModeでUnityEditorを起動
  • 全部のAssetBundleを作成するのに3時間
  • ゲームサーバー側のストレージにup
  • 3-4時間後に実機で確認できる

モバイルでHDクオリティを作成するための心得

Unityが遅いというかC#の特性を知る必要がある

  1. strutはstackに確保されるが、classはheapなのでgc頻度上げる
  2. 文字列層は気をつけて class enumのtoString()はおそい
  3. foreachを使うとEnumerableがヒープ確保されるので、これもgc頻度を上げる
  4. Vector演算を真面目にやるとかなりキツイ

特性をしればそんなに遅くならない

  • foreachでIEnumerableでallocationしてるとか、

最適化はNative化を検討

  • IKや揺れ者の物理はnativeで実装
  • Asset/Pluginにdllにおいて簡単にnative呼び出しできる

まずは敵を知るところから

アプリが使えるメモリ量

iOS 350-600MB Android 400-1.1G

  • メモリ管理の仕組みがAndroid/iOSで違っている
  • Androidはメモリを積まざる負えない...
  • Unityで作っている以上GCは意識しなくてはならない

Android先行で開発したほうがうまくいく?

  • 同スペックでも、iOSのほうが性能がでやすい
  • またAndroidはAPKは作成が早い
  • IL2CPPが遅い

DownloadSize

| パッケージサイズ | 70MB(32bit/64bit universal) / 40MB | | 初回起動DLサイズ | SD 350MB / 500MB | HD 700MB / 1G |

  • サイズ的に倍くらい違う

Texture

  • RGB PVRTC 4bit (iOS)
  • RGB ETC 4bit (Android)
  • RGBA PVRTC 4bit (iOS)
  • RGBA ETC2 8bit (Android)
  • specular / diffuse など加えると3倍

それぞれのGPUに最適なテクスチャ形式を

  • ほとんどsnapdragon
  • GPUごとに得意なフォーマットが違う
  • 試み: 端末最適化データ, テクスチャのサイズは落ちるけど、画質は上がる

だがデザイナ管理は1画像データに

  • 出力できるtextureフォーマットを指定できる
  • iOSはpvrtcなのでOK
  • Androidはいろんなフォーマットで出したい

AssetBundleBuildServer側で対応

  • 10代以上のAssetBundle Build Serverがあるので最適化
  • Textureファイルのフォーマットが変更させると. cacheがリセット...
  • ビルドが24時間で終らない・・・
  • Unity起動前に textureFormat: -1に上書きして起動する
  • キャッシュが壊れると1日作業できないとかある・・

Shaderは必ず1つにパックして初回に初期化

  • ConsoleGame: Compile済みのshaderを提供できる
  • MobileGame: ゲーム起動時にshader compile
  • モデル読み込み時に毎度コンパイルされてカクつく
  • AssetBundleで参照設定を別にして、毎度buildが走らないようにする
  • NOTE: AssetBundle作るときにきちんと定義しないとコピーされて含まれるので注意

おまけ

UnityChanとこらぼする

Session5: 白猫プロジェクトの裏側! - パフォーマンス・チューニングとリアルタイム通信のすべて -

  • 池田洋一
  • UnityEngineer

白猫

  • 3D、4人リアルタイム対戦

開発フロー

  • 2-3人
  • α 4ヶ月
  • β 4ヶ月
  • 18人

特徴

最適化事例

  • キャッシュ
  • フラグメントシェーダ見直し
  • ..

オブジェクトのキャッシュ

  • ボトルネックはInstantiate
  • ほどんどキャッシュされてなかった
  • もっとも不可が高い. hp判定
  • Destroyはしない

Audio Clipのキャッシュ

  • ボトルネックはLoad
  • 必要になった時にキャッシュ (一回でもなればキャッシュが使われる)
  • battle内での最適化

Effectのキャッシュ

  • 断念. Activeにした時に別座標になる
  • 足の砂煙とか
  • ParticleSystem以外の制御もあった

GPU Buttoleneck

  • マップ画面で処理落ち
  • 海のシェーダ FragmentShader
  • sinとかFragmentShaderないで使わないでほしい
  • vertex shaderに全部移した. 掛け算とかは展開

Shaderの一括変換

  • つかってないcolor計算のshaderを一括置換
  • PC用の買ってきたshaderを変換

起動時間の高速化

  • Android 25sec / iOS 1min
  • Cashing.readyは遅い. (3万種類のAssetBundle)

独自のキャッシュシステムを作成

  • Caching.readyを待たないで早く起動
  • www.LoadFromCacheOrDownloadを使わない
  • PlayerPrefsのversion diffをチェック
  • 結果: 1分 -> 8秒にios

AssetVersionListの作成

  • Path / VersionNumber
  • AssetBundle / AssetVersionListを同時にアップ

ファイル読込数の問題

  • ロードが早い
  • カットシーンで大量のAssetBundleをDLしていた

複数のファイルDL処理の呼び出し

  • RequestAssetsCoroutine

読み込み数問題

  • 問題点:ちょっと設定値をあげると発現 iOS
  • 1ファイルづつcloseしてcompleした

不必要なDLL、コードの削除

  • AssetStoreで購入したもののサンプルは完全に削除するか. Editorフォルダ内に入れる
  • 1つでもjsがあるとBoo.Lang.dllがリンクされる => 不要なので削除

StrippingLevelの変更

  • UnityEngine間で必要なComponentまでStripされた

LinkerSceneを作成

  • Stripされすぎるのを防ぐ
  • Awakeで削除

AssetBundleのメモリリークの修正

  • RC形式を採用
  • Release前にDestroyされてしまい, AssetBundleが解放されなかった

Xcodeを使って調査

  • FrameDebuggerは超便利
  • VRAMの中身をチェックして破棄されてなければならないテクスチャを調査

今後の課題

  • CharacterControllerをやめたい
  • UIの構築用でない軽量な2d Assetを探す?
  • キャッシュで来て大量に表示できるエフェクトシステム
  • ダメージパケットなど大量に送信するもののバッチング...
  • 全部やれば1.5倍くらいのキャラ出せるのでは?

リアルタイムサーバー

  • 廣本洋一
  • Serverエンジニア
  • 白猫、黒猫

Agenda

  • Server System
  • Realtime
  • Awareness note

白猫のsystem

  • amazon aws
  • 普通のramp
  • web socket serverを通してリアルタイムプレイ
  • php, node, apache, nginx, redis, mysql

Realtime

  • キャラ変更、ボスの動き
  • 雑魚キャラは動きは同期されてない (HPのみ同期)

WebSocket Server

  • nginx -> node -> RabbitMQ => php - (batch) -> mysql
  • deployすると nodejsのconnection切れてしまう
  • nodejs側はコードを固く、汎用的にしている
  • php側のバッチコードで代替対応
  • 半年移行nodejsのコードは変更していない

マルチプレイ同期データ

  • hogt: Boss , self character, stage gimic
  • gest: self character, ほかはhostからもらう

通信保証データ

  • データが受け取れていないと進行不能になるような重要なデータは通信保証データとして受取済みであることを送信者に送信する
  • websocketには3handshakeてきな保証がないので自分で実装
  • 反応がないならばgame connection切る

クライアントとサーバーのデータ不一致

  • requestは成功するけど、resposeがとれない
  • webserver -> db -> webserver -> user
  • responseが帰ってない
  • client側がtokenを生成してrequest -> キャッシュサーバーでtokenベースでキャッシュ
  • webの世界の2重リクエストの阻止と同じ
  • GameResult画面でエラーがみたいなケースを防げる

クライアントの数値データの上限値

  • ちゃんとDBの最大値を入れてテストする
  • client側に入れてテスト -> 失敗
  • クライアントの修正を伴う不具合になるのでやばい
  • Bigint (server) <=> int (client) で不整合など

Session6: Unity x Sprite Animation

  • Whomor
  • 木下 (engineer) / 遠藤 (director)
  • Maya & unity3d 本, spine本

ゲーム要素

  • Architect (仕様)
  • Art <= 今回の主題
  • Program
  • Senario
  • Music

Artの表現

  • イラスト/UI/3DCS/..

スプライトアニメーションの構成

  • イラスト + スプライト + アニメーション => スプライトアニメーション

種類

  • コマアニメ: 容量食う
  • keyframe方式: flashアニメーションとか. 実装工数高い

チャレンジ内容

  • スプライトの表示: 画像の拡縮. トゥイーンとか
  • ただひとつのアニメーション: コマアニメ
  • 複数のアニメーション: エンジニアのみだと大変.
  • 連番画像を大量に. セット指定. つなぎ指定
  • これらをすべてに提供するのはムズい
  • 専用ソフトつかうのがいい

歴史

  • 93' AffterEffects -> 13' Spine/Puppet2D/SpriterPro

3つ紹介

  • Autodesk Maya
  • Spine
  • Puppet2D
  • SpriteStudio

アニメーションのワークフロー

  • メッシュ機能をつかったdeform animationいい

デザイナ共通手順

  1. イラスト書く
  2. パーツ分割
  3. scriptで画像を書き出し (手で作業するのは大変)

Mayaのワークフロー

  1. パーツの数だけshaderを作る
  2. パーツのレイヤーを設定
  3. IKを設定
  4. アニメーション設定
  5. fbxをexportする

特徴:

  • 作業大変
  • MELScriptで効率化すればいいかも?

Spineのワークフロー

  1. ...

特徴:

  • なれると簡単

Puppet2Dのワークフロー

  1. ...

特徴:

  • なれると簡単
  • Unityになれてれば簡単・・・

エンジニアフロー

Spine

  1. 公式SDKをUnityにImport
  2. データimport
  3. Mechanim Animationでオブジェクトを生成
  4. Animator Controllerを作成
  5. 2015/2から公式がmechanimに対応

特徴

  • エンジニアにやさしい

Maya

  1. FBXデータをImport
  2. Animationをモーションごとに分割
  3. Animator Controllerを作成
  4. Animationで手戻りがはっせいすると大変

Puppet2D

  • AnimationControllerつくるだけ
  • 工数が発生しない
  • ただデザイナーとレギュレーション握る

ソフトウェアを検証

デザイナ視点

  • Spineはdeform / ik機能などいい感じ
  • しっぽをどうしても滑らかに動かしたい => Puppetに
  • Mayaはちょっとオーバーキル
  • fbxからのインポートが面倒

エンジニア視点

  • 工数がpuppet2dが有利
  • 仕様変更に耐える -> Spineが有利
  • Spineがデータ変更ですぐに反映できるのでSpineよい
  • Puppet2Dは位置座標、スケールなど調整が必要なので出戻り辛い

マネージャー

  • Spine ...
  • puppet2d $60
  • maya $5000 + $6000
  • 分業はSpineやりやすい
  • Puppet2dはサポートがないけど、そんな必要でもないかも
  • Puppet2DがUnity上で同時編集必要なので辛い

まとめ

  • Spine: 万人向け, updateもはやい
  • Maya: 機能的に最高. 十分にpreproductionするチーム向け
  • Puppet2D: Unityのinterfaceの改善に期待. 普段からUnityに慣れているならばよし

Session7. Unity Google Extreme

1 billion Android 3/4がgame playしてる 7billion支払い => 8400億円

去年の話

  • Standard Technique for Success.
  • Game Developer Best Practices
  • quality/core.htmlをまもる
  • TagManagerは面白いが今日は割愛
  • Admob収益化もいいよ
  • サービスのためのpluginは... url...

Developerが直面する問題

  • 最新のAndroid Versionに準拠. Android Themeに準拠が必要
  • だが、UnityはJingerbreadにcompatibilityが設定されている
  • Custom Pluginで設定は可能
  • Plugins/Android/いかに配置するといい
  • Manifestでtheme設定など
  • AndroidCodeを作る必要はない. 1度で使いまわせる

Unity Google "Extreme"

1. Android TV support

導入すると注目のチャンス. Unityならば簡単にintegration.

  • mobileと全く同じ. GooglePlayの画面も同じ. Standardization.
  • Android Ecosystemが大きく拡大. 多くのメーカーが開発する.

テレビでゲームをする時の問題.

  • 離れた場所からコントロールするDPADが必要
  • 方向キー: 上下左右 + Center / Back + Select
  • github.com/CMZCODE/GamePadSampleUnity
  • nvidiaの友人がbest practive作ってる
  • permissionでgamepad加える必要あり

Middlewareに注意

  • Permission.
  • UnityでのAsset/Plugins/ directoryに追加が必要

PlayGames

  • CloudSaveはべんり
  • Quest/Leaderboardは維持率をあげる

Second screen & multiplayer gaming

  • Nearby Connection API
  • 近くのものをコントローラにできる
  • 同じネットワーク上ならばすぐに認識される. P2P Connection.
  • ローカルでのマルチプレーヤーゲームができる
  • Signinをわざわざする必要がない.

LyRicle事例

  • Android TVをつかってアンケート

2. GooglePlayGame Services

成功しているdeveloperがやっていること

  1. 1日あたりの売上目標値
  2. うけているところ、問題点をみつける
  3. Analyticsをつかってどのようにゲームを進めているのか解析

Developerの違い

  • 大型のチーム: 専門チームが別個にいる
  • Indie Developer: 少人数. 1人. なんでもやる. データ分析はあとに

PlayGames Player Analytics

  • 1日あたりの目標値
  • hotスポット
  • Understand players
  • GooglePlayGameServices無償でついてくる

  • まずは売上目標

  • もし目標を下回っているなら... HotSpotを探す
  • 他の会社とベンチマークする. (他の会社に対して劣っているところが見える)
  • 他のゲームに乗り換えている人、ユーザの進行度がわかる
  • 全部何も設定せずにできる、そうGooglePlayGameServicesならね

BomSquad - Eric Froemling

  • 自分でゲームエンジンさえ作成
  • 1ヶ月ほどまえゲームはよかった. 収益を出してなかった
  • Sources And Sinks Reportをみてもらった.
  • ゲームのお金通貨を使い込む前に. 過剰提供していた
  • もっとチケットをつかう機能を得た. => 財務体質改善
  • 課金ユーザ 70%増加. 売上x2

Sources and Sinks Report

  • PlayGamesPlatform.Instantiate.....

復習

  1. 売上目標を決める
  2. hotspotを決める
  3. 改善

Cardbord

VR for Everyone

  • 100万install
  • 光学系、マグネット、NFCタグ

BiteSizedのVRとよんでる

  • もりまさひろ. 不気味の谷現象.
  • VRも同じ好感度カーブがある. => ある閾値からすごく気持ちよく. その手前はすごく気持ち悪い
  • フレームが高過ぎるとかえって気持ち悪い
  • VRの不気味の谷の前にあるもの
  • 覗き見感覚. 視野が全部置き換えられたわけじゃない. カジュアルなVRを提供

GoogleMap

  • 2回タップすると StreetViewを3Dモードに出来る
  • すごい!!

CardbordとUnityの統合

  • Cardboardのpluginを追加.
  • MainCameraのしたにStereoCameraを入れる
  • ステレオに
  • ...

Publishing Cardboard VR

  • Apps for Google Cardboard
  • GooglePlay上に乗せるとプロもしてくれるよ
  • 詳しくは. developer.google.com/unity/unity/cardboard/ ?