お世話になっております。
FallingのときのCharacterMovementのTwoWallAdjust()によってキャラクターが上方向へ移動してしまうことがありますのでその挙動について質問させて頂きます。
その挙動は以下の手順で再現できます:
- 新しいThirdPersonのサンプルプロジェクトを作成します。
- 画像のような壁を配置します。
- ThirdPersonCharacterを開いて、特定のキーを入力したらキャラクターを前方に向けて打ち出すようなBPを組む
- CharacterがPlayer0の入力を受け付けるように設定します。
- PIEを開始し、キャラクターを配置した角にぶつかるように移動します。
- 手順5の状態で角に向かってジャンプして、着地する前に手順3で設定したキーを押してキャラクターを打ち出します。
- キーを押した後キャラが壁に沿って上へ移動するのを確認できます。p.VisualizeMovementを有効にして確認すると、キーを押した直後に描画される矢印の向きが上に向くのを確認できます。
落下中で手順2で配置した形のコリジョンにぶつかると、UMovementComponent::TwoWallAdjust()によって移動量の大きさを維持したまま、向きだけを2つの壁の法線と直交する方向に変換されます。
UCharacterMovementComponent::TwoWallAdjust()は地上で移動しているときにケアをしていますが、Falling状態でTwoWallAdjust()を呼び出すとUMovementComponent::TwoWallAdjust()を呼んでいるだけですので。本来の移動量のZ分量が下に向いた場合でも、UMovementComponent::TwoWallAdjust()の処理によって上方向へ変換されます。
この挙動が想定していた通りの挙動になっているのでしょうか?
まだ現在開発中のゲームはAddImpulse()などを使用してキャラクターを高速に移動させる処理を実装しているため、このような挙動を回避するために下記修正案を行おうと考えていますが、その修正案に問題ないかどうかの確認もお願いいたします。
// CharacterMovementComponent.cppの4143行あたり
// 修正前のコード
FVector PreTwoWallDelta = Delta;
TwoWallAdjust(Delta, Hit, OldHitNormal);
// 修正後のコード
FVector PreTwoWallDelta = Delta;
TwoWallAdjust(Delta, Hit, OldHitNormal);
Delta.Z = PreTwoWallDelta.Z
長くなりましたが、よろしくお願いいたします。