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

shuntaendo.hatenablog.com


How to Create Scripting Tools That Designers Love - デザイナーが好むスクリプトツールの作成方法

youtu.be

デザイナーが触るスクリプトツールの作成について。

概要

デザイナーがブループリントを触ると悲惨なことになるケースも少なくない。
誰しもスパゲッティコードは避けたい。




Mission System というノードベースのスクリプトを作成。
ブループリントよりもより大きいくくりでロジックを組める。分岐ノードなども用意。




デバッグは全てGUI上から行う。




他のアクターとのやり取りなどもプログラマーが用意する。



アクター間の連携方法

スイッチを押すとドアが開くギミックを例に説明。

アクターの紐づけは詳細パネルから行う。
ゲームイベントの種類、どのアクターと紐づけるかなど。紐づけると視覚的にどのアクターと紐づいているかわかる。

 

手書きスクリプト

詳細パネルから文字列でスクリプトを記述できるオプションを追加することでより柔軟な設計に。
ただ、強力な機能のためバグも多発した。



設定手順の簡略化

細かい配慮をすることでデザイナーの作業がより楽になるように。

クラス指定するプロパティにフィルタを掛けるメタ指定子を付けることで、プルダウンメニューから選ぶ際に余計な候補が出ないようにした。




同じくメタ指定子を活用してプロパティの表示優先度を調整。







Working with Data in Unreal Engine 5 - UE5でのデータ管理

youtu.be

Unreal Engine内でデータ管理する様々な方法。
Epic Gamesスタッフによる講演。

概要

プログラマーだけでなく、デザイナーやアーティストとのコラボレーションの強化、デザイナーやアーティストもUEのデータ管理に慣れるためのきっかけになれば。
決まった方法ではなく、プロジェクトの要件に応じて様々な方法を考慮する必要がある。

Data Table

  • 慣れ親しんだ表フォーマット
  • ブループリント or C++ で構造体を定義して作成
  • JSONCSV形式でインポート/エクスポートできる

・構造体の作成方法

kagring.blog.fc2.com


・問題点

  • 構造体は継承できない
  • 常にハード参照に注意しないと1つのData Table を読み込んだ際に大量にロードが発生する可能性がある
  • 単一のバイナリファイルのため、同時に作業ができない



・Composite Data Table
同時に作業ができない問題は、Composite Data Table を活用すれば解決する。

historia.co.jp

HTTPリクエス

  • HTTP通信で外部データにアクセス可能
  • エディターもしくはランタイム時にデータを取得しすぐに扱える
  • UE5.1 からブループリントでも実行可能

C++での実装
HTTPリクエストを行いデータを取得する Editor Utility Widget(EUW)を作成。




C++ で作成したノードでHTTPリクエストを行う。
非同期ノードは UBlueprintAsyncActionBase を継承することで簡単に作成できる。

 


取得したJSONデータは、JsonObjectToYStruct関数を使うことで簡単に構造体へ変換できる。




・Blueprintでの実装
Http Get Request ノードだけで可能。非常に簡単。



Web API

UE5.1 から Web API プラグインが追加されました。
Web API を活用してWebサーバー上の情報を取得できます。




取得したJsonデータをコンテンツブラウザ上にD&Dすると専用のアセットが作成されます。




アセットを開くとこのようなウィンドウが出る。
左のウィンドウは OpenAPI スキーマを表示しており、右はUEの型と関数を表示。



ブループリントでデータ管理

ブループリントのデフォルト値を使って Data Table の代わりに管理する方法。

1.UObjectを継承したブループリントを作成
データ管理したい構造体の変数を追加しておく。




2.子ブループリントを作成
これら1つ1つは Data Table の行のような扱い。




3.データの取得
「2」で作成したブループリントの変数を Soft Class Reference で追加。
Get Class Default ノードで値を取得できる。

 


4.抽象クラスに設定
「1」で作成したベースクラスはプルダウンのリストに表示したくないので Generate Abstract Class にチェックを入れて抽象クラスに。
必要に応じて子クラスでも設定する。

 


5.プロパティマトリックスでリスト化

 

Unreal Engine のプロパティ マトリックス | Unreal Engine 5.0 ドキュメント

UE4で大量のデータを一気に編集するプロパティマトリクスがとっても便利! - Let's Enjoy Unreal Engine

Data Asset

ブループリントでの管理に似ているが、データの管理に特化したアセット。

まずは C++ で作成。

 


コンテンツブラウザ上で Data Asset を作成。
継承してアセットを作れるという点ではブループリントと似ている。




自動的にロードされないようにソフトポインタで変数を作成し、データを取得します。




また関数を定義してデータ取得、整理、収集などに使えたりします。




ソースコントロールの Diff 表示にも対応している。

 

Instancedプロパティ

UObject継承のクラスを他のオブジェクトにアタッチする形で設定します。




プロパティには Instanced 指定子を付けます。

benui.ca


UObejct継承のクラスにもいくつか指定子を付けます。

benui.ca

メタ指定子

メタ指定子を活用してプロパティを制御する。
詳細パネルへの表示、非表示、他のプロパティへの依存など。

historia.co.jp

Data Validation

データ設定の間違いが発生する前に発見することができる。

docs.unrealengine.com

Curve Table

多数の曲線を管理できる。

benui.ca


CSVファイルからインポート可能。



Gameplay Tags

グローバルに事前に定義されたFNameのようなもの。階層構造で設定可能。

docs.unrealengine.com

Asset Registry

アセットロードせずにデータの値を見ることができる非常に強力な機能。

アセット レジストリ | Unreal Engine ドキュメント

shuntaendo.hatenablog.com


プロパティに AssetRegistrySearchable を追加するとアセット検索情報として追加される。
GetAssetRegistryTags をオーバーライドすれば独自のタグを追加できる。

 


コンテンツブラウザ上でも追加した情報を元にリスト化、ソートすることも可能。

 





Building Tools Quickly: Blueprints, Menus, Utilities, and Widgets - ツールの迅速な構築: ブループリント、メニュー、ユーティリティ、ウィジェット

youtu.be

ツールの迅速な構築方法。Unreal Editor の拡張性について。

概要

優れたツールは作業時間を節約できる。

開発では様々なサービスやソフトを行き来する。

最新のサービスでは各サービスで連携できる。
Miro にJIRAを埋め込めたり、Notion に Google Drive のプレゼンテーションを埋め込めたり。

Unreal でもこのように他のサービスと行き来できたら作業効率が上がる。


計画性をもって開発を進めよう。設計に時間を掛けることは重要。



Angelscript

Unreal Engine Angilscript を使用している。

angelscript.hazelight.se

・Angelscriptの特徴

長所 短所
・迅速なイテレーション
・ホットリロード
・ランタイムでブループリントより高速に動作
・テキストのみ(差分、マージが容易)
・簡単にスクリプトC++に移動可能
・エンジンごとForkする必要がある
・ブループリントよりもインターフェイスが少ない



・実装例
アクターをリネームする処理を、ブループリントで書いたものとAngelscriptで書いたもの。

 

どの機能でツールを作成するべきか?

年々UEにはツール作成の機能が増えている。

  • Construction Script
  • Asset or Actor Action Utilities
  • Blutility Button
  • Asset Validators
  • Custom Menu & Icon Buttons
  • Editor Utility Widget



・Construction Script

良い点 悪い点
なんでもできる なんでもできる

なんでもできる故に安全性、安定性を保つのが難しい。


・Actor Action Utilities
オブジェクト右クリック時のメニューに独自の項目を増やせる。

非常に簡単に作れるが、作りすぎると煩雑になりがち。

GetSupportedClass をオーバーライドして実装することでメニューを表示するオブジェクトを絞ることができる。

 


・Blutility Button
ブループリントで関数の設定から Call in Editor にチェックを入れるだけ。非常に簡単。




・Asset Validators
ミスを事前に避けられる。CIで使用。



・Custom Menu & Icon Buttons
表示させる場所もカスタマイズできる。ツールに適した機能。

kinnaji.com


・UDeveloperSettings
プロジェクトに依存しないConfigを作成可能。

【UE4】UDeveloperSettingsでプロジェクト設定に項目を追加する|株式会社ヒストリア

UE4 UDeveloperSettingsでプロジェクト設定追加を試してみる - Qiita


・Editor Utility Widget
UEでのツール作成機能の真骨頂。
独立したウィンドウとして作成可能でツールバーに登録も可能。WidgetでUIを簡単に作れる。




実際にプロジェクトで作成した例。
キャラクター、モジュラーパーツなどの確認用ツール。フィルター機能があり、右上のアイコンからはプロジェクトの各サービスに飛べる。



Skyhook

Embark というプロジェクトで使用されたツール。
DCC、スタンドアロンアプリケーション、Webブラウザー、ゲームエンジン間の通信を容易にするもの。

Python で書かれたオープンソースのツール。

github.com


UEでは Remote Control API プラグインを使用する。




Slack等に貼られたURLに飛ぶと、UEエディターが自動で動き、URLで指定された場所にカメラが動いたりアセットを自動で選択したりする。







Maximizing Your Game’s Performance in Unreal Engine - UEでゲームのパフォーマンスを最大化する方法

youtu.be

パフォーマンスの計測方法やボトルネックの見つけ方。
Epic Gamesスタッフによる講演。

フレームレートとは?

開発者が使える1フレームの処理時間の予算。
60FPS であれば 16.66ms 以内に、30FPS であれば 33.33ms 以内に CPU と GPU の処理を収めなければならない。

PCの場合は、ユーザーごとに異なるスペックなので余分を持たせる必要がある。
モバイルの場合は、端末が熱を持ってパフォーマンスが落ちるため余分を持たせる必要がある。



最適化はいつ開始するべきか?

常にする必要はない。
ターゲットのフレームレートを割った時に随時するべき。

ただ、常にコードの綺麗さなどは意識するべき。

最適化の順序

What? Why? How?

  1. "何が"原因か
  2. "なぜ"遅くなっているのか
  3. "どうやったら"修正できるか


Unreal Insight

独立したプロファイル用ツール。エディターからも起動可能。
主にCPU、ファイル、メモリの調査に向いている。

docs.unrealengine.com

ProfileGPU

GPU用のプロファイルツール。
"Cntl + Shift + Comma(,)" で現在のフレームをキャプチャし、プロファイルできます。

docs.unrealengine.com

プロファイルケース

Lyra プロジェクトを例にプロファイルしていきます。

・フレームレートが遅い場合
まずは現在のフレームレートを「stat fps」「stat unit」で確認する。




数値を見るとGPUの処理に時間が掛かっていることがわかるので ProfileGPU でプロファイルしてみる。
ShadowDepths の RasterPasses で負荷が掛かっていて、Point Light が原因ということが分かった。

 


実際にアウトライナー上で Point Light を見てみる。
Cast Shadow が有効になっており、減衰距離も 5,000 と広い。どちらも修正したところ無事 60FPS になった。




・ヒッチが起きる場合
プロジェクトをパッケージして Unreal Insight でプロファイルしてみる。
Unreal Insight はPIEやスタンドアローンゲームでも動作します。

パッケージしたExeのショートカットに起動引数を追加してプロファイルする。
ゲームの起動と同時に計測が始まります。

 


結果を見てみるとオブジェクトのロードに大きく時間が掛かっていた。
Unreal Engine の良いところはソースコードがあるところ。Unreal Insight で関数名が出ているので実際にコードを見に行くことができる。




メモリリーク
メモリリークが発生してると発覚した場合(報告された場合)は必ずしもクラッシュするまで待つ必要はない。

Memory Insights でプロファイルする。
ガベージコレクションのタイミングを表示したり、範囲と条件を指定してクエリを実行するなど機能が豊富。

Unreal Engine 5 の Memory Insights | Unreal Engine 5.0 ドキュメント

[UE4] Memory Insightsを使用したメモリトラッキング - Qiita

おまけ:どこがメモリリークしているか?




正解:
new している箇所。ヒープ上に作成している。
C#に慣れている人が陥りがち。「*new」は必要ない。







Crystal Dynamics: Taking the Heroic Leap from a Proprietary Engine to UE5 - 内製エンジンからUE5への移行

youtu.be

内製エンジンからUE5への切り替えについて。
スライドは無く、複数の開発者によるトークセッション。

移行した経緯

業界の技術の発展速度はとても早く、エンジンのアップデートコストが高くなっていった。
社内でエンジンを作るのとゲームを作る両立は難しい。エンジンを作っているメンバーもゲーム制作に投入したらさらにクオリティを上げられると考えた。

内製エンジンのアップデートの度にUnrealの実装についても何度も参考にしていた。

移行の判断は慎重に行った。
エンジニアチームでUnrealの特徴をリストアップして点数を付け、長所/短所を明確にした。
その時一番点数が高かったのはストリーミングシステム、低かったのはマルチユーザーワークフローだった。

移行時の課題と利点

移行するのは簡単ではなかった。
今まで作成していたゲームは内製エンジンとの依存度が高く、技術的に移行が難しい部分もあった。

6ヶ月の学習期間を設けて、チーム全員でUnrealを学んだ。
デザイナーやスクリプターもブループリントを1から学んだ。

内製エンジンのアセットのフォーマットはXMLだったため、競合してもマージは問題なく行えるので長時間のチェックアウトに慣れていた。
UEのuassetは全てバイナリなのでワークフローの見直しが必要だった。

様々なところでUEの利点を感じた。
アニメーションの確認の楽さ、シーケンサーVFXシステムなどパワフルなツールが揃っている。
エンジニアだけでなく、デザイナーやアーティストも多くの恩恵を感じた。





From Liquid to Unreal: Why We Ditched Our In-House Engine - LiquidからUnrealへの移行:内製エンジンを捨てた理由

youtu.be

内製エンジンの Liquid Engine から Unreal Engine に移行した話。

移行した経緯

2018年に内製エンジンである Liquid Engine を再構築して Liquid Engine 2 を開発する計画が立った。

2021年には社内プロジェクトの1つの使っていた Unreal Engine の魅力に惹かれ、Liquid Engine 2 から Unreal Engine に移行する判断に至った。




Liquid Engine 2 では多くのツールを開発した。データドリブンな設計。
しかし、低レベルレイヤーの開発に注力しすぎた。

 

チームの目的はゲームを作ること、ユーザーに素晴らしい製品を届けること、そしてお金を稼ぐこと。
それらを念頭に置いて、Liquid Engine 2 での開発を続けるべきか検討した。

エンジン移行

既に社内に Unreal Engine を使ったプロジェクトがあったので、パイプラインとノウハウは流用できた。

UEのアウトソーシングに恩恵を感じた。外部のパートナーを見つけるのが非常に簡単になった。

・移行に関する3つのフェーズ

  1. Unity でも検証していたため、Unity で進行中のプロトタイプと技術デモのタスクのクローズ
  2. 1~2週間のウォームアップとチュートリアル、チーム全体の検証期間
  3. ゲームジャム。4つのチームに分けて各チームの目標を達成する

各職種ごとの技術のアップデートや語彙の統一、UEに合わせたワークフローの改善を行った。




社内ツール、パイプラインも捨て、見直す必要があった。

開発チーム、QAチームの構成も見直した。(70人以上のチーム)

 





UE Mobile Rendering Update: Recent Enhancements for Modern Mobile Devices - モバイルレンダリングアップデート:モバイル向けの機能強化

youtu.be

UE5.1 の新機能を含む、モバイルレンダリングの追加機能や改善点について。
Epic Gamesスタッフによる講演。(Epic Games Japan の Axelさん)

UE4とUE5のモバイルレンダリングの違い

  • 大きな変更点は Forward shading と Deferred shading
    • Forward shading に大きなリワークと新機能が含まれている
    • 実験的機能だった Deferred shading は UE5.1 から Production-Readyに
  • シャドウマップのカスケード数はスケーラビリティによって調節可能
  • 複数のポイントライトとスポットライトを配置可能
  • UE4では単一の Reflection Capture から画像ベースのライティング、UE5からはピクセル単位で Reflection Capture を適用
  • 複数のシェーディングモデルをサポート
  • FSRアップサンプリングのサポート
  • Gen4 TAA、FXAAのサポート



UE5.0、UE5.1の新しいレンダリング機能と拡張機能

デスクトップレンダラーと比較してモバイルレンダラーでも一部の機能は使えるが制限がある。




UE4 では最大4つのライトが選択され、フォワードパスの一部としてレンダリングされていた。
UE5.1 からは錐台空間のライトグリッドを使ってデスクトップフォワードでレンダリングされる。




リフレクションの例。
床は1つのスタティックメッシュ。UE4だと単一の Reflection Capture しか参照できなかったのではんしゃの結果が正しくない。UE5.1 からピクセル単位で Reflection Capture を参照しより自然な反射に。



Mobile Deferred Shading

Deferred shading が強化。
デスクトップの Deferred shading を移植したものではない。モバイル向けに新しく作られた。




Deferred shading は見た目の改善に加えて、メモリを削減しシェーダーのヒッチを減らせるメリットもある。

 


フォートナイトでのパフォーマンスの比較。
7分間のリプレイファイルを3回ループさせて計測。




モバイルの制限。
古いiOSでもカラーは 256bit まで使える。あくまでもカラーのみの制限で深度は含まれない。




全てのプラットフォームで同じように表示するには、制限が厳しいプラットフォームで検証する必要がある。




複数のシェーディングモデルをサポート。




・Forward を使うべきケース

  • 従来のGPUアーキテクチャを使用するプラットフォーム
  • 事前計算のライティングやシャドウを使用する場合
  • ライトや Reflection Capture が多数配置されている場合

・Deferred を使うべきケース

  • 動的なライティングを使用する場合




MobileFSR upscaling プラグインの追加。
3Dシーンをより低い解像度でレンダリングして次に使用する。

 


Mobile Preview 機能の改善。
プラットフォームごとに異なるレンダリング設定でプレビューできるようになった。



NaniteとLumen

残念ながらまだ正式サポートはされていない。将来サポート予定。
現状は Nanite フォールバックメッシュが代わりにレンダリングされている。
ただし、ドローコール数、ポリゴン数を制御するにはLOD、HLODを手動で設定する必要がある。



アップデート予定

  • さらにモバイルプレビューの改善
  • モバイルのイテレーションの改善
  • 一般的なモバイル開発ワークフローのためのツール
  • Xcode開発者の体験向上