Unite2015とは
- 年に1度のUnityのお祭りです
- 以下、自分の取ったメモ
- スライドが全公演に対して公開されるので一時的なものである認識
基調講演
UnityProfessionalEdition
- チームラインセンス
- パフォーマンスの速報 (PreView)
- UnityAssetsStore Level11 Deals
- AssetsStoreをとても得に使える仕組み
- ロイヤリティ無しで使える
UnityPersonalEdition
- Unity5エンジンの全ての機能を使えるようになったよ
- 従来のPro版で制限されてた機能含む
- ロイヤリティ無しで使えるよ
- 100万の利用者
IncredisbleGraphics
- 物理ベースレンダリング
- グローバルイルミネーション
- サンプル動画(3人/短期間)
REPUBLIQUE
- Unity5で物理ベースシェーダーによりリアルな質感を表現
- これから作るゲームをもっと美しくなる
- 感情を与えていい体験をしてもらう
無料でプロダクト公開!
- https://www.assetstore.unity3d.com/jp/#!/content/34352
- 大前さん「人の人生をダウンロードしている気がする」
Lighting
- Mechanim
- Entry -> Exit が見える様になって判りやすいよね
- AudioMixer
- 3DサウンドかどうかはMixierでコントロールする様になった
- MixerGroup (チャンネル) 単位で設定してよね
- snapshotによって場面による音量設定など
- ダッキング
- 他の音を下げてね、等の調整が聞く
Unity5 feature
- 64bit版のエディタ対応
- PhysX 3.3 upgrade
- animationシステムの刷新
- AudioTools
マルチプラットフォーム対応
- 6つのプラットフォーム対応大変だったよ、更にやってみよう
- 21のプラットフォームを対応
- 1からの作業だった
- WebGLサポート
- IL2CPP
- 全てのプラットフォームに対応させたい!!
Massive R&D
- 300人あまりの開発者が関わってる
- core / cloud / longer / R&D team
- new ニンテンドー3DS 今年夏β : ブースでも触れるよ!!
VR (Oculus/パルマーさん)
- GearVR で課金プラットフォームのリリース
- VRはどんどん広がって行くよ!!
- Unity 5.1 のインテグレーションデモ
- 大前さん「こんなところに偶然DK2があったので」
- VertualReality対応チェック入れるだけで視線追従
- エディタとOculus側との表示が分かれる
クラウドサービス
- パフォーマンスレポーティング
- アナリティクス
- CloudBuild
- Buildに数分〜数10分掛かる
- CloudBuild大絶賛 280,000builded 15万時間の節約
- 無償版もある!! UnityProに内包されている Pro $25〜
- UnityAds
- 1500Game / TOPGames (iOS) 4/10
- Work with CyberAgent && Gee
ここが変わる! Unity5のスマホ開発 〜アセットバンドル、ブルド、プラグイン〜
AssetBundle
今までの問題点
- 複雑
- ビルド時間が長い -どれをビルドすればいいのか不明でフルビルド
- 面倒な依存関係
- バージョン毎の互換性が無い
解決方針
- シンプル (ビルド/ランタイム)
- 追加ビルド (ビルドを最小限にとどめる)
- 依存性はUnityが解決する (ビルドして使うだけ)
- 互換性を保持する
- [注意] 混ぜるな危険 (4と5)
新しいAssetBundleビルド
AssetとAssetBundle間を結びつける
- インスペクタから各Assetsに対してnameを記載する
- ビルドするスクリプトを呼ぶ
-
- 小文字のみ/同盟禁止/パス構成持てる(/)
Buildスクリプト
- BuildAssetBundles(出力パス, BuildAssetBundleOption, 出力ターゲット)
Options
- IgnoreTypeTreeChanges (NEW!!)
- タイプツリーが変わっても虫 = ソースコード変更しても変化したと見なされない
- DisableWriteTypeTree
- タイプツリー遺体をサイズ削減用とで消す
- IgnoreTypeTreeChanges (NEW!!)
互換性
- 5.1以降の互換性は保持される (5.0はバグで互換性持たない)
Manifestファイル
- (Single) Manifestファイル -> 親玉/依存関係を解決出来る/ランタイムに読んで依存関係を解消しようとする
- .manifestファイル -> インクリメンタルビルドにだけ関係する
- CRC / アセット名 / 依存関係 / Hash / ClassTypes
Variant
- ランタイム時に読み込むアセットバンドルを変更出来る
- フォルダ/シーンなどに適応出来る
- AssetBundle名の隣に指定する
- LoadVariantsでsd/hdのどちらを呼び出すか指定するような感じ
サンプル
サンプルプロジェクトを使おう
-
- AssetBundleManager.cs (マネージャークラス)
- 基本ロードの仕組み : AB名を受け取ってLoadAssetBundleが走りWWW発行してキューがリクエストを返す -> GetAsset
- 依存性の干渉: LoadAssetBundle内部でAB名を貰ってinitでAssetBundleManifestを読み、依存ABをロード
- エディタシミュレーション: GetAssetPasssFromAssetBundleAndAssetName
- Variants を使った切り替え: Variantに関する名前を呼び出して、一致する名前を呼び、最後の名前を付け替える (sd->hd)
- BaseLoader.cs (基本ローダー)
- デモ
- https://github.com/makoto-unity/NewAssetBundleSample
- ジュエルセイバーの画像素材を動的に呼び出す
- cacheしているので読み込めば早い
- AssetBundleManager.cs (マネージャークラス)
ビルド
マルチプロセスビルドHack
IL2CPP
-
- Xcodeプロジェクトを直接編集できる
- http://bit.ly/1CSDBYo
Plugin
Pluginの設定の変更
NativeCodePlugin
- Unityからネイティブの関数を呼び、CからObjCを呼び出し...
- NativeCodePlugin: 直接ObjCを直接呼び出す
- [注意] 引数が使えない...
Unityではじめる徹底企画講座!を考える
- 大野功二さん
- 3Dゲームを面白くする技術
- unityではじめる3Dゲーム作り
こんな経験はありますか?
- 凄い企画思いついた
- Unityあるよ!作ろう
- あれ作れない、何か違う、思った様に操作出来ない
- ゲームが完成しない、諦める 「こんなはずじゃなかった!!」
企画を完成させられない問題
プランニングの問題
- 「企画を完成させられるかどうか」「企画は完成させられているか」
- 企画 ≠ アイデア
- 企画 ≠ 思いつき
- 企画はゲームを作る為の「出発点」と「ゴール地点」および開発の方向性を指し示すもの
- 「企画を完成させられるかどうか」「企画は完成させられているか」
企画の出発点 = ハイコンセプト/コアアイデア
- いつ/どこで/誰が
- どんな遊び方で/どんな体験をさせて
- どんな感情を抱かせて
- どうおもしろがらせるのか
企画のゴール地点
- ルック & フィール (第一印象) が大事
- そのゲームをプレイすることでプレイヤーの心や生活や人生にどのような影響を与えるか
企画の方向性
- おおまかなゲームデザイン (ルール/システム/操作性)
- 1回のプレイ時間 / ボリューム
時代とともに変わる企画手法 (答えはない...)
- 新しいシステムを作れば売れる時代とか
- ゲームを出せば売れるからとにかくはよな時代とか
- ターゲットユーザがこまくて状況にあわせて企画の手法そのものがちがう
- お笑いと同じ!!!!!!
ゲームの企画を料理に置き換えてみる
- [ミッション] 彼女/彼氏を家に招待することが出来たので、料理でもてなそう!
- 勝利条件(目的)を考える
- 満腹に / 技術力を見せつける / 楽しい時間を演出して好感度上げる ... etc
- 勝利条件の為に企画(プランニング)する!
- 身近な人をイメージした勝利条件を (開発チームの4/5人を満足させる)
- 方法は条件による
- 相手の好きな者を作る (自分が嫌いな場合は自分が楽しくなれないので好きになる努力が必要)
- 自分の好きな物を相手にも好きなってもらう (相手がそれを好きになれる要素があることが必要)
- 自分も相手も、見たことの無い者を作る
- 自分が好きなものは彼女も好きに違いない!!という発想だけじゃ弱い
- おもてなし
- 相手をイメージすることが大事
- すなわちリサーチ… 「どんな食べ物が好きですか? いつ? 時間は? どんな時に心の距離を縮めてくれるか?
調理とゲーム要素は似ている
料理の失敗例
- ゲーム機で実現出来ないほどの量の仕様を一度に並べようとしていませんか?
- ちょうど良い量を出していますか?
- ゲームが提供するアクションの順番は適切ですか?
- ゲームで扱うネタは新s年ですか?
- ゲームで表現したいことに対して、そのインターフェイスは適切ですか?
プレイヤーのどんな顔が見たいですか?
- 人の顔を想像するには現実の経験値が必要
- ゲーム以外の情報や引き出しを作ることが大事
仕様の問題点
- 仕様: ゲームをXXXを実現する為にアイデアを設計やメカニクスレベルまで分解したもの
ゲームのおもしろさを引き出す要素は以下の組み合わせとバランス
- アクション: 反射神経
- パズル: 正しい順番や意味を見つける
- リソース: 制限/時間
- 官能性: 操作するだけで気持ちがいい
- 運:プレイヤーが介入出来ない要素
仕様作成
- 新しい仕様を作る (センス/挑戦した回数)
- まねる (知識の数/まねた数)
仕様の基本
- ゲームを数多く見てどう読み解くかを研究する
- ゲームデザイナは実現したいゲームに対して、必要なパーツ(基礎仕様)をプログラマに渡して、一緒に最終仕様を作る
実装の問題
挫折原因
ゲームエンジンには特性がある
- Unityの特性を作ろう
- 頑張ればどんなゲームでも作れます!!
- けど作りやすいゲームや作るのに時間がかかるゲームは当然あるよ
短時間で作りやすいゲーム
- 複雑な辺り判定や物理演算が必要なゲーム
- 単純なアニメーションのゲーム
初めて作ると時間がかかるゲーム
- 複雑な当たりや物理演算の結果が勝敗を決めるゲーム
- 複雑なアニメーションのゲーム
- 理由
- Physicsを使いこなせていない
- 高校レベルの数学と物理の知識が必要
- 3D:PhysX / 2D:Box2Dと異なる
- e.g) 四角いcoliderだと段差に引っかかるが、足下に丸いcolider入れておくと上れるよ
- Mecanimを使いこなせていない
- アニメーションの基礎知識
- Unity5ではStateMachineBehaviors / AutoMachineAuthoring など
- 企画をUnity (の特性) に寄せる / Unityを知り尽くして頑張って実装する
- Physicsを使いこなせていない
作りやすいゲームの共通点
- PhysicsやMecanimのこんポーメントやプロパティ編集だけで実装可能
- ゲームのノウハウの公開の有無
まずはアセットストアのコンプリートプロジェクトのテンプレートを参考に仕様
- CompletePhysicsPlatformKit
- こういうことが出来るよ!出来ないよ!の説明
- アドベンチャー: 宴
- 2Dゲーム:ninja slasherX
- CompletePhysicsPlatformKit
調整の問題
- ゲームの面白さは調整で決まる
- 調整は一人では出来ないのでテストプレイヤーこそが重要な鍵
- ちゃぶ台返し -> 何回できるかが鍵
- 開発中は未来のプレイヤーの顔を想像しよう!
Unity5 グラフィクス使いこないガイド
- 基礎以外はWorkshopで
- Workshopの内容も後日配信するよ!
Lightingの新機能
AmbientLightの強化
- 3つの方式から選択出来る様になったよ
- Window -> Lighting
- Skybox
- Skyboxに該当している空が映り込む
- Gradient
- グラデーション/色を指定する
SkyBox
- ProceduralSkyBox
- パラメータから空を作れる!
- SunSize: 太陽の大きさ変更
- AtompsheteThicknes: 層の厚さ
- 太陽の光源を設定すると連動する (光源の角度に合わせて太陽が現れる)
- パラメータから空を作れる!
- CubemapSkyBox
- パノラマ画像から作れる!(hdri とかで検索するといっぱい出てくる)
- .exr / .hdr という形式のファイルを読み込める様になる
- cubemapに指定してapplyする
- skybox -> cubemap に指定する
- 物体の表面に影響
- 光源が柔らかいのでDirectionalLight1個追加して太陽を追加すると良い
- ProceduralSkyBox
影
- CAST SHADOWS OPTION
- MwshRender -> CastShadows
- 両面の影 (TwoSided)
- Shadows Only (影のみが落ちて見た目は消える)
- MwshRender -> CastShadows
- PCF SOFT SHADOW
- 綺麗になっただけでなくパフォーマンスは上がっている
- モバイルでは使えないので注意
- BAKED SOFT SHADOW
- 半影の開き具合を調整出来る様になった
- SHADOW BIAS
- NORMAL BIAS方式を光源で指定する
- 縮めるようなバイアスを掛けてアーティファクト(ノイズ)を削除出来る
- 複雑なモデルでは影に隙間が出来るのでBIASとの使い分けが大事
- CAST SHADOWS OPTION
RealtimeGIの基礎 (グローバルイルミネーション)
- 間接光の表現を使うことが可能なもの (IndirectLight)
Lighting -> GeneralGI
- 物体を動かしたり / 光源が動いたりしても反映される
- (Unity開けない) 「死ぬかと思った…」
- (Defuse反射する) 固形物のものにstaticフラグを建てて当てる必要がある
- staticオブジェクトに関しては自動で間接光が伝搬される
- 間接照明の効果が現れる
- 動き回るオブジェクトには勝手にGIは有効にならない
- LightProbeGroupを指定してあげる必要がある
- エリア内の動作を計算してくれる
- Supecularの入ったオブジェクトに対しては ReflectionProbeを指定する必要がある
- 意図せず発行していたらSkybox映り込んでいるな….
DirectionalMode
- NonDirectional: 追加情報無し
- Directional: どの方向から代表的な光が入り込んでくるかを近似で定める
- DirectionalSpecular: 直接光/間接光の持つ情報を持たせる
- [注意] 計算量やデータ量が増える / 代表的な光源一つだけを考慮しているので複数の光は危うい表現になりがち
- RefrectionProbeを指定してあげると解決する
RefrecrionProbe
- Probe同士のつなぎ
- MeshRendererのblendOption
- 反射の更に反射
- 映しているものは黒く表示されてしまう
- RefrectionBounces: 反射回数を指定出来る
- Bakeするときの処理が重くなるのでまあ2くらいまでは...
- リアルタイム反射
- 動いている者に関してはRefrecrionProbeには映り込まない
- EveryFrameにするとリアルタイムで映り込む
- InvisibleFaces: フレームレートを落とす(1/10?)により処理を軽くする
- リアルタイムだと画質も落ちるので注意
- BoxProjection
- ある決められた範囲に映り込ませるよ
- 処理負荷も重くてモバイルでは使えないよx
- Probe同士のつなぎ
Render Massive Amount of Objects in Unity
(ちょっとシェーダのこと全然知らない自分だったので以下用語に不備あるかも / スライド待ち)
@i_saint
本公園の目指すところ
- Unityでいろんなトリックを用いて1万以上のオブジェクトを効率的に描画 & 更新する
- 検証はPC上 PS4/XBoxOne程度
レンダリング
前提
- 1つ1つGameObject化する: 現実的ではない
- GameObjectなしにMeshを描く手段が必要
Graphics.DrawMesh
- Meshを描画するリクエストをrender queueに詰むAPI
- ただしbatchingは効かない
- drawcallは比例して増える
- drawcallを抑える手段が必要
疑似インスタンシング
- 1つのMeshに多数のモデルを格納する手法
- 元の頂点データを繰り返す
- 何番目のモデル化という情報を付与
- 65,000 / モデルの超点数を1回のdrawcallで描ける限界
- Cubeは24両点なので 65,000 / 24 = 2708個
- 各インスタンスの情報をGPUに送り、頂点シェーダモデル変更
- TRS行列等
- 必要なbatchの数だけMaterialを用意する
- 各MaterialにインスタンスIDの開始番号を付与する
- e.g) Cubeを10,000個か来たい場合、 10000 / 2708 = 4つ
- 必要個数を超えたモデルは頂点シェーダで画面に出ない様に工夫
- Materialに今Activeなのはいくつというものを保持する
- 1個でも描きたい場合は格納されているモデルの数分の処理する
- GPUにインスタンス情報を送る
ハードウェアインスタンシング
- 1回のdrawcallで1つのモデルを複数各機能
- 頂点シェーダの入力にインスタンス別のデータが加わる (TRS行列等を輪sつ)
Unity: Graphics.DrawProducedural()
Unity5.1でCommandBuffer/DrawProcedure() が追加
- render queueに載せることが出来る
- G-Bufferの精製/ ライティングしないオブジェクトには必要十分
Graphics.DrawProcedureIndirect()
- 描画するインスタンス数を指定出来る
update
- オブジェクトをUnity上でどう扱い/どう更新するか
- オブジェクト群を管理するマネージャをGameObjectとしてもつ
- Objectのデータはstructの配列として持つ
- 原始的だけど高速
UnityのColliderとのインタラクション等は独自に実装
ネイティブコード (=プラグイン化)
GPGOU / ComputeShader
C#でがんばる
- struct配列で持つしかない
- class参照しない書き方にする
- class参照は結構な負担
- 大きなデータのコプーは避ける
- ThreadGroup.QuueueUserWorkItem() による並列化
- いわゆるタスク並列
- [注意] Unityの機能の大部分はメインスレッドから触れない
- IL2CPPにより数値計算の高速が見込める (将来的には...)
- 最新の.NETでもある程度の改善が行われている
結論
- 現状大量描画は疑似インスタンシングが有力
- ハードウェアインスタンシングはUnity5.1以降にご期待ください
- アップデート処理は可能な限りC#は避けて自力で頑張る
Unity For Newニンテンドー3DS
- Newニンテンドー3DSをUnity5ベースでサポート
- Newニンテンドー3DSの登録Developerであれば利用可能
- サポートを求める声は貰っていた
- 8ヶ月くらい調査した
- 市場のiOS/Androidのアプリをいくつか選んで移植可能性を検討
- 8割以上のゲームはそのまま移植して動作するのでは!
旧3DSは?
- 議寿的サポートは可能
- メモリ/CPUの両面から制限がある
- 選んだタイトルのうち3割くらいが可能性あった
リリースは?
- 2015年夏: 認定堂に提出可能なβ版をリリース
調査研究と考え方
- 市場で現在出ているUnity利用のゲームを調査
- 主にアプリのメモリ/CPU使用率
- ハードのパフォーマンスを比較検討
- ユニティ・ゲームス・じゃお案で扱っているゲーム等は実際に移植してみてデータ取る
- 画面にキューブ出す/テクスチャ出す/スクリプト/物理エンジン...
- サンプルプロジェクトで検証する
- 3タイトルくらいの移植のチャレンジ
Wind-upKnight2 ねじ巻きナイト2
https://play.google.com/store/apps/details?id=com.robotinvader.knightmare2&hl=ja
- RobotInvaderの傑作アクションゲーム
- WiiU版をユニティ・ゲームス・ジャパンで担当
ゲーム移植開発した話
3Dへのゲーム移植時の課題
- メモリ容量が他のプラットフォームより少ない
- シェーダ制限
- 画面が2つ / 立体視対応で3回の描写
最初にやったこと
- オリジナルのゲームはUnity4.3 -> 5.1にアップグレード
- 問題なく動作した
テクスチャ最適化と調整
スマホとのメモリの使用量比較
- 大体50-60%くらいのメモリ使用量に、4割以下になるものも
Unityのスクリプト実行速度
エンジンの最適化/描画
エンジンの指摘か/Z-Buffer更新On/Offee
- Z-Bufferの必要ないゲームでは更新をオフにする設定を追加
- メモリ/GPUバンドに作用
ねじまきナイト2
- 2画面対応
- 3画面(上両目/下)を描画して60fps維持
シェーダーの実装
ピクセルシェーダー対応
- ShaderLabを使った一般的な解決方法をチャレンジ中
- 結構大変なので最初は別なやり方で対応するかも
スクリプト対応
オーディオサポート
実機デモ
- カメラ: 上画面と下画面選択出来るような感じ
- UpperLCD / LowerLCD
- 任天堂のソフト開発Kitの一部の機能を使用出来る
- buildの時間は長い
- ジャイロもちゃんと動作しているよ
今後の改題
エンジンの最適化
2Dモードの改善
まとめ
- Newニンテンドー3DSをサポートするUnityをリリースするよ
- ミドルレンジのスマートフォンをターゲットにするようなゲームならサポートは一考の価値あり
- 2015夏にβ版出すよ
- UGJが選考してたいとリリースすることでエンジンの完成度を高めるよ
質疑応答
- NativePluginのサポート予定ある?
- ネットワークは繋がる?
- New3DSの開発ライセンス以外の枠で開発できる?
- New3DS自体の開発が必要なので基本的にライセンスは必須
- ねじまきナイト2でのbuild時間
- ビルドから転送まで5分程度
Unity 5オーディオ新機能の真髄
AudioClip
データと分離したよ
- AudioClip側にはメタデータを持つことでサウンドのスケジュールを組むことが出来る
- メモリの削減
Loadの仕方も使用出来る
- PreloadAudioDataのチェックを外すとオンデマンドで動的にロード出来る
- AudioClip.LoadAuioData(); / AudioClip.UnLoadAudioData
- Load in backgroundにチェックすることで非同期ロードも行ける
Audioのメモリの使用量の改善
Platform毎のoverrideな設定
- コーデック/サンプルレート等の設定
圧縮形式
- 複数選択/編集に対応
AudioSource
3Dセッティングの設定を外した
- SpatialBlend で2D/3Dのハイブリッドが可能
StereoPanの設定を良いにアクセス出来る様にした
ReverbZoneのパラメータを追加
- 2Dのサウンドでも動作する
- ナレーションボイスにリバーブを付けるなど
距離に応じてパラメータの設定が出来る
pauseの機能
- AudioSource.Pause() / UnPause()
Audioプロファイラ
- どのAudioClipが再生されているか判る
AudioMixier
デモファイル
階層的なmixierになっている
- Player/Weapon/Amibience/Weather…etc などのAudipGroup
インスペクタでステータスを変更出来る
リアルタイムでプレイ中に変更出来る
- Edit in Play Mode をクリックするとゲーム中にステータス変更が出来る
- snapshotの変更の仕方
- AudipMixierSnapshot snapshot; snapshot.TrandformTo(1.0f); // sec
- スクリプトからステータスの操作が可能
- [DEMO] Unityでマスタリングしてる
- [DEMO] sliderによるsnapshotの遷移 / pauseボタンによるlowpassの適応
Horizontal rescheduling
- AudioSource.PlayScheduled();
- 再生タイミングのスケジューリング
- ピアノロールみたいなデモ
NativePlugin
- かなりの種類のPluginを紹介された
- デモファイル