UE4を用いたTPS制作事例
EDF:IR
地球を衛る兵士の歩き方
EDF:IRの移動コンポーネント
株式会社ユークス
リードプログラマー
林 耕司
©2019 YUKE'S ©2019 D3 PUBLISHER
はじめに
・4.19.2がリリースバージョンです
・本日お話する内容が、先日リリースされた4.23でも同じ動作をするかは
保証できませんのでご了承ください
・参考情報程度ですが、開発期間中に4.20.2までは動作確認しました
・原則としてエンジンは改造していません。必要最低限のバグ修正やCLの
取り込み、一部エディタの機能調整のみ施しました
©2019 YUKE'S ©2019 D3 PUBLISHER
今日お話しすること
1.作成した移動コンポーネントについて
2.キャラクター移動コンポーネント
3.エネミー移動コンポーネント
©2019 YUKE'S ©2019 D3 PUBLISHER
今日お話しすること
1.作成した移動コンポーネントについて
2.キャラクター移動コンポーネント
3.エネミー移動コンポーネント
©2019 YUKE'S ©2019 D3 PUBLISHER
作成した移動コンポーネントについて
ソルジャーに要求された仕様(特にエナジームーブ)を実現するため、
また独自のポーンクラス、キャラクタークラスを作成したため、
移動コンポーネントも独自のクラスを実装しました。
©2019 YUKE'S ©2019 D3 PUBLISHER
作成した移動コンポーネントについて
また、アリ、クモ、サソリ、ドローン、ロボット、怪獣など多様なエネミーが
多数出現するため、これらでも独自の移動コンポーネントを作りました。
©2019 YUKE'S ©2019 D3 PUBLISHER
作成した移動コンポーネントについて
タンクやガンシップなどのビークルについても既存の移動コンポーネントで
はなく、独自の移動コンポーネントを作成しています。航空支援の飛行機
も同様です。メックはキャラクターの移動コンポーネントを使っています。
※今回はこれらのビークルに
ついてはお話ししません。
©2019 YUKE'S ©2019 D3 PUBLISHER
作成した移動コンポーネントについて
つまり、EDF:IRのポーンの移動コンポーネントは、
全て自作しました!
©2019 YUKE'S ©2019 D3 PUBLISHER
今日お話しすること
1.作成した移動コンポーネントについて
2.キャラクター移動コンポーネント
3.エネミー移動コンポーネント
©2019 YUKE'S ©2019 D3 PUBLISHER
キャラクター移動コンポーネント
yCharacterMovementComponentクラス
UE4既製のCharacterMovementComponentクラスは
Characterクラスとの依存関係がかなり強いため、EDF:IR側で
実装したいキャラクタークラスで使用するのは困難と判断しました。
©2019 YUKE'S ©2019 D3 PUBLISHER
キャラクター移動コンポーネント
yCharacterMovementComponentクラス
©2019 YUKE'S ©2019 D3 PUBLISHER
キャラクター移動コンポーネント
yCharacterMovementComponentクラス
また、要求されたソルジャーの移動制御の仕様を実装しようと思うと、
既製のMovementクラスでは逆に大変そうだったことや、極力処理
負荷を下げるための対策を入れたいということもありました。
©2019 YUKE'S ©2019 D3 PUBLISHER
キャラクター移動コンポーネント
ゲームデザイナーから要求されていた仕様(一部)
・移動時の、初速度、加速度、最高速度、減速度、等の速度設定と、それ等全ての外部化(全部調整サセロヤァ)
・ジャンプ時の初速度、落下中の空気抵抗、落下中の移動補正値(Air Controlに近い)と、それら全て(以下略
・トルーパーのE-ダッジの初速度、減速度、終了判定速度、落下速度と、それら全て(以下略
・ジェットリフターのE-フライトの初速度、加速度、(以下略
・ヘビーストライカーのE-フィールド使用中のノックバックによる移動時の(以下略
・プロールライダーのE-ニードルで移動時の(以下略
・バックフリップ使用時にPhysicsから引き継いだVelocityの減衰値
・指定した高さまでの段差を乗り越えることが出来る
・指定した角度までの傾斜を登ることが出来る
・ビークルの上に乗ったまま、ビークルの移動に合わせて移動できる
などなどなどなど
©2019 YUKE'S ©2019 D3 PUBLISHER
キャラクター移動コンポーネント
移動制御の処理フロー
1.オーナー情報(向きや位置)の更新
2.移動速度(Velocity)の計算
3.PAギア固有の特殊な移動制御の更新
4.移動速度(Velocity)を元にした移動処理
©2019 YUKE'S ©2019 D3 PUBLISHER
キャラクター移動コンポーネント
1.オーナー情報(向きや位置)の更新
UpdateComponentから、現在のRotationとLocationを
取得します。得たRotationを元に、ForwardVector、UpVector、
RightVectorを算出します。
©2019 YUKE'S ©2019 D3 PUBLISHER
キャラクター移動コンポーネント
2.移動速度(Velocity)の計算
・垂直方向の速度計算
・水平方向の速度計算
・目標地点までの速度計算
©2019 YUKE'S ©2019 D3 PUBLISHER
キャラクター移動コンポーネント
2.移動速度(Velocity)の計算
垂直方向の速度計算
ジャンプ、重力落下、
E-フライト等の
垂直速度を算出する
©2019 YUKE'S ©2019 D3 PUBLISHER
キャラクター移動コンポーネント
2.移動速度(Velocity)の計算
水平方向の速度計算
歩行、落下、スプリント、
E-ダッジ、E-フライトなどの
水平速度を算出する
©2019 YUKE'S ©2019 D3 PUBLISHER
キャラクター移動コンポーネント
2.移動速度(Velocity)の計算
目標地点までの速度計算
E-ニードルが目標に刺さっている
時の移動速度を算出する
©2019 YUKE'S ©2019 D3 PUBLISHER
キャラクター移動コンポーネント
3.PAギア固有の特殊な移動制御の更新
・衝撃による移動制御
・目標地点までの移動制御
©2019 YUKE'S ©2019 D3 PUBLISHER
キャラクター移動コンポーネント
3.PAギア固有の特殊な移動制御の更新
衝撃による移動制御
E-ダッジやノックバック時の、大きな
初速度が設定された場合の移動は、
移動速度が一定値以下になったら
終了します。
©2019 YUKE'S ©2019 D3 PUBLISHER
キャラクター移動コンポーネント
3.PAギア固有の特殊な移動制御の更新
目標地点までの移動制御
E-ニードルで、空中を飛んでいるか
地上を滑っているかを判断します。
©2019 YUKE'S ©2019 D3 PUBLISHER
キャラクター移動コンポーネント
4.Velocityを元にした移動処理
● MoveUpdatedComponent関数に算出した速度を渡して
移動処理を行います。
● 移動先で何かに反発した時はSlideAlongSurface関数を
呼んでスライドします。
● 着地判定や落下判定などの状況に応じた各種判定を行います。
©2019 YUKE'S ©2019 D3 PUBLISHER
キャラクター移動コンポーネント
4.Velocityを元にした移動処理
最初の移動処理で反発が発生した場合には、SlideAlongSurface
関数内で段差判定を行い段差なら傾斜として移動させます。
更に、この関数は親クラス側の処理を展開して、移動処理でコリジョンに
侵入していた時に反発位置の解決を行わない様に編集しています。 (エ
ネミーのコリジョン内に侵入してしまった時に床下にワープするため)
©2019 YUKE'S ©2019 D3 PUBLISHER
キャラクター移動コンポーネント
4.Velocityを元にした移動処理
・空中なら、ジャンプ中の天井判定、着地判定や着地処理を行います。
・着地しているなら、落下判定、落下処理、降坂の移動処理を行います。
・他にも、壁への接触判定、床面判定、を必要に応じて行います。
・床面判定による情報更新時には、ビークルの上に乗る処理も行います。
©2019 YUKE'S ©2019 D3 PUBLISHER
キャラクター移動コンポーネント
処理負荷対策について
一通りの処理を実装した後、NPCも含めて十数体ものソルジャーで
この移動コンポーネントを使用したところ、ゲーム中の処理負荷が大きく
なってしまい、CPU負荷軽減のための最適化を行いました。
©2019 YUKE'S ©2019 D3 PUBLISHER
キャラクター移動コンポーネント
処理負荷対策について
可能な限りトレース回数を減らす、非同期トレースを使う、スイープ回数
を減らす、など地道に処理の無駄を削る事をしました。
また、MoveUpdatedComponent関数を複数回呼び出すような
移動中の負荷対策として、 ScopedMovementUpdateクラスを
使いました。
©2019 YUKE'S ©2019 D3 PUBLISHER
今日お話しすること
1.作成した移動コンポーネントについて
2.キャラクター移動コンポーネント
3.エネミー移動コンポーネント
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
yEenmyMovementComponentクラス
エネミーの基本的な移動制御ですが、
ゲーム中に使用するほぼ全ての移動に
関する処理が含まれています。
水平移動、垂直移動の速度計算や、
ジャンプ、スプリント、壁張り付き、飛行も
このクラス内の機能です。
yMovementComponent
yEnemyMovementComponent
yInsect
~(略)
yDrone
~(略)
yMeteor
~(略)
PawnMovementComponent
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
移動制御の処理フロー
1. オーナー情報(向きや位置)の更新
2. アニメーション依存の移動処理
3. 移動速度(Velocity)の計算
4. 前後方向などのライントレース
5. トレース結果による座標の押し戻し
6. 姿勢制御、最終的な移動座標の更新
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
1.オーナー情報(向きや位置)の更新
キャラクターの移動制御と同様に、現在の座標と向き、
向きベクトルを更新します。
エネミーでは、その他に計算や判定用のフラグなどの更新や
計算用パラメータの初期化も行います。
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
2.アニメーション依存の移動処理
アニメーションに依存した移動は、2種類あります。
● 特定の名前のアニメーションカーブの値を移動量として使用する。
● モンタージュでルートモーション再生時の移動量を使用する。
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
2.アニメーション依存の移動処理
アニメーションカーブの値を
移動量として使用する対応は、
ルートモーションを使わない設計で
アニメーション依存の移動をする
場合に使いました。
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
2.アニメーション依存の移動処理
もう一つは、モンタージュで再生した
ルートモーションを使用した場合です。
再生しているルートモーションの
情報から移動速度と移動方向を
求めて、移動量に反映します。
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
3.Velocityの計算
エネミーの速度計算は入力量と移動モードで適した計算を行います。
基本的にエネミーは前方移動しかしませんが、一部のエネミーでのみ
水平移動や、ジャンプを使います。空中を移動するエネミーは、垂直移動
も出来ます。これらの使い分けはパラメータとAI次第です。
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
3.Velocityの計算
地上と空中を行き来する
タイプのエネミーで、
移動モードの遷移を
確認します。
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
4.前後方向などのライントレース
エネミーは移動制御と姿勢制御にトレースを使用しています。
・前方へ移動して障害物に侵入した場合の押し戻しを行う前方トレース
・押し戻された時に後方の障害物に侵入しないための後方トレース
・落下判定や着地判定を行うための下方向へのトレース
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
基本的なライントレース(前、後、下)
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
4.前後方向などのライントレース
更にエネミーやマップによって使用する追加トレースがあります。
・幅の広いエネミーが地形や建物に埋まらない様にする追加トレース
・背の高いエネミーが地形や建物に埋まらない様にする追加トレース
・洞窟で使用する、狭い通路への侵入を避けるための追加トレース
・住宅街で使用する、狭い通路での行動を制限するためのトレース
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
幅の広いエネミーが地形や建物に埋まらない様にする追加トレース
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
背の高いエネミーが地形や建物に埋まらない様にする追加トレース
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
洞窟で使用する、狭い通路への侵入を避けるための追加トレース
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
住宅街で使用する、狭い通路での行動を制限するためのトレース
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
5.トレース結果による座標の押し戻し
エネミー移動のトレースは主に
ASyncトレースを使用しています。
各トレースが終了したあと呼ばれる
関数内で、前方移動時に壁などに
めり込んでしまっている場合に、
押し戻し処理が行われて座標が補正されます。
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
6.姿勢制御、最終的な移動座標の更新
床判定のトレースや、壁降り判定の
トレースの結果から、姿勢(向き)を
制御します。床や壁の凹凸に合わせて
姿勢をかえたり、逆に変えなかったり、
壁を登り降りしている時の姿勢遷移を
制御したりします。
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
6.姿勢制御、最終的な移動座標の更新
姿勢制御によって向きの更新が終われば、最終的な移動量もきまり、
MoveUpdatedComponent関数が呼ばれて座標と向きがエネミー
に反映されます。
これで、エネミーの移動処理の流れは終了です。
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
yInsectMovementComponentクラス
主に昆虫タイプなど、壁に張り付くタイプのエネミーで使用する移動制御
です。移動処理自体は親クラス側が全て行っているので、この移動コンポ
ーネントは壁を登ったり降りたりするために必要な判定と、移動方向を壁
や床に変えるためのフラグ設定を行っています。
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
この移動コンポーネントを
使用して移動させると、
登り降り判定から遷移した
移動処理のみで、右の
動画のような移動を
させることが出来ます。
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
ソルジャーに向かって集る
ようなAIを設定すると、
この様な感じにアリタワーに
なります。
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
移動制御のテストについて
エネミーの移動制御はPlayer Controllerで操作する手動テストと、
AI Controllerで操作する自動テストを行いました。
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
移動制御のテストについて
EDF:IRで独自に実装したエネミーを含むyPawnクラスを継承した
全てのキャラクターは、yControllerInterfaceクラスを経由して、
Player Controllerでも、AI Controllerでも共通の処理を使って
操作できるようになっています。
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
移動制御のテストについて
Player
Controller
AI
Controller
yControllerIntaface
InputAnalogLY関数
yPawnを継承した
キャラクター
InputAnalogLY関数
移動
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
移動制御のテストについて
この仕組みを使用して、本来AI Controllerで動かすエネミーを、
手動テスト用のマップでPlayer Controllerを使って動かすことで、
移動制御や攻撃等やその他のアクションの動作確認を行うことが出来る
ようにしています。
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
移動制御のテストについて
テスト用のAIを使った
自動テストも行いました。
©2019 YUKE'S ©2019 D3 PUBLISHER
エネミー移動コンポーネント
移動制御のテストについて
自動テスト中にエネミーが
壁に突き当たり続けていたり
AIが停止してしまった場合は
移動制御の情報を画面中に
表示してデバッグしました。
©2019 YUKE'S ©2019 D3 PUBLISHER
まとめ
UE4の機能は超便利だけど、やりたいこと詰め込もうと思うと、
最終的には、プロジェクト独自で作るほうが、成果は出せると思います。
いかにUE4の「いいとこ取り」が出来るか、そういう事を考えること。
それがとても楽しかったです。学びが沢山ありました。
これからもUE4で、何かしら作って、情報共有していけたらと思います。
©2019 YUKE'S ©2019 D3 PUBLISHER
質疑応答
Q:UE4既製のクラスを使わずに、キャラクターのオンライン同期はどの
ように対応したのか?
A:独自クラスを作ったので、オンライン対応も独自に実装しました。
移動に関してで言えば移動速度(Velocity)をレプリケートで同期して、
各クライアントで移動処理を行いました。通信等の問題でサーバーと一
定距離はなれた場合は、各クライアントの位置をサーバーに合わせます。
©2019 YUKE'S ©2019 D3 PUBLISHER
質疑応答
Q:押し戻しのトレースは、なぜライントレースにしたのか?
A:単純に、処理負荷対策です。
巨大なエネミーの地形へのめり込みを完全になくす事は難しいので、多少
のめり込みは許容して、エネミーの数を増やすことを重視したためです。
©2019 YUKE'S ©2019 D3 PUBLISHER
質疑応答
Q:エネミーAIの移動時のパスはどのように決めたのか?
A:エネミーに移動用のパスはありません。ナビメッシュ等も使っていませ
ん。アリなどは建物があっても地形に合わせて移動し続けることができるの
で、目標だけ決めてあればそこに移動できます。怪獣なども建物を破壊し
ながら移動するので、パスはありません。
©2019 YUKE'S ©2019 D3 PUBLISHER
質疑応答
Q:アリの頭がソルジャーにめり込まないのはなぜ?
A:アリの頭には、移動で使用するものとは異なるコリジョンがあります。
このコリジョンは、ソルジャーの移動コンポーネントとの接触判定を行うた
め、ソルジャーはこのコリジョンにめり込みません。そしてアリの移動中は、
このコリジョンを地形と接触判定に使用しないので、アリは頭のコリジョン
に邪魔されることなく移動できます。
©2019 YUKE'S ©2019 D3 PUBLISHER
ご清聴ありがとうございました!
©2019 YUKE'S ©2019 D3 PUBLISHER

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