C.K
(C.K)
1
【C++】【SideScrollerテンプレート】をひな形にして3Dキャラクタの横スクロールアクションを
作成しています。
独自のキャラクタ制御の為に【UCharacterMovementComponent】を継承したクラスで
変更を加えられないかと考えています。
以下のようなキャラクタ制御を実装したい場合はどの関数を拡張すれば良いでしょうか。
【①】キャラクタが別のキャラクタに乗った際の挙動
現状:別のキャラクタに乗った際に跳ねる
変更:跳ねずにお互いY軸で押しのけながら地面に着地
【②】キャラクタの方向転換時の挙動
現状:左右キーを押している間だけ向きが変化する
変更:左右どちらかのキーが押されたらキーが離された後も自動で押された方向に向きを変える
以上です、過去に同様の実装をされた方がいらっしゃいましたらアドバイス頂けないでしょうか。
PierPop
(Pier Pop)
2
【①】
デフォルトではSpriteComponentにCharacterMeshのCollisionが設定されています。
設定を固定するのであればコンストラクタでお好みの方法に併せてカスタマイズしてください。
【②】
UpdateCharacterでDirectionに応じてSetControlRotationを変更している箇所があります。
ここをお好みの方法に併せてカスタマイズしてください。
「独自のキャラクタ制御の実装」を行うにあたり「どこを拡張すれば良いか」というのはあまり良い質問ではないかもしれません。「どこを拡張する必要があるか」のイメージはあなたが一番良く知っているですので、「どの関数で何を行っているか」を良く理解し、テンプレートを理解することが、あなたの実装を実現する一番の近道です。
色々な思考錯誤の上でご不明な点がありましたら気軽に質問してください。あなたの力になれるかもしれません。
まずはテンプレートの機能を良く見てみましょう。
C.K
(C.K)
3
ご返信ありがとうございます。
まだUE4を触り始めたところでコード解析が不十分な状態での質問となり失礼致しました。
試行錯誤を重ねます。
理解が不十分な状態で恐縮ですがアドバイスの内容について確認させて頂きたいです。
【①】
SpriteComponentとはCapsuleComponentのことでしょうか。
また、Collisionの設定で「キャラクターが乗ることが出来るもの」を「No」にすることで跳ねなくは出来たのですが
上に乗ってしまいます。乗らずに落下させたい場合は何か別のフラグ設定があるのでしょうか?
【②】
UpdateCharacterの名前が付いた[UpdateCharacterStateBeforeMovement]、[UpdateCharacterStateAfterMovement]
を調査しましたが[SetControlRotation]に繋がる処理を確認出来ませんでした。
ですがこちらは、移動ベクトルを向きに変更した値を利用している箇所を変更することで希望の状態を実装出来ました。
UMyCharacterMovementComponent::PhysicsRotation
DesiredRotation = ComputeOrientToMovementRotation(CurrentRotation, DeltaTime, DeltaRot);
↓
DesiredRotation = m_ActionDirection; // 任意変数に差し替え
以上です、お手数ですが【①】についてご確認頂けますでしょうか。
PierPop
(Pier Pop)
4
ご確認ありがとうございます。
①はCapsuleComponentのCollisionを図のように変更するのはいかがでしょうか。
Pawn(キャラクタのプリセット)同士のCollision判定を無視するようにする設定です。
②は間違っていたら申し訳ありませんが、意図通りの挙動を確認されたとのことで安心しました。
①についてご確認頂ければと思います。
C.K
(C.K)
5
ご確認ありがとうございます。
頂きました内容を設定したのですがキャラクタ同士が一切干渉しあわなくなりました。
私の理想としまして、キャラクタ同士が縦に接触した場合は跳ねず&乗らずに地面に落下して
左右から接触した場合は従来の挙動であってほしいと考えています。
正しい物理現象を無視した挙動を実装したい場合はアドバイス頂きましたように
従来の機能をカットした上で独自に処理を記述した方が良いでしょうか?