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

shuntaendo.hatenablog.com


Building Open Worlds in Unreal Engine 5 - UE5でオープンワールドを構築する

youtu.be

オープンワールドの作成方法。Epic Games スタッフによる講演。

概要

オープンワールドを構築するために必要な機能一覧。


Open World テンプレート

どのプロジェクトでも [New Level] からすぐにオープンワールドのセットアップがされたレベルを作ることができる。




・グリッド設定
World Settings からサイズを設定できます。デフォルトでは256m。




・Streaming Source
Streaming Source を基点にグリッドが読み込まれます。

デバッグ

コンソールコマンドからストリーミングを可視化できる。

  • wp.Runtime.ToggleDrawRuntimeHash2D
  • wp.Runtime.ToggleDrawRuntimeHash3D

 

UE4からの変換

WorldPartitionConvertCommandlet でレベルの変換が必要。



World Partition Editor

セルの確認や任意のセルをロード/アンロードすることができます。



Packed Level Actor

レベル上のメッシュアクターを1つのBPに変換できる。
Instanced Static Mesh として作られるので負荷が軽い。レベル上の静的なメッシュに対して使う。







Improving Developer Iteration in Unreal Engine 5 - UE5においての開発イテレーションの改善

youtu.be

UE5のフューチャーアップデートに関して。The Matrix Awakens と Fortnite プロジェクトでの開発イテレーションについて。
Epic Gamesスタッフによる講演。

概要

一般的に以下のイテレーションで開発が行われる。

  1. バージョン管理ソフトでコンテンツの同期
  2. UEエディタの起動
  3. エディタで編集
  4. PIEで確認

 


しかし、このイテレーションには大きなボトルネックがあり、「1」の "コンテンツの同期" はとても遅い。
プロジェクトによっては1日の大半がこの作業を占める場合もあり、人によっては作業が止まるのを避けるために夜間にまとめて行う人もいる。これは大きな問題。

SSDで読み込めば確かに高速になる。
しかし、結局エディタ起動時にシェーダーコンパイルやナビメッシュのロードなどで待つことになる。
多くの開発者はデータの同期と構築に多くの時間を費やしている。昨今リモートワークが増加しVPNを介して行う人も増えたためさらに悪化している。

スペックの高いPCにすれば解決?
→ コストが掛かりすぎる。同期に時間が掛かる問題はPCのスペックだけでは解決できない。

Unreal Cloud DDC

・Derived Data Cache の仕組み
以前にビルドしたことがある場合はそのキャッシュを再利用します。
ビルド時にキーを作成して、再ビルド時にキャッシュに既にエントリが存在する場合はそれを引き出す。

他の作業者が既にビルドしている場合、そのデータを再利用できるのが理想。


DDCの例

1.ローカルプロジェクトDDC
ローカル環境のDDCを各プロジェクトで作成。




2.ローカル共有DDC
複数プロジェクトから1つのDDCを参照。




3.チーム共有DDC
各ユーザーがローカルのDDCを持っているが、共通のネットワーク上にも共有のDDCがある。

ユーザーが全員同じ建物にいて、高速なネットワークがあれば「3」でも充分だが現実はそうではない。
多くの作業者がリモートワークで作業者ごとにネットワークの種類、帯域も異なる。

理想はビルドマシンがビルドし、その結果をDDCに配置し、各作業者がそのDDCを使えること。


Unreal Cloud DDC の仕組み

  • 名前通りクラウドでホスト
  • 5つのリージョンに展開し、地域間で複製することで作業者の近くにデータを用意
  • 公共のネットワークのため、VPN遅延が無い
  • Amazon S3 で構築されているが、Microsoft Azure でも動作
  • OIDC のログインと認証をサポート
  • 一時保管と永続保管をサポート

例:




Epic Games社内でも以下のプロジェクトで運用


Virtual Asset

必要なものだけ同期したい。必要/不要のチェックで同期に時間が掛かっている。

・uasset の構造
uasset のデータは主に2つに分類できる。

  • Structured Data:プロパティ、クラスなど
  • Bulk Data:生データ

2つを分離させ、Bulk Data のハッシュ値だけ Structured Data と紐づける。




Structured Data のハッシュ値をデコードし、DDC内の Bulk Data を参照する。




・ワークフロー
Virtual Asset によりコンテンツ同期部分が改善される。




・Fortnite プロジェクトで Virtual Asset を導入した結果



Horde Compute

・概要
現在開発中の技術。UE5用の汎用リモートビルドシステム。
順調に進めば来年にはライセンシーに提供できるはず。
UE のビルドとクックのワークフローの改善が見込める。

※ Horde Compute も開発中の名称。


・現状
UE5 では UE4 よりもさらにマルチコアで処理を分散することで改善されている。

しかし、組織の全員、外部委託者、請負業者、全ての人がスペックの高いPC、大量のPCを持っているとは限らない。


・Derived Data Build(DDB
一般的なビルドジョブを記述およびディスパッチできるUE5用ランタイムAPI
ローカルデスクトップ、専用のハードウェア、クラウドからDDBジョブを叩くことで Horde Compute を実行できます。



最終的なワークフロー、実装時期







Advanced UI Templating Techniques using Widget Blueprints and Materials - Widget とマテリアルを使用した UI テクニック

youtu.be

最新のUIテクニックについて。
Epic Games のテクニカルUIデザインディレクターによる講演。

カードゲームを例に説明。



Widget継承を活用したスタイリング

ブループリントと同じように Widget ブループリントも継承して親のプロパティやレイアウトを使うことができる。
子で上書きできる点も同じ。

・実装例
親WBPで変数を用意し、Size Boxのサイズを変更するブループリントを組む。




子WBPで変数の値を変更することでSize Boxのサイズが変わる。




テクスチャなど他にも変更したいパラメーターを変数化し、親WBPでブループリントを組むことで子WBPでは変数の値変更だけで見た目を自由にレイアウトできる。



Named Slot を活用したレイアウト

Named Slot Widget は本質的には空の Widget ですが、子WBPで任意のWidgetを追加できます。

docs.unrealengine.com


・UE5.1 のアップデート
UE5.1 から子WBPで展開できるようになり、階層を作れるようになりました。



マテリアルインスタンスを活用したスタイリング

Widget 専用のマテリアル関数を作成する。

・実装例
1.アイドル、ホバー、フォーカスなど状態別のパラメーターを用意した関数を作成

 


2.アニメーションで各ステートの色が遷移するように




3.ステートの各イベントとアニメーション再生を紐づけ




4.マテリアルインスタンスを作成し、パラメーター設定

ボタンごとにマテリアルインスタンスを作成し、パラメーターを調整するだけで見た目を変更できる。

Curve Atlas を活用したマテリアルアニメーション

docs.unrealengine.com

Animation Curve ノードを使ってマテリアル内で Curve Atlas を使用する。

マテリアルでアニメーションを作ることでGPUで処理され負荷も軽い。

ブループリントを活用したマテリアルアニメーション

1.マテリアルでアニメーションを作成

2.アニメーションを再生するマクロをブループリントで作成
中身はダイナミックマテリアルインスタンスを作成し、パラメーターを制御している。

 





Exploring the Gameplay Ability System (GAS) with an action RPG - アクションRPGで Gameplay Ability System (GAS) を活用する

youtu.be

GAS、Data Table、Enhanced Input を活用してアクションRPGを制作した事例。

Gameplay Ability System (GAS) とは

RPG や MOBA タイトルにみられるアビリティや属性を構築するために非常に柔軟なフレームワーク。(エンジンのプラグイン

docs.unrealengine.com


・GASの各機能

Ability System Component (ASC) GAS とのやり取りを担うコンポーネント
Attributes
Attribute Sets
属性。
RPG でいうところの HP、攻撃力といったステータス値にあたる機能。



Gameplay Ability アビリティのロジック。
Gameplay Effect GAに付随する効果。



Gameplay Tags アクターのタグのようなマッチングシステム。
階層的に設定可能。
Gameplay Cue エフェクトのGAS専用ラッパー。




・ラーニングのすすめ

 

GASの導入

GASを実装に使うためのセットアップはまだC++に依存しているところが大きいためプログラマーが必須。

・キャラクター
Ability System Component と Attribute Set Object をキャラクタークラスに組み込む必要がある。
キャラクターをスポーンする際にそれらを初期化するようにする。

AbilitySystemComponent->InitAbilityActorInfo(AActor* InOwnerActor, AActor* InAvatarActor)


GAS の Tips

・仮想関数
ほとんどの GAS の C++クラスには、多くの仮想関数がある。

  • Ability System Component
  • Ability System Globals
  • Gameplay Ability
  • Gameplay Cue Manager




・非同期タスク
「アビリティの完了を待つ」など、非同期タスクが豊富に用意されている。




・Matched Tag
Matched Tag 関数のタグ指定は順序が重要。
"Tag One"が"Tag Two"に一致しているか(内包しているか)判定するため、"Tag Two"よりも階層が深いタグを"Tag One"に指定する場合はfalse判定になる。



Data Table の活用

Attribute の初期化にデータテーブルを活用した。
各GEアセットでは設定が分かりづらかったため、曲線テーブルをデータテーブルで作ることで設定をデータテーブルで完結させた。
ExcelGoogleスプレッドシートからインポートし、各GE、データテーブルへ適用されるようにC++から実装。

 

 







Improving Iteration in Geo-Distributed Scenarios - 離れた地域での開発イテレーションの改善

youtu.be

Unreal Cloud DDC、Virtual Asset を活用して離れた地域での開発イテレーションの改善方法。
Epic Gamesスタッフ、Coalitionスタッフによる講演。
※ Coalition はバンクーバーのスタジオ

「Improving Developer Iteration in Unreal Engine 5」と被る内容も多い。

近年のプロジェクトが抱えている問題

1.プロジェクトの肥大化
非常に多くのデータを同期、構築する必要がある。

2.チームの分散化
遠隔地で作業をしている人はデータの同期に時間がかかる。

Virtual Asset

uasset を Structured Data と Bulk Data に分割し、Structured Data には Bulk Data のハッシュ値を組み込む。

これによりデータサイズが減って、最低限の同期、ビルドで済む。



Unreal Cloud DDC

世界中の5つの地域に共有のDDCを配置することで遠隔地でも近い距離のDDCを利用できる。




Epic Games の全てのUE5プロジェクトで使用されている。

  • 毎日 約1,000台 のマシンがアクセス。
  • 1人あたり月額約35ドルのコスト
  • 5つの地域に展開
  • 地域ごとに月額約3,000ドルのコスト
  • 1日4000万回のリクエス
  • 30TBのストレージ




・仕組み
Amazon S3 で構築されたサーバーに接続された NVMEドライブにキャッシュされる。(Local cache)
OIDC でログイン、認証が管理されている。

VPNを介せず公共のネットワークで利用可能。



ユースケース

Virtual Asset Unreal Cloud DDC
10人規模の小さなプロジェクト
40人規模のスタジオ
100人規模のプロジェクト(小さいアセットのみ)
100人規模の大きいプロジェクト



Gears 5の開発事例

Gears 5の開発は地理的に分散されていた。




・開発体制

画像のような開発体制だったがいくつか問題が出た。

  • アクセス速度の問題
  • ディスク容量の問題
  • 時差の問題
  • 帯域幅の問題

問題を抱えた状態でパンデミックにも襲われた。

プロジェクトをUE5に移行し、Unreal Cloud DDC と Virtual Asset を導入することで改善しました。

・Virtual Asset
Gears 5プロジェクトでは 約690GB 節約できた。




Unreal Cloud DDC
使用することにより、VPN経由よりも2倍早くなった。
2つのデータセンターだと1ユーザーあたり~31ドルかかる。



ロードマップ

・Virtual Asset [UE5.1 - BETA]

UE5.1 NEXT 検討中
・Perforceをサポート
・Texture と Audio で動作
・Nanite Mesh のサポート
・オフラインで動作
・他のバージョン管理ソフトをサポート
・他のアセットタイプをサポート



Unreal Cloud DDC [UE5.1 - 実験的機能]

UE5.1 NEXT 検討中
Linux で動作
・OIDC によるログイン、認証
・アドレス指定可能なストレージ
ガベージコレクション
・Virtual Asset のサポート
・セットアップのワークフローの改善 ・ビルドストレージのサポート
・リモートでの実行






Modulating Game Difficulty with Machine Learning - 機械学習でゲームの難易度を調節する

youtu.be

機械学習とEQSを使用したゲームの難易度調整について。

パックマンを例にAIと機械学習について

Behaivior Tree を使用してパックマンのゴースト(敵)のAIを作成してみる。

1.Selector ノードで "Scatter Mode" か "Chase Mode" か評価。
2."Scatter Mode" の時はプレイヤーから逃げるので、マップの隅(Scatter Location)に移動しようとする。
3."Chase Mode" の時はプレイヤーを追うので、プレイヤー(Player Location)に移動しようとする。




ゴーストにも種類がある。

・"blinky" はプレイヤーの座標を直接追う
・"pinky" はプレイヤー移動方向の1~2マス先を追う
・"inky" はプレイヤーが "blinky" に追われている時、"blinky" との対象の位置に移動する
・"clyde" はプレイヤーが遠いとプレイヤの座標を追うが、近くなるとマップの隅に移動しようとする

 




これらのゴーストの複雑な動きを作るためにEQSを利用する。




ゴーストの動きによって難易度が変わる。
難易度調整は基本的にハードコーディング。イージーだとゴーストの速度が1、ハードだとゴーストの速度は5みたいな感じ。

機械学習を難易度設定に用いて調整する。

 


機械学習とゲームAIを連携させて、ゲームのレベルに合わせた難易度にして、ユーザーの体験を Flow zone で維持する。
この Flow zone はユーザーのレベルによって異なる。上手な人は Flow zone がもっと上になったりするため、常に学習してユーザーごとに適切な体験を作る。



トップダウンテンプレートを例にゲームAIと機械学習の連携

UEのトップダウンテンプレートで敵から見つからないように隠れながら16個のオーブを集めるゲームを作った。




敵に見つかり捕まるとゲームオーバー。
ゲームオーバー画面では、ゲームの難易度についてどのように感じたか3段階評価のアンケートを取り、その結果を学習させていく。




敵のパトロール、経路探索にはEQSを用いている。




公式ドキュメントにもある EQS の簡易的な実装例。
視線、距離からポイントを探索する。




青いポイントは死角になっている部分なので探索ポイントからは除外している。




視線や距離、各キャラクターの向いている角度、オーブの残り個数など様々情報を元に学習させ、EQSに組み込んでいく。




機械学習に必要なのは学習データのみ。
たくさんのデータを人力でプレイして集めるのは大変なため、Botを作成してゲームプレイを自動化した。

Botはオーブを集め、敵の視線に入ると柱に隠れるようにした。


ニューラルネットワークを使用してデータの入力をした。
データを収集すると約400回のシミュレーションが行われる。(画像の赤が敵、青がプレイヤー、緑がオーブ)

 


各AIでの結果。
上部の円グラフはユーザーの難易度評価。Score は獲得したオーブの数。Duration はプレイ時間。

Random:完全にランダムに移動する
EQS HardMode:プレイヤーを捕まえやすいルートで探索する
EQSLoS:Line of Sight。視覚情報に頼って探索する