地球を衛る兵士の歩き方【UE4を用いたTPS制作事例 EDF:IR 2019】

15.9K Views

October 28, 19

スライド概要

発表者: 林耕司さま(株式会社ユークス)

本スライドは2019年9月20日に行われた勉強会「 UE4を用いたTPS制作事例 〜Earth Defense Force: Iron Rainの場合〜」の講演資料となります。ユークス様、このような貴重な情報を一般に公開していただきまことにありがとうございます!

※本講演は多数のGifや動画を含んでおりますので是非本来のスライドをダウンロードしていただけますと幸いです。SlideShareのアップロード制限があったため、別途ダウンロード先をご用意いたしました。こちらにてダウンロードしていただけますと幸いです。
https://epicgames.box.com/s/l3adxs3zpmbwf1xargqzilfemef706p4

ダウンロードのためのパスワードは ""EDFIREpic""です。

profile-image

Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/

シェア

またはPlayer版

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

関連スライド

各ページのテキスト
1.

UE4を用いたTPS制作事例 EDF:IR 地球を衛る兵士の歩き方 EDF:IRの移動コンポーネント 株式会社ユークス リードプログラマー 林 耕司 ©2019 YUKE'S ©2019 D3 PUBLISHER

2.

はじめに ・4.19.2がリリースバージョンです ・本日お話する内容が、先日リリースされた4.23でも同じ動作をするかは 保証できませんのでご了承ください ・参考情報程度ですが、開発期間中に4.20.2までは動作確認しました ・原則としてエンジンは改造していません。必要最低限のバグ修正やCLの 取り込み、一部エディタの機能調整のみ施しました ©2019 YUKE'S ©2019 D3 PUBLISHER

3.

今日お話しすること 1.作成した移動コンポーネントについて 2.キャラクター移動コンポーネント 3.エネミー移動コンポーネント ©2019 YUKE'S ©2019 D3 PUBLISHER

4.

今日お話しすること 1.作成した移動コンポーネントについて 2.キャラクター移動コンポーネント 3.エネミー移動コンポーネント ©2019 YUKE'S ©2019 D3 PUBLISHER

5.

作成した移動コンポーネントについて ソルジャーに要求された仕様(特にエナジームーブ)を実現するため、 また独自のポーンクラス、キャラクタークラスを作成したため、 移動コンポーネントも独自のクラスを実装しました。 ©2019 YUKE'S ©2019 D3 PUBLISHER

6.

作成した移動コンポーネントについて また、アリ、クモ、サソリ、ドローン、ロボット、怪獣など多様なエネミーが 多数出現するため、これらでも独自の移動コンポーネントを作りました。 ©2019 YUKE'S ©2019 D3 PUBLISHER

7.

作成した移動コンポーネントについて タンクやガンシップなどのビークルについても既存の移動コンポーネントで はなく、独自の移動コンポーネントを作成しています。航空支援の飛行機 も同様です。メックはキャラクターの移動コンポーネントを使っています。 ※今回はこれらのビークルに ついてはお話ししません。 ©2019 YUKE'S ©2019 D3 PUBLISHER

8.

作成した移動コンポーネントについて つまり、EDF:IRのポーンの移動コンポーネントは、 全て自作しました! ©2019 YUKE'S ©2019 D3 PUBLISHER

9.

今日お話しすること 1.作成した移動コンポーネントについて 2.キャラクター移動コンポーネント 3.エネミー移動コンポーネント ©2019 YUKE'S ©2019 D3 PUBLISHER

10.

キャラクター移動コンポーネント yCharacterMovementComponentクラス UE4既製のCharacterMovementComponentクラスは Characterクラスとの依存関係がかなり強いため、EDF:IR側で 実装したいキャラクタークラスで使用するのは困難と判断しました。 ©2019 YUKE'S ©2019 D3 PUBLISHER

11.

キャラクター移動コンポーネント yCharacterMovementComponentクラス ©2019 YUKE'S ©2019 D3 PUBLISHER

12.

キャラクター移動コンポーネント yCharacterMovementComponentクラス また、要求されたソルジャーの移動制御の仕様を実装しようと思うと、 既製のMovementクラスでは逆に大変そうだったことや、極力処理 負荷を下げるための対策を入れたいということもありました。 ©2019 YUKE'S ©2019 D3 PUBLISHER

13.

キャラクター移動コンポーネント ゲームデザイナーから要求されていた仕様(一部) ・移動時の、初速度、加速度、最高速度、減速度、等の速度設定と、それ等全ての外部化(全部調整サセロヤァ) ・ジャンプ時の初速度、落下中の空気抵抗、落下中の移動補正値(Air Controlに近い)と、それら全て(以下略 ・トルーパーのE-ダッジの初速度、減速度、終了判定速度、落下速度と、それら全て(以下略 ・ジェットリフターのE-フライトの初速度、加速度、(以下略 ・ヘビーストライカーのE-フィールド使用中のノックバックによる移動時の(以下略 ・プロールライダーのE-ニードルで移動時の(以下略 ・バックフリップ使用時にPhysicsから引き継いだVelocityの減衰値 ・指定した高さまでの段差を乗り越えることが出来る ・指定した角度までの傾斜を登ることが出来る ・ビークルの上に乗ったまま、ビークルの移動に合わせて移動できる などなどなどなど ©2019 YUKE'S ©2019 D3 PUBLISHER

14.

キャラクター移動コンポーネント 移動制御の処理フロー 1.オーナー情報(向きや位置)の更新 2.移動速度(Velocity)の計算 3.PAギア固有の特殊な移動制御の更新 4.移動速度(Velocity)を元にした移動処理 ©2019 YUKE'S ©2019 D3 PUBLISHER

15.

キャラクター移動コンポーネント 1.オーナー情報(向きや位置)の更新 UpdateComponentから、現在のRotationとLocationを 取得します。得たRotationを元に、ForwardVector、UpVector、 RightVectorを算出します。 ©2019 YUKE'S ©2019 D3 PUBLISHER

16.

キャラクター移動コンポーネント 2.移動速度(Velocity)の計算 ・垂直方向の速度計算 ・水平方向の速度計算 ・目標地点までの速度計算 ©2019 YUKE'S ©2019 D3 PUBLISHER

17.

キャラクター移動コンポーネント 2.移動速度(Velocity)の計算 垂直方向の速度計算 ジャンプ、重力落下、 E-フライト等の 垂直速度を算出する ©2019 YUKE'S ©2019 D3 PUBLISHER

18.

キャラクター移動コンポーネント 2.移動速度(Velocity)の計算 水平方向の速度計算 歩行、落下、スプリント、 E-ダッジ、E-フライトなどの 水平速度を算出する ©2019 YUKE'S ©2019 D3 PUBLISHER

19.

キャラクター移動コンポーネント 2.移動速度(Velocity)の計算 目標地点までの速度計算 E-ニードルが目標に刺さっている 時の移動速度を算出する ©2019 YUKE'S ©2019 D3 PUBLISHER

20.

キャラクター移動コンポーネント 3.PAギア固有の特殊な移動制御の更新 ・衝撃による移動制御 ・目標地点までの移動制御 ©2019 YUKE'S ©2019 D3 PUBLISHER

21.

キャラクター移動コンポーネント 3.PAギア固有の特殊な移動制御の更新 衝撃による移動制御 E-ダッジやノックバック時の、大きな 初速度が設定された場合の移動は、 移動速度が一定値以下になったら 終了します。 ©2019 YUKE'S ©2019 D3 PUBLISHER

22.

キャラクター移動コンポーネント 3.PAギア固有の特殊な移動制御の更新 目標地点までの移動制御 E-ニードルで、空中を飛んでいるか 地上を滑っているかを判断します。 ©2019 YUKE'S ©2019 D3 PUBLISHER

23.

キャラクター移動コンポーネント 4.Velocityを元にした移動処理 ● MoveUpdatedComponent関数に算出した速度を渡して 移動処理を行います。 ● 移動先で何かに反発した時はSlideAlongSurface関数を 呼んでスライドします。 ● 着地判定や落下判定などの状況に応じた各種判定を行います。 ©2019 YUKE'S ©2019 D3 PUBLISHER

24.

キャラクター移動コンポーネント 4.Velocityを元にした移動処理 最初の移動処理で反発が発生した場合には、SlideAlongSurface 関数内で段差判定を行い段差なら傾斜として移動させます。 更に、この関数は親クラス側の処理を展開して、移動処理でコリジョンに 侵入していた時に反発位置の解決を行わない様に編集しています。 (エ ネミーのコリジョン内に侵入してしまった時に床下にワープするため) ©2019 YUKE'S ©2019 D3 PUBLISHER

25.

キャラクター移動コンポーネント 4.Velocityを元にした移動処理 ・空中なら、ジャンプ中の天井判定、着地判定や着地処理を行います。 ・着地しているなら、落下判定、落下処理、降坂の移動処理を行います。 ・他にも、壁への接触判定、床面判定、を必要に応じて行います。 ・床面判定による情報更新時には、ビークルの上に乗る処理も行います。 ©2019 YUKE'S ©2019 D3 PUBLISHER

26.

キャラクター移動コンポーネント 処理負荷対策について 一通りの処理を実装した後、NPCも含めて十数体ものソルジャーで この移動コンポーネントを使用したところ、ゲーム中の処理負荷が大きく なってしまい、CPU負荷軽減のための最適化を行いました。 ©2019 YUKE'S ©2019 D3 PUBLISHER

27.

キャラクター移動コンポーネント 処理負荷対策について 可能な限りトレース回数を減らす、非同期トレースを使う、スイープ回数 を減らす、など地道に処理の無駄を削る事をしました。 また、MoveUpdatedComponent関数を複数回呼び出すような 移動中の負荷対策として、 ScopedMovementUpdateクラスを 使いました。 ©2019 YUKE'S ©2019 D3 PUBLISHER

28.

今日お話しすること 1.作成した移動コンポーネントについて 2.キャラクター移動コンポーネント 3.エネミー移動コンポーネント ©2019 YUKE'S ©2019 D3 PUBLISHER

29.

エネミー移動コンポーネント yEenmyMovementComponentクラス エネミーの基本的な移動制御ですが、 PawnMovementComponent ゲーム中に使用するほぼ全ての移動に 関する処理が含まれています。 yMovementComponent 水平移動、垂直移動の速度計算や、 yEnemyMovementComponent ジャンプ、スプリント、壁張り付き、飛行も yInsect ~(略) このクラス内の機能です。 yDrone ~(略) yMeteor ~(略) ©2019 YUKE'S ©2019 D3 PUBLISHER

30.

エネミー移動コンポーネント 移動制御の処理フロー 1. オーナー情報(向きや位置)の更新 2. アニメーション依存の移動処理 3. 移動速度(Velocity)の計算 4. 前後方向などのライントレース 5. トレース結果による座標の押し戻し 6. 姿勢制御、最終的な移動座標の更新 ©2019 YUKE'S ©2019 D3 PUBLISHER

31.

エネミー移動コンポーネント 1.オーナー情報(向きや位置)の更新 キャラクターの移動制御と同様に、現在の座標と向き、 向きベクトルを更新します。 エネミーでは、その他に計算や判定用のフラグなどの更新や 計算用パラメータの初期化も行います。 ©2019 YUKE'S ©2019 D3 PUBLISHER

32.

エネミー移動コンポーネント 2.アニメーション依存の移動処理 アニメーションに依存した移動は、2種類あります。 ● 特定の名前のアニメーションカーブの値を移動量として使用する。 ● モンタージュでルートモーション再生時の移動量を使用する。 ©2019 YUKE'S ©2019 D3 PUBLISHER

33.

エネミー移動コンポーネント 2.アニメーション依存の移動処理 アニメーションカーブの値を 移動量として使用する対応は、 ルートモーションを使わない設計で アニメーション依存の移動をする 場合に使いました。 ©2019 YUKE'S ©2019 D3 PUBLISHER

34.

エネミー移動コンポーネント 2.アニメーション依存の移動処理 もう一つは、モンタージュで再生した ルートモーションを使用した場合です。 再生しているルートモーションの 情報から移動速度と移動方向を 求めて、移動量に反映します。 ©2019 YUKE'S ©2019 D3 PUBLISHER

35.

エネミー移動コンポーネント 3.Velocityの計算 エネミーの速度計算は入力量と移動モードで適した計算を行います。 基本的にエネミーは前方移動しかしませんが、一部のエネミーでのみ 水平移動や、ジャンプを使います。空中を移動するエネミーは、垂直移動 も出来ます。これらの使い分けはパラメータとAI次第です。 ©2019 YUKE'S ©2019 D3 PUBLISHER

36.

エネミー移動コンポーネント 3.Velocityの計算 地上と空中を行き来する タイプのエネミーで、 移動モードの遷移を 確認します。 ©2019 YUKE'S ©2019 D3 PUBLISHER

37.

エネミー移動コンポーネント 4.前後方向などのライントレース エネミーは移動制御と姿勢制御にトレースを使用しています。 ・前方へ移動して障害物に侵入した場合の押し戻しを行う前方トレース ・押し戻された時に後方の障害物に侵入しないための後方トレース ・落下判定や着地判定を行うための下方向へのトレース ©2019 YUKE'S ©2019 D3 PUBLISHER

38.

エネミー移動コンポーネント 基本的なライントレース(前、後、下) ©2019 YUKE'S ©2019 D3 PUBLISHER

39.

エネミー移動コンポーネント 4.前後方向などのライントレース 更にエネミーやマップによって使用する追加トレースがあります。 ・幅の広いエネミーが地形や建物に埋まらない様にする追加トレース ・背の高いエネミーが地形や建物に埋まらない様にする追加トレース ・洞窟で使用する、狭い通路への侵入を避けるための追加トレース ・住宅街で使用する、狭い通路での行動を制限するためのトレース ©2019 YUKE'S ©2019 D3 PUBLISHER

40.

エネミー移動コンポーネント 幅の広いエネミーが地形や建物に埋まらない様にする追加トレース ©2019 YUKE'S ©2019 D3 PUBLISHER

41.

エネミー移動コンポーネント 背の高いエネミーが地形や建物に埋まらない様にする追加トレース ©2019 YUKE'S ©2019 D3 PUBLISHER

42.

エネミー移動コンポーネント 洞窟で使用する、狭い通路への侵入を避けるための追加トレース ©2019 YUKE'S ©2019 D3 PUBLISHER

43.

エネミー移動コンポーネント 住宅街で使用する、狭い通路での行動を制限するためのトレース ©2019 YUKE'S ©2019 D3 PUBLISHER

44.

エネミー移動コンポーネント 5.トレース結果による座標の押し戻し エネミー移動のトレースは主に ASyncトレースを使用しています。 各トレースが終了したあと呼ばれる 関数内で、前方移動時に壁などに めり込んでしまっている場合に、 押し戻し処理が行われて座標が補正されます。 ©2019 YUKE'S ©2019 D3 PUBLISHER

45.

エネミー移動コンポーネント 6.姿勢制御、最終的な移動座標の更新 床判定のトレースや、壁降り判定の トレースの結果から、姿勢(向き)を 制御します。床や壁の凹凸に合わせて 姿勢をかえたり、逆に変えなかったり、 壁を登り降りしている時の姿勢遷移を 制御したりします。 ©2019 YUKE'S ©2019 D3 PUBLISHER

46.

エネミー移動コンポーネント 6.姿勢制御、最終的な移動座標の更新 姿勢制御によって向きの更新が終われば、最終的な移動量もきまり、 MoveUpdatedComponent関数が呼ばれて座標と向きがエネミー に反映されます。 これで、エネミーの移動処理の流れは終了です。 ©2019 YUKE'S ©2019 D3 PUBLISHER

47.

エネミー移動コンポーネント yInsectMovementComponentクラス 主に昆虫タイプなど、壁に張り付くタイプのエネミーで使用する移動制御 です。移動処理自体は親クラス側が全て行っているので、この移動コンポ ーネントは壁を登ったり降りたりするために必要な判定と、移動方向を壁 や床に変えるためのフラグ設定を行っています。 ©2019 YUKE'S ©2019 D3 PUBLISHER

48.

エネミー移動コンポーネント この移動コンポーネントを 使用して移動させると、 登り降り判定から遷移した 移動処理のみで、右の 動画のような移動を させることが出来ます。 ©2019 YUKE'S ©2019 D3 PUBLISHER

49.

エネミー移動コンポーネント ソルジャーに向かって集る ようなAIを設定すると、 この様な感じにアリタワーに なります。 ©2019 YUKE'S ©2019 D3 PUBLISHER

50.

エネミー移動コンポーネント 移動制御のテストについて エネミーの移動制御はPlayer Controllerで操作する手動テストと、 AI Controllerで操作する自動テストを行いました。 ©2019 YUKE'S ©2019 D3 PUBLISHER

51.

エネミー移動コンポーネント 移動制御のテストについて EDF:IRで独自に実装したエネミーを含むyPawnクラスを継承した 全てのキャラクターは、yControllerInterfaceクラスを経由して、 Player Controllerでも、AI Controllerでも共通の処理を使って 操作できるようになっています。 ©2019 YUKE'S ©2019 D3 PUBLISHER

52.

エネミー移動コンポーネント 移動制御のテストについて Player Controller yControllerIntaface yPawnを継承した キャラクター 移動 AI Controller InputAnalogLY関数 InputAnalogLY関数 ©2019 YUKE'S ©2019 D3 PUBLISHER

53.

エネミー移動コンポーネント 移動制御のテストについて この仕組みを使用して、本来AI Controllerで動かすエネミーを、 手動テスト用のマップでPlayer Controllerを使って動かすことで、 移動制御や攻撃等やその他のアクションの動作確認を行うことが出来る ようにしています。 ©2019 YUKE'S ©2019 D3 PUBLISHER

54.

エネミー移動コンポーネント 移動制御のテストについて テスト用のAIを使った 自動テストも行いました。 ©2019 YUKE'S ©2019 D3 PUBLISHER

55.

エネミー移動コンポーネント 移動制御のテストについて 自動テスト中にエネミーが 壁に突き当たり続けていたり AIが停止してしまった場合は 移動制御の情報を画面中に 表示してデバッグしました。 ©2019 YUKE'S ©2019 D3 PUBLISHER

56.

まとめ UE4の機能は超便利だけど、やりたいこと詰め込もうと思うと、 最終的には、プロジェクト独自で作るほうが、成果は出せると思います。 いかにUE4の「いいとこ取り」が出来るか、そういう事を考えること。 それがとても楽しかったです。学びが沢山ありました。 これからもUE4で、何かしら作って、情報共有していけたらと思います。 ©2019 YUKE'S ©2019 D3 PUBLISHER

57.

質疑応答 Q:UE4既製のクラスを使わずに、キャラクターのオンライン同期はどの ように対応したのか? A:独自クラスを作ったので、オンライン対応も独自に実装しました。 移動に関してで言えば移動速度(Velocity)をレプリケートで同期して、 各クライアントで移動処理を行いました。通信等の問題でサーバーと一 定距離はなれた場合は、各クライアントの位置をサーバーに合わせます。 ©2019 YUKE'S ©2019 D3 PUBLISHER

58.

質疑応答 Q:押し戻しのトレースは、なぜライントレースにしたのか? A:単純に、処理負荷対策です。 巨大なエネミーの地形へのめり込みを完全になくす事は難しいので、多少 のめり込みは許容して、エネミーの数を増やすことを重視したためです。 ©2019 YUKE'S ©2019 D3 PUBLISHER

59.

質疑応答 Q:エネミーAIの移動時のパスはどのように決めたのか? A:エネミーに移動用のパスはありません。ナビメッシュ等も使っていませ ん。アリなどは建物があっても地形に合わせて移動し続けることができるの で、目標だけ決めてあればそこに移動できます。怪獣なども建物を破壊し ながら移動するので、パスはありません。 ©2019 YUKE'S ©2019 D3 PUBLISHER

60.

質疑応答 Q:アリの頭がソルジャーにめり込まないのはなぜ? A:アリの頭には、移動で使用するものとは異なるコリジョンがあります。 このコリジョンは、ソルジャーの移動コンポーネントとの接触判定を行うた め、ソルジャーはこのコリジョンにめり込みません。そしてアリの移動中は、 このコリジョンを地形と接触判定に使用しないので、アリは頭のコリジョン に邪魔されることなく移動できます。 ©2019 YUKE'S ©2019 D3 PUBLISHER

61.

ご清聴ありがとうございました! ©2019 YUKE'S ©2019 D3 PUBLISHER