UEFN 開発ノウハウ JAPANESE ZOMBIE SURVIVAL

6.5K Views

July 01, 24

スライド概要

2024.6/28 TBS & Alche UE/UEFN Meetup

UEFNのタイトルJAPANESE ZOMBIE SURVIVALでの開発知見を共有する内容の、UEFN 開発ノウハウの講演資料。

登壇者は以下の二名。
・なみとん (@koituwasugee)
・K.Eisuke(@KEisuke62350514)

スライド内の動画のリンクは以下の通りです。
・19P/24P
https://www.youtube.com/watch?v=gv3MoYhiG3c&ab_channel=AlcheStudio
・47P
https://www.youtube.com/watch?v=coFMP0F6fAk&t=1s&ab_channel=eiei114
・50P
https://www.youtube.com/watch?v=RW1nJ5N1aCo&ab_channel=eiei114

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

UEFN 開発ノウハウ JAPANESE ZOMBIE SURVIVAL

2.

本日の内容 ● ● ● ● ● ● ● ● 登壇者 検証環境 ゲーム紹介 マテリアルを用いたキャラクター軽量化ノウハウ 軽量な攻撃ヒット演出 デカールを利用した攻撃予測表示 動的なゲームの進行を Verse で管理してみた 無限に仕掛けを使うノウハウ

3.

自己紹介 南舘 岳人 UE エンジニア&ディレクター ● 趣味で Unreal Engine のブログを投稿している。 ● インディーゲームと猫が好き。 Namiton koituwasugee ゲーム開発備忘録

4.

自己紹介 河野 英資 (かわの えいすけ) Verse エンジニア ● ソシャゲやVRの会社で Unity エンジニアを経験。 ● 2023年10月から UEFN ワールド開発に着手。 ● 趣味で様々なメタバースプラットフォームの ワールドを制作している。 ● サッカー好き K.Eisuke KEisuke62350514 eisuke114 eiei114

5.

検証環境 開発当時のバージョンで検証。 ● Unreal Editor for Fortnite 29.30

6.

ゲーム紹介 マップコード 1037-3543-1629

7.

ゲーム紹介 ロビー 雑魚戦 ボス戦 マップコード 1037-3543-1629

8.

マテリアルを用いたキャラクター軽量化ノウハウ

9.

キャラクターの負荷 ● 大量のキャラクターが占めるメモリ量は非常に大きい。 ○ 特に性能の低いハードの場合フレームレートの低下やクラッシュの原因に。

10.

キャラクターの負荷 ● 世界観を演出する背景を入れるとメモリがいくらあっても足りなくなってしまう。 → キャラクターを何とかして軽量化する必要がある。 ▲ 実際のゲーム背景

11.

背景アセット + 大量のキャラクター = メモリ爆発

12.

そうだ。Y ビルボードを使おう !

13.

Y ビルボードとは ● シンプルな板ポリゴンに対してテクスチャを貼り、Y軸(UnrealEngine ではZ軸) 回転のみがプレイヤーのカメラへ向く古典的な遠景表現手法の一つです。

14.

Y ビルボードを応用したキャラクター ● 画像データを1枚の板に貼ることで、キャラクターを圧倒的に軽量化。 → 100 体以上出してもメモリへの影響を非常に小さくすることができた。

15.

Y ビルボードを応用したキャラクター ● クオリティを上げるためにもY ビルボードならではの機能を実装した。 連番テクスチャによる アニメーション効果 進行方向に応じた アニメーション切り替え

16.

Y ビルボードを応用したキャラクター ● 等間隔にキャラクターを配置した素材を作成。 FlipBookノードでパラパラ漫画のようにアニメーションを行う。

17.

Y ビルボードを応用したキャラクター ● マテリアルノード内で多くの空間情報を取得ができる。 ▼ オブジェクトのピボットやワールド座標の取得 ▼ ワールド空間における、モノやカメラの 前方 ( X 軸 ) ベクトルの取得

18.

Y ビルボードを応用したキャラクター ● ● NPCの進行方向とカメラとのなす角を計算。 この結果に応じて適切な画像が表示されるようにAnimationPhaseを制御する。 そのため、連番素材の前半・後半で移動方向を切り替えている。

19.

Y ビルボードを応用したキャラクター

20.

軽量な攻撃ヒット演出

21.

攻撃ヒット演出 ● ダメージを受けた際の演出の実装手法について考えた。 ○ マテリアルパラメータコレクションを利用した演出 → 大量のキャラクターに対して個別のパラメータや マテリアルを用意する手間が発生するので断念。 ○ Niagaraでの演出。 当時プロジェクトで利用していたVFXスポナーとVerseが不安定かつ、 大量の敵に対して都度エフェクトを生成する負荷が高いので断念。

22.

攻撃ヒット演出 ● 板を二枚用意したSkeletalMeshのアニメーションによる制御ができそう! ○ ヒット時は手前に表示している板のスケールを限りなく小さくすることで 下のダメージ用の板が表示される仕組みにした。 → これによりVerseからアニメーション再生のロジックで 安定して制御できるようになった。

23.

デカールを利用した攻撃予測機能

24.

攻撃予測機能 ● ボスの攻撃タイミングが分かる演出の実装。

25.

攻撃予測機能 ● ボスの攻撃タイミングが分かる演出の実装。 ○ デカールを利用することで地形が複雑でも表示できるメリット。 ○ マテリアルパラメータを利用することでシーケンサーからタイミングを制御。 ○ 複数のデカールで同じマテリアルを利用することで、 簡単にタイミングの同期ができる。

26.

攻撃予測機能 ● このようにシンプルなノード構成で実現できた。

27.

攻撃予測機能 ● 詳しい内容は過去にブログで紹介中。 ○ 【UE4・UE5・UEFN】 〈Tips〉ボス戦で使える、攻撃予測機能の作り方 - ゲーム開発備忘録

28.

動的なゲームの進行を Verse で管理してみた

29.

下準備 ❏ 仕様を理解 ❏ 処理の流れを抽出 ❏ UEFNの仕掛けできる実装があるか確認 ❏ システム設計 ❏ 実装

30.

実装!!

31.

クラス図 Main エントリーポイント Game モンパニのゲーム進行を管理 Player プレイヤーの管理 Enemy 雑魚敵の管理

32.

ゲームの進行を軸にしたインスタンス生成の流れ ロビー 雑魚戦 ボス戦 Player 生成 Game 破棄 Enemy リザルト

33.

クラス破棄時にやってること

34.

npc_behaviorを利用しない敵NPCの実装案

35.

通常のカスタムNPCのクラス ● npc_behaviorをクラスに実装 する ● NPC生成時と破壊時の関数が 用意されてる ● Verseファイルを追加するとき に公式が用意したテンプレー トを見て作ると簡単

36.

npc_behaviorを利用しないでNPCを作成した 相互依存 なぜ ● 他クラスの参照を持ってき辛 いため ● Npc管理クラスと相互依存に なってしまうため 単一依存

37.

どうやってNPCを操作するの?

38.

agentクラスさえ取得できればNPCの操作は全てできる件 agent => fort_character fort_character => focus_interface fort_character => fort_leashable fort_character => navigatable

39.

NPC クラス実装サンプル

40.

どのようにクラスとNPCキャラクターを紐づける? ● SpawnedEventでコントローラー クラスのインスタンスを生成 ● EliminatedEventで破壊された NpcをAgentをキーにして コントローラーを取得して 破棄する

41.

NPC大量生成はバグとの戦い

42.

NPC の同時大量生成による代償 何が起きた? ● NPC の動作が安定しない(一部止まったままの NPC が出現していた) ● 90体以上の NPC は生成できないので別の種類の NPC が出てき辛くなった ● 一度に複数の NPC を削除するとゲームが止まる

43.

どのように解決したか 初期化で各 NPC にランダムな タイムアウト時間を付与した。

44.

【無料】ほぼ無限に仕掛けを利用する方法 ~ オブジェクトプールの活用 ~

45.

オブジェクトプールとは https://en.wikipedia.org/wiki/Object_pool_pattern

46.

オブジェクトプールのメリット ● 疑似的にほぼ無限に仕掛けを利用できるように見せかけられる ● デバイスを競合せずに取得しやすくなる

47.

実際の活用例

48.

実装 ● Fetch で仕掛けを取得 ● Release で仕掛けを返す

49.

使いかた ● 初期化時にや利用し始める前に プールから取得する。 ● 取得したら参照をオプション型 で用意した空に入れておく ● 利用し終えたら参照を外して プールに返す

50.

動かしてみた

51.

ご清聴ありがとうございました