31.4K Views
November 20, 22
スライド概要
講演アーカイブ:
https://youtu.be/X-eEeFozP3Q
講演内容:
「THE KING OF FIGHTERS XV」プロジェクト全体像と開発中に使用したUnrealEngineの機能を紹介。
講演者:
呂 朗標(株式会社SNK)
対戦格闘ゲーム『THE KING OF FIGHTERS XV』についてはこちら:
https://www.snk-corp.co.jp/official/kof-xv/
UNREAL FEST WEST ’22 公式サイト:
https://unrealengine.jp/unrealfest/west2022/
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
UNREAL FEST WEST ’22 Unreal Engineを馴染ませる ~THE KING OF FIGHTERS XV における開発事例~ 株式会社SNK 呂 朗標
目次 • 概要・各セクション構成説明 • パッケージ/クック • ステージ/UI • 最適化 2
プロフィール 呂 朗標 (ロ ロウヒョウ) ゲームプログラマー 出身・中国広州 2014・ネットワークエンジニア 2016・来日 2019・京都コンピュータ学院卒 2019・株式会社SNK 入社 タイトル: 「SAMURAI SPIRITS」 「THE KING OF FIGHTERS XV 」 3
目次 • 概要・各セクション構成説明 • パッケージ/クック • ステージ/UI • 最適化 4
Unreal Engineを馴染ませる ~THE KING OF FIGHTERS XV における開発事例~ ❙ タイトル : THE KING OF FIGHTERS XV ❙ ジャンル : 対戦格闘 ❙ プラットフォーム : PlayStation®5 / PlayStation®4 Xbox Series X|S / Windows 10 / Steam / Epic Gamesストア ❙ 発売日 : 2022年2月17日 木曜日 ❙ レーティング : CERO C ❙ プレイ人数 : オフライン1〜2名 / オンライン2〜8名 5
概要・各セクション構成説明 アウトゲーム インゲーム 6
概要・各セクション構成説明 エフェクト Effekseer バトル ビルド&クック パッケージ作成 自動インストール etc. 社内ツール 物理 KawaiiPhysics +社内拡張 オンライン ~UE4.26.1 Online Subsystem ベース社内実装 7
目次 • 概要・各セクション構成説明 • パッケージ/クック • ステージ/UI • 最適化 8
パッケージ/クック • クック:ゲームで使用するアセット用にプラットフォーム固有のコンテンツを作成 • パッケージ: ゲームプロジェクトを配布形式にパッケージ化 • エディタビルド:Visual Studio環境がない方にバイナルファイル作成/配布 アウトゲーム ビルド&クック パッケージ作成 自動インストール etc. インゲーム バト ル 社内ツール 物理 KawaiiPhysics+社内 拡張 ~ UE4.26.1 9
パッケージ/クック 開発を進むことによってプロジェクトに色んなデータが増え しかし,すべてのデータが製品版に必要なものとは限らない クックルール (アセット管理) テクスチャ 3Dモデル テキスト デバッグ機能 10
パッケージ/クック (Project Setting – Asset Manager) その中の7つの項目を紹介します • Primary Asset Type 定義したPrimary アセットのタイプ • Asset Base Class 定義したPrimary アセットの基底クラス • Has Blueprint Classes ブループリントアセットを含めるか • Directories アセットのディレクトリ • Rules クックルールなどの設定 • Should Manager Determine Type And Name • Should Guess Type And Name In Editor GetPrimaryAssetId を実装なくでもいい感じに動く項目 今回はOFFにしました 11
パッケージ/クック (Project Setting – Asset Manager) 12
パッケージ/クック (Project Setting – Packaging) 13
パッケージ/クック • (Project Setting – Packaging) Additional Asset Directories to Cook プロジェクト内で参照されているかどうかに関係な く、常にクックする必要がある .uasset ファイルを含む ディレクトリ • Directories to never cook プロジェクトで参照されている場合でもクックして はならない .uasset ファイルを含むディレクトリ • Additional Non-Asset Directories to Package 常に .pak ファイルに追加する必要があるファイル を含むディレクトリ( .uasset 以外のファイルを含むよ うに使う) 14
パッケージ/クック (Primary Asset Labels) 使用例: デバッグコンテンツ・臨時ファイル Never Cook デバッグ機能 Development Always Cook Priority 優先度 Chunk ID チャンクID Apply Recursively 再帰 Cook Rule クックルール Label Assets in My Directory ディレクトリ内のすべてにラベルを付ける Explicit Assets アセットの手動指定 Explicit Blueprint ブループリントの手動指定 Asset Collection コレクション参照 15
パッケージ/クック プロジェクト内での運用 Primary Asset Type定義 キャラクター,UIなど大きいカテゴリ Directories to Exclude リファレンスミスしやすいの臨時アセットなど Primary Asset Labels/Collection デバッグパッケージ作成,デバッグ関連,個別ルール外のアセット 16
目次 • 概要・各セクション構成説明 • パッケージ/クック • ステージ/UI • 最適化 17
ステージ/UI (レベル構成) Persistent Level • Camera バトル,演出カメラ • CollisionMap 揺れもの用のコリジョン • DebugMenu 製品版に入らないデバッグ機能 • Effect エフェクト • SoundMap バトルサウンド • ステージ本体 • ステージモブ(ハイエンド) • ステージモブ(通常) • ステージサウンド 18
ステージ/UI (Data Asset) Data Assetを使って各ステージのパラメータ情報を管理しています • キャラクターライトの強さ,角度 • 演出中ライトの動き • 演出中カメラの動き PS:ステージ以外もData Asset多用しています 19
ステージ/UI (ライトビルド) MobilityがMoveable以外のライトはライトビルドが必要がある アーティスト作業中に何回もビルドして確認するのに時間がかかる 作業時用に分散ビルド導入 https://docs.unrealengine.com/4.27/ja/RenderingAndGraphics/Lightmass/UnrealSwarmOverview/ 1ステージ クオリティPreview 参加PC台数 1 2 3 4 5 6 ビルド時間(秒) 40.15 25.46 18.77 17.23 16.23 16.75 Jenkinsで製品版用に定期的に自動ライトビルドしてコミット時に使うコマンド ¥Engine¥Binaries¥Win64¥UE4Editor-Cmd.exe XXXXX.uproject -run=resavepackages -buildlighting -allowcommandletrendering map=/Game/XXXXX.umap -quality=Production 20
ステージ/UI (Data Table) キャラクターなど,大量のアセットを扱う時にデータテーブルを使用して一括管理 データテーブル作成 構造体作成(BP) 構造体作成(C++) USTRUCT(BlueprintType) struct FMyDataTableData : public FTableRowBase { GENERATED_USTRUCT_BODY(); /**/ } 21
ステージ/UI (Data Table) ゲームデザイナー,アーティストに渡す作業に相性がいい ・UIが分かりやすい ・CSVなどの形式として出力可能 ・アセットのリファレンス持たせることが可能 22
ステージ/UI (Data Table) UIの一例:キャラクターEnum, テクスチャ,選択中テクスチャ,レイアウトパラメータ 23
ステージ/UI (Data Table) BP共通で困ったこと ・EnumがMAPのキーにする時に同じキー追加できない(保存できない方がいいのでは?) ※開発中この件について無限に質問されました 24
ステージ/UI (Data Table) BP共通で困ったこと ・EnumがMAPのキーにする時に同じキー追加できない ・使用済みのEnumを一度ほかの値にする必要がある 25
ステージ/UI (Data Table) BP共通で困ったこと ・EnumがMAPのキーにする時に同じキー追加できない ・使用済みのEnumを一度ほかの値にする必要がある ・テキストベースで調整する ((NONE, ()),(Arrange01, ()),(Standard, ())) ((Standard, ()),(Arrange01, ()),(NONE, ())) 26
ステージ/UI (継承) テキストスタイルなど,継承関係BP数パターンの用意する 27
ステージ/UI (継承) テキストスタイルなど,親関係BP数パターンの用意する 28
ステージ/UI (継承) 汎用アニメーションを流用するためNamedSlotを使用 →使いすぎて階層が深くなり可読性とパフォーマンスが落ちる 29
加減が必要! 30
ステージ/UI (Focus Lost) UMGのフォーカスが消えて入力が効かないケース ・1つの入力用UMG設定しフォーカスがロストした時にSetFocusToGameViewportを呼び出す 31
ステージ/UI (反転対応) 2P部分のUIは反転対応 32
ステージ/UI (反転対応) 2P部分のUIは反転対応 ・Blueprint Function Libraryに下記のノート用意するだけ 33
ステージ/UI (3D UI) 演出のため画面上部の体力ゲージなどの一部のUIは3D描画 ・HUDとカメラの距離の再計算 ・アセット元の色合いを保持するためポストプロセス適応しないように対応が必要 34
35
ステージ/UI (3D UI) 演出のため画面上部の体力ゲージなどの一部のUIは3D描画 ・HUDとカメラの距離の再計算 ・アセット元の色合いを保持するためポストプロセス適応しないように対応が必要 𝑏 𝑎= tan 𝜃 UI描画解像度/2 距離 = tan(視界FOV / 2) 36
ステージ/UI (3D UI) 演出のため画面上部の体力ゲージなどの一部のUIは3D描画 ・HUDとカメラの距離の再計算 ・アセット元の色合いを保持するためポストプロセス適応しないように対応が必要 ⇒3D Widget のCustom Depth Stencil値をセットしてポストプロセスマテリアルから除外 37
ステージ/UI (3D UI) ・対応後,「Anti-aliasing適応するとHUDがぼやけて見えます」の連絡が来た ( ˙˘˙ )?! 38
ステージ/UI 3D上で描画されたため,アンチエイリアシングにも適応対象である ⇒Custom Depth Stencil を流用し,エンジン改造してFXAAのシェーダーに反映 PostProcessAA経由で SceneTextures渡しFXAAShaderにて除外処理を行う ・/Engine/Source/Runtime/Renderer/Private/PostProcess/PostProcessAA.cpp ・/Engine/Shaders/Private/FXAAShader.usf 39
ステージ/UI 最終結果 40
ステージ/UI 特殊演出についてステージへの補足 ・演出中にカメラが想定外のステージオブジェクトを映り込むの恐れ ⇒事前に各セクションと相談し,セーフゾーンを決めてもらう 41
42
43
目次 • 概要・各セクション構成説明 • パッケージ/クック • ステージ/UI • 最適化 44
最適化 (ステージ) ステージの処理コストを事前に策定 「GPU負荷6ms以下 CPU(Game,Draw Call) 2ms以下」 カリング考慮したアクターマージ 開発後半はアートに任せた 公式ドキュメント: https://docs.unrealengine.com/4.27/ja/RenderingAndGraphics/VisibilityCulling/ 45
最適化 (ステージ) ステージアクターをカーリング考慮したマージ 46
最適化 (UI) ウィジェット リフレクタ (CTRL+Shift+W) を使用して想定外のUIが表示されているか確認 https://docs.unrealengine.com/4.27/ja/ProgrammingAndScripting/Slate/WidgetReflector/ 47
最適化 (ロード) メモリロード Storage AddToWorld Memory Game 48
最適化 (ロード) メモリロード • 同期ロード • 早い • ヒッチ,画面停止(1F内で処理) • 非同期ロード • 比較的に遅い • ヒッチが少なめ 49
最適化 (ロード) ロードについて UI UI バトル 50
最適化 (ロード) UI上の同期/非同期ロードの使い分け 同期ロード 非同期ロード 51
最適化 (ロード) バトルのロード • 非同期ロードを入れるタイミングがない • 「多少画面が止めてもいい,時間はできるだけ短縮させる」の指示を受けた ⇒同期ロード実装 52
最適化 (ロード) • 一気に同期ロードする1フレームが長すぎた(11秒) • 回避のため1FのTimerを入れる Unreal Insights :https://docs.unrealengine.com/4.26/en-US/TestingAndOptimization/PerformanceAndProfiling/UnrealInsights/ 53
まとめ 各セクション構成説明 パッケージ/クック ステージ/UI • ライトビルドの分散ビルド • 多職種に作業しやすい環境 • HUD • etc 最適化 • ステージ • ロード 54
ご清聴ありがとうございました 株式会社SNK 呂 朗標