カバーシステム改善 Yossi’s GASP-ALS

※本サイトはアフィリエイト広告を利用しています。

Unreal Engine 5 の Game Animation Sample をベースにした TPS シューティングゲームの開発を進めています。今回は「カバーアクション」の挙動を改善した点をまとめてご報告します。

元記事はこちら

カバー周りの改善点まとめ

1. カバーに斜めや後ろ向きから入った際のメッシュの向き修正

Before

After

原因

  • GASPのキャラクターは本体のカプセルの回転とメッシュの回転が同期していない
  • モーションマッチングで都合の良い向きになるようにOffsetRootBoneで回転が補正されている
よっしー
よっしー

ABPの中でも一番コメントの長~~いOffsetRootBoneノードです。詳しくはその警告を翻訳して読んでね

対策

「カバー中かつ飛び出していない時」に OffsetRootBone と AimOffset を無効にしました。
飛び出し中も無効化してしまうとエイムできなくなり不都合です。

ABP_SandboxCharacter > Get_OffsetRootRotationMode

ABP_SandboxCharacter > Enable_AO

よっしー
よっしー

前向きに壁に突入する場合は、エイムオフセットは解除しないほうが首が動いて自然です

が、後ろ向きからカバーに突入する場合などに、エイムの方角がズレて気持ち悪い動きになるとのことで、いっその事エイムオフセットをしない仕様に変更しました。

2. カバー突入・解除が即時だと異常が出る問題

Before

After

※ 画像だとわかりませんが、コリジョンサイズも状態と不一致になるケースがありました。

原因

行きと帰りで別なタイムラインを採用しているため、行きのタイムラインの途中で帰りのタイムラインが始まった場合に、2本のタイムラインが同時に動いている瞬間がある

対策

CBP_SandboxCharacterで、ToCover/UnCoverのタイムライン実行前に、逆方向のタイムラインをStopするよう修正。位置やカプセルサイズの不具合を解消しました。

3. カバー中の向きを壁への進入角度に基づき自動判定に変更

Before

割愛。必ず左向きに突入していました

After

原因

仕様です。アニメーションが左向きしかなかったのでそういう仕様にしていました。

対策

左固定だった首の向きを、壁の法線角度とキャラの角度差に基づいて右か左かを判断する方式に変更。
IsInCoverFromLeft関数を追加し、ToCover内で使用しています。
また、突入のアニメーションはMirrorで反転させて用意し、その次の遷移条件にもそれの再生終了をOR条件で追加しています。

CBP_SandboxCharacter > IsInCoverFromLeft 関数(新規)

CBP_SandboxCharacter > イベントグラフ > ToCover

ABP_SandboxCharacter > AnimGraph > CoverSystem > Enter

ABP_SandboxCharacter > AnimGraph > CoverSystem > Enter から CoverIdle

よっしー
よっしー

↑同じStandToCover_Lアセットなので名前が全く同じですが、アニムグラフ的には別インスタンス扱いのようで、分けて判定しないと正しく処理されませんでした。

もうちょっと簡単に「前のステートのアニメーション完了」みたいなノードや設定はないんでしょうか?

4. カバーからの飛び出しエイム処理をタイマーに変更

Before

After

原因

2番と類似ですが、エイムの設定をタイムライン中にDelayでやるのは少し無理がありました。
タイムライン中に常に呼ばれる処理でセットしている状態でした。

対策

従来のDelay方式を廃止し、EmergeAim処理をタイムライン開始前にタイマーで予約。復帰時はタイマーをキャンセルすることで、エイム遷移のタイミングを多少安定化しました。

CBP_SandboxCharacter > イベントグラフ > EmergeAim

よっしー
よっしー

まだもう一歩って感じです。

5. ラグドール復帰後に不正にカバー姿勢になる問題

Before

After

原因

  • ラグドール時にカバー中などの各種状態変数を更新しておらず、優先度の高いラグドール状態になっている
  • ラグドール時はメッシュの物理シミュレーションにてキャラクターが動く
  • ラグドール解除時のキャラクターの位置や回転はラグドール前と異なる
  • 結果、違う位置で同じ姿勢になり矛盾が起きる

対策

StartRagdollからUnCoverImmediatelyイベントを呼び出し、壁がない状態でのカバー継続を防止。強制的に解除処理を入れました。

また、伏せやしゃがみも解除して、復帰時は立ち状態にしています。(これは暫定仕様)

CBP_SandboxCharacter > イベントグラフ > UnCoverImmediately (新規カスタムイベント)

残件

これらの改善により、より自然なカバー動作や切り替え、エイム挙動が実現できるようになっています。

いったんこの辺でカバー改善は止めて先送ります。
TODOとしては

  • 立ちxカバー限定 ⇒ しゃがみxカバー
  • AIキャラクターのカバー行動への対応
  • プレイヤーコリジョンが細かいリアル系アセットで安定したカバー移動

コメント

タイトルとURLをコピーしました