- Making Better Blueprints - より良いブループリントを書こう
- Making Chorus Sing Across 10 Platforms - 10 プラットフォームに対応したChorus
- Building Modular Characters in Unreal Engine - UEでモジュラーキャラクターを作成する
- Enter the Rumbleverse: What Goes Into a Good Battle Royale? - Rumbleverse: 優れたバトルロワイヤルとは?
- Asset Dependency Chains: The Hidden Danger - アセット依存: 隠れた危険性
- The Gritty Reality of Real-Time Cloth and Rigid-Body Character Physics - クロスとキャラクターの物理について
Making Better Blueprints - より良いブループリントを書こう
ブループリントの組み方。
初心者向け、上級者向けを混ぜた内容。
脱スパゲッティ化
- カラーコーディング
- コメントはカテゴリごとに色分けしよう
- カラーピッカーのテーマ機能を使って色を共有しよう
- ブループリントブックマーク機能を活用する
- コメント + ノードコメントの活用
- ノードの折りたたみ機能の活用
- Math Expressionノードの活用
- Pure関数の活用
- キャッシュされないので扱いには注意
- Validated Getsノードの活用
Tickを正しく使う
- ブループリントからもTickを制御できます。
- アクタのティック | Unreal Engine ドキュメント
- UE4 Tickの処理順序についてのメモ - Qiita
- Tickの無効化
- Tickの更新頻度を減らす
- Tick Groupを設定してTickが実行されるタイミングを制御
- 必ずしもTickを使用しなければいけない訳ではない。下記のような方法でも一定間隔で処理を実行することができる
- Life Spanはとても便利
- "dumpticks" コマンドで Tick を使用しているオブジェクト一覧を表示できる
Construction Script
Splineを使った例
詳細パネルからボタンで実行できると便利
Editor Utility
- Content Examples のディスプレイや部屋も Editor Utility で作られている
- ブループリントを使用してエディタをスクリプト化する | Unreal Engine ドキュメント
クラスの継承
- 共有可能な関数、プロパティを親で定義
- ハード参照を避けるために子ではなく、親にキャストする
- 他の作業者との競合リスクを下げられる
Tag
Tracing
Making Chorus Sing Across 10 Platforms - 10 プラットフォームに対応したChorus
"Chorus" というゲームを 10 のプラットフォームにどのように対応させたかという内容。
主に最適化について。上級者向けの内容。
対応したプラットフォーム、エンジンバージョン
最終的には以下のプラットフォームに対応
最終的には UE4.26.1 でリリース。
ただ、かなりエンジンは改造しており、UE4.27, UE5 から取り込んでいるソースの量も多い。リリース時にはエンジンに 1,000 を超える変更を行っていた。
使用したミドルウェア
- Bink
- FMOD
- Mercuna
プロジェクトのチャレンジ
- 巨大なスケール
- 宇宙という舞台もあり、様々なオブジェクトを大きく作る必要があった。
- セミオープンワールド
- オープンワールドではないが、ほとんどの場所をシームレスに移動可能。
- 様々なプラットフォーム、ハードウェア構成に対応
最適化するタイミングはいつか
"Premature optimization is the Root of All Evil" - Donald Knuth
"早まった最適化は諸悪の根源である" - ドナルド・クヌース
という言葉があるが、あまり同意できなかった。
事前に適切なデザインパターン、データ構造を設計しておくことが大切。
開発中、常にローエンドプラットフォームで動くように気をつけていた。
最適化のスケジュール
開発期間は3年半あったが、最後の6ヶ月間は最適化に費やした。
計測
各プラットフォームで毎晩計測。計測は Jenkins で自動化。
Chorus はプラットフォーム別の実装はなかったため、プラットフォームの違いはパフォーマンスの違いのみだった。そのため、ローエンドのプラットフォームに注力して最適化を行っていた。
・定点計測
予め決められた定点位置で計測。
・ストリーミング計測
ゲーム内の様々なレベルを読み込み、どのくらい時間がかかったか計測。
さらに深掘りし、レベル内の各アセットの読み込み時間も確認可能。
UEの機能を存分に活かそう
- Device profiles
- スケーラビリティ設定
- Dynamic Resolution
- ブループリントのC++化
- 計算量が多いものはできるだけC++に移す
- Significance Manager
- World Composition
- ワールド合成のユーザーガイド | Unreal Engine ドキュメント
- UE5 からは World Partition があるが、Chorus ではまだUE4だったためこちらを使用
その他の最適化
- UI
- UI Particle System プラグインを使うことで、3~4倍パフォーマンスが改善された。
- UI Particle System in Code Plugins - UE Marketplace
- 爆発シミュレーション
- 物理でシミュレーションをしていたため、パフォーマンスが悪くドローコールも多かった。
- 爆発自体を Skeletal Mesh にすることで骨の移動処理だけで済み、パフォーマンスが改善された。
Building Modular Characters in Unreal Engine - UEでモジュラーキャラクターを作成する
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の完成。
メッシュを入れ替えるだけで様々なバリエーションのキャラクターが作れる。
Enter the Rumbleverse: What Goes Into a Good Battle Royale? - Rumbleverse: 優れたバトルロワイヤルとは?
"Rumbleverse" というバトルロワイヤルのゲームを作るにあたって常に 60FPS で動作するように最適化をした方法。
主に描画周りについての最適化。上級者向けの内容。
Rumbleverseの概要
- プレイヤー数40人
- 近接戦闘
- 1km四方のマップ
- カスタマイズ性の高いキャラクター
- 対応プラットフォーム
- パフォーマンスターゲット:1080p 60FPS on PS4
- エンジンバージョン:UE4.7.1
- 開発期間:3年
- チームメンバー:ピーク時で104人
Level Streaming
レベルをグリッド分けして各クライアントで適切なグリッドを読み込む。
World Composition を活用。
プレイヤーのオクルージョンとアウトライン
プロト段階でエフェクトを Custom Depth + ポストプロセスで作成。
パフォーマンスに問題あった。ステンシルバッファで余分にメモリを使ってしまう。キャラクターのレンダリング時間も延びる。
必要なピクセルのみ計算するシェーダーを作り解決した。
有用なコンソールコマンド
アセットの監視に有用なコンソールコマンド一覧。
大きいプロジェクトほど有用。
ListTextures (-nonstreaming) | 読み込まれているテクスチャの表示 |
ListStaticMeshes (-usedcomponents) ListSkeletalMeshes (-usedcomponents) |
読み込まれているスタティックメッシュの表示 -usecomponents を付けるといくつコンポーネントとして参照されているか表示可能 |
Obj List (-class=) Obj Refs (-name=) |
読み込まれているオブジェクトの表示 オプションでフィルターすると便利 |
gc.ListClusters (-Hierarchy) | メモリ上にあるクラスタールートのリストを出力 -Hierarchy を付けるとすべてのクラスタールートとその下にぶら下がっているオブジェクトも出力 |
gc.DumpRefsToCluster | クラスターの参照情報を出力 |
Asset Dependency Chains: The Hidden Danger - アセット依存: 隠れた危険性
アセットの依存について。プログラマー向けの内容。
エディタ起動時に読み込まれてしまうケース
以下のケースは注意しなければいけない
- Anim Notify
- アニメーションエディタの Anim Notify は全てロードされる(UE4の情報、UE5以降は分からない)
- Blueprint Function/Macro Library
- C++クラスの Class Default Object (CDO) で直接アセットを参照
予防策
- "Size Map", "Reference Viewer" を活用して定期的にチェックする
- Soft Reference をできるだけ使う
- 可能の限りロジックを親クラスで実装(親クラスを参照)
- Asset Manager を活用する
- Interface を活用する
- Enum, GameplayTag で判定
- Asset Registry を活用する
- 独自の予防ツールを作成
- 全アセットに対して"Size Map"を実行するCommandlet
- サイズが閾値を超えるものをリスト化
- アセットごとに別の閾値で判定
- UE4 Commandletでアセットを一括修正してみる - Qiita
- Data Validatiorを作成
- 全アセットに対して"Size Map"を実行するCommandlet
Imgui を使ったツールを作成。
依存関係を視覚的に確認できるファイルも出力可能。
The Gritty Reality of Real-Time Cloth and Rigid-Body Character Physics - クロスとキャラクターの物理について
クロスとキャラクターの物理を設定する際のベストプラクティス、いくつかのデバッグ方法について。
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ツールで編集したものを再インポートしても更新されません。
以下のワークフローであれば更新可能。
- 古いClothデータの削除
- スキンウェイトの再インポート
- LOD 0を作成
- 右クリックからパラメーターの再マッピング
Chaos Cloth のデバッグ
・Stat Chaos Cloth
※ 注意
ビューポートだけでなく、"Skeletal Mesh Editor" の Cloth も計測されるのでビューポートのみ計測したい場合は "Skeletal Mesh Editor" のウィンドウを閉じるか最小化すること。
・コンソール変数
画像のような変数を活用してデバッグが可能。
Editor Utility Widget から実行できるようにすると便利。アーティストも嬉しい。
RBAN(Rigid Body Animation Node)
RBANについての記事
unrealengine.hatenablog.com
・UE5 で改良された点
- "Simulated Mode" と "Editor Mode" が同じソルバーを使用
- イテレーション回数が減り、より安定するように
・質量の設定
親の質量を超えないように設定。
・ジッタリング(暴れ)の調整
- 暴れる場合はまず重力を無効にして調整
- 小さなリジッドボディにも慣性が設定されていることを確認
- Linear Damping、Angular Damping を設定する
- コリジョン間のコンストレイントを無効にして確認
- 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 プラグインの追加
シミュレーションのキャッシュができる。
主にシーケンサーで使用。