PlayStation®4向けARPGのUnity開発事例
最適化と効率化の秘密
© Gemdrops, Inc.
登壇者の紹介
北尾 雄一郎
ジェムドロップ株式会社
スタジオディレクター/代表取締役
吉川 英雄
ジェムドロップ株式会社
プログラムディレクター
© Gemdrops, Inc.
© Gemdrops, Inc.
弊社ご紹介
ジェムドロップ株式会社
2013年設立 / 本社:東京都調布市
42名 (2018年4月現在)
家庭用 / スマートフォン / XR
ゲーム開発全般 / コンテンツ制作受託
「求められる物は創らない それ以上の物を創る」がテーマ
© Gemdrops, Inc.
DARK ECLIPSE(ダークエクリプス)
PlayStation®VR 専用・2018年9月25日リリース
販売・開発:サン電子株式会社 弊社:一部プログラム開発
© SUNSOFT All Rights Reserved.
狼と香辛料VR
2019年初頭リリース予定
© Spiicy Tails
CRYSTAR –クライスタ-
PlayStation®4 専用 ・ 2018年10月18日発売
企画発売:フリュー株式会社 開発全般:弊社
© FURYU Corporation.
チーム全体の開発スタッフ数
(ピーク時 約7ヶ月 / 外部スタッフ除く)
ディレクター:1名
プログラマ:4名
アートディレクター:1名
キャラクター:3名
背景:3名
モーション:2名
エフェクト:1名
UI:1名
プランナー:2名
スクリプター:3名
© Gemdrops, Inc.
エンジニアの開発期間
2017/6~2018/8 … 約14か月 (うちピーク7ヶ月)
2017/6 プログラマ1名で開始
フレームワーク、基本システム、バトルシステム
2017/9 プログラマ3名へ増員
イベント、フィールド
2018/1 プログラマ4名へ増員 (最終的に最大4名で開発)
UI
© Gemdrops, Inc.
© Gemdrops, Inc.
開発事例ご紹介
・開発環境
・効率化
・最適化
© Gemdrops, Inc.
・開発環境
・効率化
・最適化
© Gemdrops, Inc.
主な開発ツール
・Maya2018
・Photoshop
・Unity 2017.2.2p1(マスター時)
© Gemdrops, Inc.
使用したUnityの機能やAsset①
・Graphics
モデル①
Unity標準のStandard Shader
AlphaToCoverageやEmissiveの追加などの拡張は行っている。
© Gemdrops, Inc.
使用したUnityの機能やAsset①
・Graphics
モデル②
UnityChanShader(ユニティちゃんトゥーンシェーダー2.0)
PCや重要NPCに使用している。
© Gemdrops, Inc.
使用したUnityの機能やAsset①
・Graphics
PostProcessStack
RadialBlurの追加拡張を行っている。
© Gemdrops, Inc.
使用したUnityの機能やAsset②
・Graphics
エフェクト(パーティクル)
Unity標準のShuriken
UI
Unity標準のUGUI
© Gemdrops, Inc.
使用したUnityの機能やAsset③
・Sound
Unity標準のAudioSource
CRIなどのミドルウェアと比べると読み込み、
再生時のパフォーマンスもそれほどよくない。
・Movie
Unity標準のVideoPlayer、PS4もPS4VideoPlayerを使用
© Gemdrops, Inc.
使用したUnityの機能やAsset④
・Timeline
零ちゃんの部屋でのカメラカットに使用
利点
アーティストがビルドを動かさずにプレビューをしながら調整できる。
Unityにある機能が使用できるため機能追加のプログラマ負担が少ない。
欠点
再生時はHierarchyの構成をタイムライン作成時と一致させる必要がある。
部屋の時だけカメラのHierarchyの構成を変更することになった。
リソース管理は任せられない。
© Gemdrops, Inc.
使用したUnityの機能やAsset⑤
・BlendShape
PCや重要NPCの瞬きや口の動きに使用
利点
Unityの機能として備わっているので追加実装の必要がない。
欠点
アニメーションから制御を行えるようにしたところ不具合がでた。
BlendShapeを操作しているアニメーションから
BlendShapeを操作していないアニメーションに切り替えると
前のアニメーションの値を保持したままになってしまう。
※別レイヤーで値を戻すアニメーションを再生することで対処
© Gemdrops, Inc.
使用したUnityの機能やAsset⑥
・TextMeshPro
テキスト表示全般で使用
© Gemdrops, Inc.
使用したUnityの機能やAsset⑥
・TextMeshPro
テキスト表示全般で使用
利点
低負荷でアウトラインなどが入った文字を表示できる。
マテリアルを増やすことで様々なパターンの文字を用意できる。
欠点
アーティストがマテリアルをがんがん増やせてしまう。
フォント用テクスチャを作成する必要があり、
ttfファイルの埋め込みには対応していなかった。
© Gemdrops, Inc.
使用したUnityの機能やAsset⑦
・DynamicBone
髪の毛やスカートなどの衣服に使用
利点
途中でモーションが切り替わっても自然な動きをしてくれる。
自然な動きに見せるための各種調整を行う手間はあるが、
全て手付けのみでモーションをつけるよりは工数を短縮することができる。
欠点
パラメーターの調整などに慣れる時間は必要である。
CPU負荷が非常に高いので使用箇所には注意する必要がある。
© Gemdrops, Inc.
使用したUnityの機能やAsset⑧
・MoonSharp
イベントなどのスクリプトに使用
利点
プラットフォームごとにプラグインを作成する必要がない。
(PS4用のプラグインも用意しなくてよい)
欠点
GC.Allocが少し多かったりでNLua/sLuaと比べると
パフォーマンスの観点で劣るかもしれない。
© Gemdrops, Inc.
・開発環境
・効率化
・最適化
© Gemdrops, Inc.
効率化
・内製ツール
・背景オブジェクトの作成
・壁(Collider)の生成
・ミニマップの生成
・作業フロー
© Gemdrops, Inc.
効率化
・内製ツール
・背景オブジェクトの作成
・壁(Collider)の生成
・ミニマップの生成
・作業フロー
© Gemdrops, Inc.
内製ツール
社内ではGemTools、MayaToUnityとか呼ばれている。
MayaからFBX出力時にUnityでインポートされた時に
自動で設定される情報を出力するためのツール。
『CRYSTAR -クライスタ-』で対応していた機能
・Material出力
・Collider出力
・DynamicBone出力
・FootPrint (足設置)出力
© Gemdrops, Inc.
Material出力①
Mayaで設定する際はDirectX11 Shaderを使用。
UnityのStandard Shaderと見た目や設定がほぼ一致した。
Maya Unity
© Gemdrops, Inc.
Material出力①
Maya Unity
© Gemdrops, Inc.
Material出力③
エクセルでMayaとUnityそれぞれのアトリビュート名のBind設定をする。
設定の出力
© Gemdrops, Inc.
Material出力④
CS ファイルとMEL ファイルが出力される。
MayaからFBX出力時に設定ファイルが書き出され、
Unityインポート時に設定ファイルを使用して自動で設定される。
CS
MEL
© Gemdrops, Inc.
Collider出力①
MayaでUnityのCollider設定をする。
© Gemdrops, Inc.
Collider出力②
MayaでUnityのCollider設定をする。
Maya Unity
© Gemdrops, Inc.
DynamicBone出力①
MayaでUnityのDynamicBone設定をする。
© Gemdrops, Inc.
DynamicBone出力②
MayaでUnityのDynamicBone設定をする。
MayaのSetでNodeとCollisionを関連付けるとUnityで自動設定される。
Maya Unity
© Gemdrops, Inc.
FootPrint(足設置)出力
MayaでFootPrint設定をする。
設置用のノードにアニメーションキーを打って出力すると
UnityのAnimatorにイベントが自動で設定される。
Maya Unity
© Gemdrops, Inc.
内製ツール
設定の出力形式は全てXMLで統一されている。
© Gemdrops, Inc.
効率化
・内製ツール
・背景オブジェクトの作成
・壁(Collider)の生成
・ミニマップの生成
・作業フロー
© Gemdrops, Inc.
背景オブジェクトの作成
背景オブジェクトはPrefabの組み合わせで構成されている。
屋根 窓 地面
© Gemdrops, Inc.
背景オブジェクトの作成
この方式によって背景アーティストの作業工数が大幅に削減されている。
修正もPrefabを修正すれば、使用している背景オブジェクト全てに反映される。
CGWORLD 2018年12月号(vol.244)
アート作業の効率化や詳細をご紹介をしていますのでそちらもご参照ください。
© Gemdrops, Inc.
効率化
・内製ツール
・背景オブジェクトの作成
・壁(Collider)の生成
・ミニマップの生成
・作業フロー
© Gemdrops, Inc.
壁(Collider)の生成
キャラクターの移動可能範囲にはColliderが必要である。
アーティストが手動で設置するか・・。
↓
地味にかなりの時間がかかる。
↓
なんとか自動生成できないか・・。
↓
© Gemdrops, Inc.
壁(Collider)の生成
NavMeshを使用して自動生成できるようにしました。
© Gemdrops, Inc.
壁(Collider)の生成
NavMeshを使用して自動生成できるようにしました。
© Gemdrops, Inc.
壁(Collider)の生成
ジャンプでの段差飛び越えにも対応。
© Gemdrops, Inc.
効率化
・内製ツール
・背景オブジェクトの作成
・壁(Collider)の生成
・ミニマップの生成
・作業フロー
© Gemdrops, Inc.
ミニマップの生成
作成されたマップ数は30程度だが、ユーザーが遊べるステージ数は100以上。
つまり100以上のミニマップを作成する必要がある!
↓
自動化の出番!
↓
またNavMeshを使えば自動で作成できそう。
↓
© Gemdrops, Inc.
ミニマップの生成
自動生成できるようにしました。
実際に出力されたデータがこちらです。
© Gemdrops, Inc.
ミニマップの生成
© Gemdrops, Inc.
ミニマップの生成
© Gemdrops, Inc.
効率化
・内製ツール
・背景オブジェクトの作成
・壁(Collider)の生成
・ミニマップの生成
・作業フロー
© Gemdrops, Inc.
作業フロー
・モデルがないとモーションが作れない!
作り込まずにモーションが作成開始できる程度のモデルデータを作成
・モーションがないとエフェクトが作れない!
作り込まずにエフェクトが作成開始できる程度のモーションデータを作成
・エフェクトがないとキャラの攻撃、イベントに組み込めない!
作り込まずに組み込みができる程度のエフェクトデータを作成
・各パートで待ちが発生するという悪循環にならないように
ダミー作成 → 本製作 という作業フローを徹底
© Gemdrops, Inc.
効率化のまとめ
・アーティストが設定する必要があるものはなるべくMayaで行えるようにした。
MayaとUnityを横断する必要がなくなり効率化につながった。
Unityでの設定のし直しを最小限にすることで効率化につながった。
・背景などは共通パーツ(Prefab)を使用することで
作成するアセットの量を減らし、全体の工数を減らすことができた。
・プログラムで自動生成できそうなところはなるべく自動生成を行うようにした。
アーティストはアセットの作成に集中することによって効率化につながった。
・各パートで待ちが発生しないようにまずはダミーを揃えることを優先した。
© Gemdrops, Inc.
・開発環境
・効率化
・最適化
© Gemdrops, Inc.
最適化
・背景オブジェクトのメッシュ統合
・カリング
・シーンの切り替え
・ファイルの読み込み
・AssetBundleの作成
© Gemdrops, Inc.
最適化
・背景オブジェクトのメッシュ統合
・カリング
・シーンの切り替え
・ファイルの読み込み
・AssetBundleの作成
© Gemdrops, Inc.
背景オブジェクトのメッシュ統合
『CRYSTAR -クライスタ-』は開発当初から
PS4 Pro を含むすべての PS4 にて 60FPS で動かすという目標があった。
© Gemdrops, Inc.
背景オブジェクトのメッシュ統合
Batch数が多すぎてCamera.RenderのCPU負荷が高すぎる。
↓
シーンごとに同マテリアルのメッシュ統合を行う。
↓
Camera.RenderのCPU負荷が30%ぐらい下がった!
© Gemdrops, Inc.
背景オブジェクトのメッシュ統合
メッシュ統合をするとシーンを保存するのに数秒かかると報告があがる。
↓
10MB~20MB程度のシーンファイルが1GBに膨れ上がっていた。
↓
このメッシュ統合の方式では『CRYSTAR -クライスタ-』には使えない。
↓
ならばシーンに対してではなく、Prefabごとに最適化をかければ
シーンのサイズが大きくならずに近い恩恵を得られるのではないか?
↓
© Gemdrops, Inc.
背景オブジェクトのメッシュ統合
シーンのサイズを増加させずにBatch数を大幅に減らすことに成功
統合前:117 統合後:17
© Gemdrops, Inc.
背景オブジェクトのメッシュ統合
シーンのサイズを増加させずにBatch数を大幅に減らすことに成功
統合前:2.47ms
統合後:1.67ms
© Gemdrops, Inc.
最適化
・背景オブジェクトのメッシュ統合
・カリング
・シーンの切り替え
・ファイルの読み込み
・AssetBundleの作成
© Gemdrops, Inc.
カリング
背景オブジェクトのメッシュ統合だけでは 60FPS はでなかった。
© Gemdrops, Inc.
カリング
背景
距離カリング
カメラからの距離で表示のON/OFF
オクルージョンカリング
ロード時間が数秒延びたので使用せず。
キャラ
距離カリング
カメラからの距離で表示のON/OFF
AIカリング
カメラからの距離に応じて思考頻度を調整
DynamicBoneカリング
カメラからの距離に応じて計算頻度を調整
© Gemdrops, Inc.
最適化
・背景オブジェクトのメッシュ統合
・カリング
・シーンの切り替え
・ファイルの読み込み
・AssetBundleの作成
© Gemdrops, Inc.
シーンの切り替え
ロード時間の長さはユーザーのストレスにつながる。
『CRYSTAR -クライスタ-』は PS4 Pro を含むすべての PS4 にて
5秒以内にシーンの遷移が終了することを目標とした。
© Gemdrops, Inc.
シーンの切り替え
マップのシーンサイズが大きく、2つのシーンが同時にメモリ上に乗ると
PS4でメモリ不足が発生することがあったので一度空のシーンに切り替えを行っていた。
マップAシーン → 空シーン → マップBシーン
© Gemdrops, Inc.
シーンの切り替え
シーンの切り替え時にUnity内部でGarbageCollectAssetsProfile が呼び出される。
空のシーンを挟むと2回呼び出されることになってしまう。
マップAシーン → 空シーン → マップBシーン
↑ココ ↑ココ
© Gemdrops, Inc.
シーンの切り替え
修正前
修正後
空シーンを常駐させ、マップAをUnloadSceneAsyncで開放した後に
マップBをAdditiveでLoadSceneAsyncでロードする。
マップAシーン → マップBシーン
↑ココだけになった!
© Gemdrops, Inc.
最適化
・背景オブジェクトのメッシュ統合
・カリング
・シーンの切り替え
・ファイルの読み込み
・AssetBundleの作成
© Gemdrops, Inc.
ファイルの読み込み
通常の AssetBundle の読み込み。
エフェクト、ボイスなど全ての AssetBundle に対して
LoadAssetAsync まで待つとロード時間が数秒延びてしまう。
© Gemdrops, Inc.
ファイルの読み込み
修正前
修正後
データが必要になった時に同期で読み込む。
© Gemdrops, Inc.
最適化
・背景オブジェクトのメッシュ統合
・カリング
・シーンの切り替え
・ファイルの読み込み
・AssetBundleの作成
© Gemdrops, Inc.
AssetBundleの作成
Shader.Parseが重い。
AssetBundle化をすると同じシェーダーを使用しているはずなのに
各AssetBundleをロードされるたびにShader.Parseが呼び出されてしまった。
© Gemdrops, Inc.
AssetBundleの作成
BuildPipeline.BuildAssetBundles をファイルごとに出力していた。
この出力方法だとAssetBundleごとにシェーダーが含まれてしまう。
さらにAssetBundleが含まれているシェーダーを使用しようとしてしまう。
© Gemdrops, Inc.
AssetBundleの作成
修正前
修正後
この方式ならば、共通シェーダーのshaderが使用されるようになる。
※共通シェーダーを先に読み込む必要があるので注意。
© Gemdrops, Inc.
最適化のまとめ&その他
・Unityの内部処理は最適化することができないが、
工夫によって隠蔽、軽減させることはできる。
・GameObject.activeInHierarchyやactiveSelf は意外と重い。
MonoBehaviourのOnEnable/OnDisableで
フラグを保持しておいた方が高速にチェック可能
・C#JobSystem は有用である。
『CRYSTAR -クライスタ-』で使用していたカリング計算、
コリジョン計算、AI、DynamicBoneの計算の一部の処理でテストした結果
フレームレートの向上が見られた。
© Gemdrops, Inc.
ご清聴ありがとうございました
ご質問ございますか?
© Gemdrops, Inc.

PlayStation®4向けARPGのUnity開発事例 最適化と効率化の秘密