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に表示するようにすればスッキリ
コンポーネントの依存関係
グラフ化
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の場合、ロードするシーンを探す
- SerializedObject <=> YAML / 検索
- Smart Marge : シーンやプレハブをマージ可能に
近いうちに公開する予定
- 5分くらいでガガッと把握できるように
Session3: エディター拡張マニアックス 2015
- 安藤圭吾
- Field Engineer
- Unity部 もくもく会
- SlackにUnityコミュニティつくった
Unity 5.1ベースの話
- 資料は後日Uniteページに公開
- ソースも公開予定
- Animation Data Auto Generationについて話す
- Sprite Animationを題材
Sprite Animationの作成
- プロジェクトview -> Scene ViewにDrag&Drop. AnimationClip & AnimationController生成
- Animation WindowでCreate New Clipでやる
- 選択 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
- リッチなクオリティをスマホでやるには?
- 大規模開発でのUnityの注意点
- HDクオリティのゲーム制作をする心得
大規模開発での心得
基本
- 同じファイルを同時に触る人が増える
複数人のデータ編集のイメージ
Hierarchyで編集する.scene, .prefabを同時に編集できるか?
- ここが一番のネックだった
- Unityはこれが非常に苦手
Hierarchyで依存関係を作らない
attack.prefab |- motion.prefab |- plan.prefab |- sound.prefab
基本:
- 一つのアセットとしてattachを設定する
- Hierarchy上で依存をつくらず、Inspectorで設定
- コミットを検知してCommitHookサーバーが最新の依存関係をattack.prefabに更新してcommit
- NOTE: 依存関係は .metaに記載されているguidによって構築されるので
視認性が落ちる
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#の特性を知る必要がある
- strutはstackに確保されるが、classはheapなのでgc頻度上げる
- 文字列層は気をつけて class enumのtoString()はおそい
- foreachを使うとEnumerableがヒープ確保されるので、これもgc頻度を上げる
- Vector演算を真面目にやるとかなりキツイ
特性をしればそんなに遅くならない
- foreachでIEnumerableでallocationしてるとか、
最適化はNative化を検討
- IKや揺れ者の物理はnativeで実装
- Asset/Pluginにdllにおいて簡単にnative呼び出しできる
まずは敵を知るところから
アプリが使えるメモリ量
iOS 350-600MB Android 400-1.1G
Android先行で開発したほうがうまくいく?
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画像データに
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を変換
起動時間の高速化
独自のキャッシュシステムを作成
- 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
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いい
デザイナ共通手順
- イラスト書く
- パーツ分割
- scriptで画像を書き出し (手で作業するのは大変)
Mayaのワークフロー
- パーツの数だけshaderを作る
- パーツのレイヤーを設定
- IKを設定
- アニメーション設定
- fbxをexportする
特徴:
- 作業大変
- MELScriptで効率化すればいいかも?
Spineのワークフロー
- ...
特徴:
- なれると簡単
Puppet2Dのワークフロー
- ...
特徴:
- なれると簡単
- Unityになれてれば簡単・・・
エンジニアフロー
Spine
- 公式SDKをUnityにImport
- データimport
- Mechanim Animationでオブジェクトを生成
- Animator Controllerを作成
- 2015/2から公式がmechanimに対応
特徴
- エンジニアにやさしい
Maya
- FBXデータをImport
- Animationをモーションごとに分割
- Animator Controllerを作成
- 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日あたりの売上目標値
- うけているところ、問題点をみつける
- 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.....
復習
- 売上目標を決める
- hotspotを決める
- 改善
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