【UE5】Unreal Fest 2022 レポート(1)

shuntaendo.hatenablog.com


Making Better Blueprints - より良いブループリントを書こう

youtu.be

ブループリントの組み方。
初心者向け、上級者向けを混ぜた内容。

脱スパゲッティ化



Tickを正しく使う


Blueprint Debugger



BP Header Tool

  • BPからC++のヘッダーをリアルタイムに生成可能
    • UEC++の学習にも有用
  • UE5.1 Preview から使用可能



Construction Script

Splineを使った例


詳細パネルからボタンで実行できると便利



Editor Utility

 

クラスの継承

  • 共有可能な関数、プロパティを親で定義
  • ハード参照を避けるために子ではなく、親にキャストする
  • 他の作業者との競合リスクを下げられる

 

Data Table

  • データを並べて見るのに便利
  • JSON, CSV 形式で入出力可能


Blueprint Function / Macro Library


Tag



Tracing







Making Chorus Sing Across 10 Platforms - 10 プラットフォームに対応したChorus

youtu.be

"Chorus" というゲームを 10 のプラットフォームにどのように対応させたかという内容。
主に最適化について。上級者向けの内容。

store.steampowered.com

対応したプラットフォーム、エンジンバージョン

最終的には以下のプラットフォームに対応


最終的には UE4.26.1 でリリース。
ただ、かなりエンジンは改造しており、UE4.27, UE5 から取り込んでいるソースの量も多い。リリース時にはエンジンに 1,000 を超える変更を行っていた。

使用したミドルウェア

  • Bink
  • FMOD
  • Mercuna


プロジェクトのチャレンジ

  • 巨大なスケール
    • 宇宙という舞台もあり、様々なオブジェクトを大きく作る必要があった。
  • セミオープンワールド
  • 様々なプラットフォーム、ハードウェア構成に対応


パフォーマンスターゲット

基本 60FPS をターゲットにしているが、ローエンドの PS4, Xbox One に関しては 30FPS のみサポート。



最適化するタイミングはいつか

"Premature optimization is the Root of All Evil" - Donald Knuth
"早まった最適化は諸悪の根源である" - ドナルド・クヌース

という言葉があるが、あまり同意できなかった。
事前に適切なデザインパターン、データ構造を設計しておくことが大切。

開発中、常にローエンドプラットフォームで動くように気をつけていた。

最適化のスケジュール

開発期間は3年半あったが、最後の6ヶ月間は最適化に費やした。



計測

各プラットフォームで毎晩計測。計測は Jenkins で自動化。
Chorus はプラットフォーム別の実装はなかったため、プラットフォームの違いはパフォーマンスの違いのみだった。そのため、ローエンドのプラットフォームに注力して最適化を行っていた。

・定点計測
予め決められた定点位置で計測。


・ストリーミング計測
ゲーム内の様々なレベルを読み込み、どのくらい時間がかかったか計測。
さらに深掘りし、レベル内の各アセットの読み込み時間も確認可能。

 

UEの機能を存分に活かそう


その他の最適化


  • 爆発シミュレーション
    • 物理でシミュレーションをしていたため、パフォーマンスが悪くドローコールも多かった。
    • 爆発自体を Skeletal Mesh にすることで骨の移動処理だけで済み、パフォーマンスが改善された。







Building Modular Characters in Unreal Engine - UEでモジュラーキャラクターを作成する

youtu.be

Lyra を参考にキャラクターの追加、交換、カスタマイズするためのテクニックについて。
Epic Gamesスタッフによる講演。

モジュラーキャラクターとは何か?

髪、顔、腕、足、体などパーツごとに切り離せるキャラクターのこと。
パーツごと切り離すことで、例えば髪型が同じ別キャラクターなどで髪のパーツを使い回せる。

Fortnite、Windwalker Echo、MetaHumans でもモジュラーキャラクターを意識して作っている。

まずは無料のプロジェクト、アセットで学ぶ。
Lyra プロジェクトにモジュラーキャラクターのアセットを追加して試してみよう。

Lyra Starter Game in UE Game Samples - UE Marketplace
Stylized Character Kit: Casual 01 in Characters - UE Marketplace

モジュラーキャラクターをブループリントで作成

1つのパーツを親にして他のパーツをぶら下げる。




Construction Script でトップのパーツ以外の子パーツに対して、"Set Leader Pose Component" でトップのパーツのアニメーションに追従させる。
※ UE5.0 以前は "Set Master Pose Component" というノード




多くの場合はアクセサリーも追加したいはず。
バックパックモデリングしたのでこれを追加してみる。




まずは上半身のメッシュにソケットを追加して、位置を調整する。
ブループリントでバックパックのメッシュコンポーネントを追加して、親のソケットを追加したソケットに設定する。

 


ブループリントと Skeletal Mesh Editor のウィンドウ両方を開きながらすると調整しやすい。




バックパックのアニメーションブループリント(ABP)を作成。




バックパックに物理を適用するために Rigid Body ノードを用いてABPを組む。




ブループリントからではなく、Skeletal Mesh Editor の設定から Post Process Anim Blueprint を設定。
Post Process Anim Blueprint は通常のABP(Anim Instance)の処理が完了した後に呼ばれるABPです。

※ p101~
www.docswell.com


骨格が違うメッシュを使うにはどうしたらよいか。
上半身のメッシュを襟付きの服に変更してみる。

  


「showflag.bones 1」でボーンを表示すると襟にもボーンが入ってるはずだが表示されない。

 

理由は Set Leader Pose Component で追従させているため。Set Leader Pose Component を使うと Leader Pose Component のボーンに依存する。
骨格が違うメッシュは違う方法でアニメーションを適用しなければいけない。


上半身用のABPも作成する。
バックパックの時に使っていた Input Pose の部分を Copy Pose From Mesh に置き換えるとアニメーションが適用される。
※ Set Leader Pose Component よりは負荷が高いです。




これでモジュラーキャラクターBPの完成。
メッシュを入れ替えるだけで様々なバリエーションのキャラクターが作れる。



Control Rigで表情を変化させる

Set Curve Value を活用して自然な動きを作る。
簡易的な口角の上げ下げ、瞬きの例。

 

UE5からのリターゲット

IK Retargeter を作成。
ABPから Retarget Pose From Mesh で指定。

www.docswell.com






Enter the Rumbleverse: What Goes Into a Good Battle Royale? - Rumbleverse: 優れたバトルロワイヤルとは?

youtu.be

"Rumbleverse" というバトルロワイヤルのゲームを作るにあたって常に 60FPS で動作するように最適化をした方法。
主に描画周りについての最適化。上級者向けの内容。

www.rumbleverse.com

Rumbleverseの概要

  • プレイヤー数40人
  • 近接戦闘
  • 1km四方のマップ
  • カスタマイズ性の高いキャラクター
  • 対応プラットフォーム
  • パフォーマンスターゲット:1080p 60FPS on PS4
  • エンジンバージョン:UE4.7.1
  • 開発期間:3年
  • チームメンバー:ピーク時で104人


Level Streaming

レベルをグリッド分けして各クライアントで適切なグリッドを読み込む。


World Composition を活用。



キャラクターカスタマイズ

各スキンを Skeletal Mesh で作るのはパフォーマンスが悪い。


各パーツごとにマテリアルを分けてスキンを表現。使わない箇所は非表示に。



プレイヤーのオクルージョンとアウトライン

プロト段階でエフェクトを Custom Depth + ポストプロセスで作成。
パフォーマンスに問題あった。ステンシルバッファで余分にメモリを使ってしまう。キャラクターのレンダリング時間も延びる。

必要なピクセルのみ計算するシェーダーを作り解決した。



Instanced Static Mesh

Instanced Static Mesh Component を GPU で処理することで描画負荷を改善した。



有用なコンソールコマンド

アセットの監視に有用なコンソールコマンド一覧。
大きいプロジェクトほど有用。

ListTextures (-nonstreaming) 読み込まれているテクスチャの表示
ListStaticMeshes (-usedcomponents)
ListSkeletalMeshes (-usedcomponents)
読み込まれているスタティックメッシュの表示
-usecomponents を付けるといくつコンポーネントとして参照されているか表示可能
Obj List (-class=)
Obj Refs (-name=)
読み込まれているオブジェクトの表示
オプションでフィルターすると便利
gc.ListClusters (-Hierarchy) メモリ上にあるクラスタールートのリストを出力
-Hierarchy を付けるとすべてのクラスタールートとその下にぶら下がっているオブジェクトも出力
gc.DumpRefsToCluster クラスターの参照情報を出力


コンテンツブラウザでのアセット検索

メタデータを駆使してフィルターでアセットを絞り込む。

docs.unrealengine.com





Asset Dependency Chains: The Hidden Danger - アセット依存: 隠れた危険性

youtu.be

アセットの依存について。プログラマー向けの内容。

アセット依存が引き起こす問題

  • エディター
    • エディタの起動時間
    • アセットを開く際の時間
    • Cook時間
    • メモリ使用量
  • ランタイム
    • メモリ使用量
    • GCパフォーマンス


エディタ起動時に読み込まれてしまうケース

以下のケースは注意しなければいけない

  • Anim Notify
    • アニメーションエディタの Anim Notify は全てロードされる(UE4の情報、UE5以降は分からない)
  • Blueprint Function/Macro Library
  • C++クラスの Class Default Object (CDO) で直接アセットを参照


アセット依存を探す方法

・Size Map
historia.co.jp

・Reference Viewer
docs.unrealengine.com

ハード参照が起こるケース

  • 変数
  • Data Table
  • Data Asset
  • 関数/マクロの引数
  • キャスト

hexadrive.jp

予防策




Imgui を使ったツールを作成。
依存関係を視覚的に確認できるファイルも出力可能。

 





The Gritty Reality of Real-Time Cloth and Rigid-Body Character Physics - クロスとキャラクターの物理について

youtu.be

クロスとキャラクターの物理を設定する際のベストプラクティス、いくつかのデバッグ方法について。
Epic Games のキャラクター物理専門のテクニカルマネージャーによる講演。

Chaos Cloth と NvCloth の違い

・新しいパラメーター


・新しいペイントマスク


・クロスごとに割り当てることができるコリジョン数の上限解除
NvCloth では 32Collision までという制限があった。


・Convex Collision のサポート


・Back Stop 処理の簡略化


・Anim Drive Stiffness のアップデート
シュミュレーションが入力アニメーションシェイプにどの程度一致するかの値。


・風のアップデート

 


・フィールドシステムのサポート
フィールドは Chaos Destruction や Niagara で使われるものと同様の機能です。


・ブループリントのサポート

 


・架空の角度スケール


コリジョンのアップデート
静的なオブジェクトとClothとの衝突を単純化


・シミュレーション設定の共有



Chaos Cloth の重要な概念

テッセレーションイテレーション
シミュレーションメッシュ内のテッセレーションが多くなるほど、必要なイテレーションも多くなる。
例えば、革素材の衣服であればテッセレーションは少なくするべき。Cloth のアセットをデザインする時はまず素材を考慮するべき。

イテレーションが少ないということは、Clothの見た目に関してもさほど変化がないということなので、"Edge Stiffness" や "Bending Stiffness"の値は1にするべき。


・ポリゴン
正方形のポリゴンでメッシュを作成するとパラメータを細かくコントロールしやすい。


・調整パラメーター
革、シルクなどの決まったパラメーターのプリセットは無い。
メッシュの頂点数、テッセレーションなどによって変わってくる。
それでも NvCloth の時よりは調整しやすくなっている。

Content Examples プロジェクトの Cloth レベルにサンプルがあるので参考になるはず。


・Clothデータ
Clothデータは不変なデータです。そのため、DCCツールで編集したものを再インポートしても更新されません。
以下のワークフローであれば更新可能。

  1. 古いClothデータの削除
  2. スキンウェイトの再インポート
  3. LOD 0を作成
  4. 右クリックからパラメーターの再マッピング



Chaos Cloth のデバッグ

・Stat Chaos Cloth
※ 注意
ビューポートだけでなく、"Skeletal Mesh Editor" の Cloth も計測されるのでビューポートのみ計測したい場合は "Skeletal Mesh Editor" のウィンドウを閉じるか最小化すること。




・コンソール変数
画像のような変数を活用してデバッグが可能。

 


Editor Utility Widget から実行できるようにすると便利。アーティストも嬉しい。



RBAN(Rigid Body Animation Node)

RBANについての記事

dev.epicgames.com

unrealengine.hatenablog.com


・UE5 で改良された点

  • "Simulated Mode" と "Editor Mode" が同じソルバーを使用
  • イテレーション回数が減り、より安定するように


・質量の設定
親の質量を超えないように設定。


・ジッタリング(暴れ)の調整

  1. 暴れる場合はまず重力を無効にして調整
  2. 小さなリジッドボディにも慣性が設定されていることを確認
  3. Linear Damping、Angular Damping を設定する
  4. コリジョン間のコンストレイントを無効にして確認
  5. Project Settings で "Substepping" を有効にして確認 ※ 有効にすると負荷が高くなるので注意


・小さいオブジェクトの調整
イヤリングなどの小さい揺れ物の調整方法のヒント。

  • 重力は低く設定
  • "Simulation Space" は "Base Bone Space" に設定
  • イテレーションと慣性を増加させる


・動きが早い揺れ物
従来の方法(こちらも有用):加速度パラメーターを設定

新しい方法:Sim Space のパラメーターを設定


コリジョンの最適化

  • 衝突するボディの数を減らす
  • 当たり前だが、Box より Capsule の方が処理負荷が高い


Cloth のアートディレクション

Unreal Fest 2019 の講演の例
Anim Dynamics(UE4.11から実装された物理制御ノード)を使用しているためパフォーマンスは悪いが、モバイルプラットフォームで動作するように最適化されている。




・Fortnite
Cloth、RBAN、Anim Dynamics を組み合わせている。


・組み方の例
正解は無くプロジェクトによって組み方は異なるが、1つの例。




・Lyra
"CR_Mannequin_FootPlant" アセットを覗くと Control Rig と Anim Drive を活用した例が確認できる。



UE5.1 の 新機能

・Physics Control Component
Content Examples で確認可能。




・Cloth に圧力強度パラメーター追加
常に法線方向に力を加え続け、膨らんだりしぼんだりする風船のような動きが作れる。




・Cloth に Buckling パラメーター追加
曲げ剛性(Bneding Stiffness)に対する拡張。
素材の角度を超えて曲がった際に Buckle Stiffness の値が使われる。
通常曲がりにくいが、一度曲がると復元力が失われるような素材に使う。




・Cloth の自己衝突処理が改善
処理負荷が高いので注意。

Self Collision Friction 自己接触した場合の抵抗量。
Use Self Intersections 面で判定する自己交差判定。
荒い解像度の SimMesh でのめり込みを軽減。




・Cloth Caching プラグインの追加
シミュレーションのキャッシュができる。
主にシーケンサーで使用。