壁などに隠れるカバー状態と、そこから飛び出して銃撃戦を行うカバーシステムをGASP-ALSに導入しました。そのメカニズムを解説します。
無料公開プロジェクト: GitHub – yossi40-100/GASP-ALS
キャラクター本体の処理
壁に張りつく/離れる
- キー入力で壁を探す → あればくっつく
- 壁を探すのはトレースで
- 瞬間移動すると違和感あるのでタイムラインで
- カプセルを細くする or カプセル内でメッシュだけ前に寄せる
- 細い隙間を通れるようにすることも考えると細くするのが有力
CBP_SandboxCharacter > イベントグラフ



タイムラインは長さも注意しましょう!デフォルトの5秒だとくっついたり離れたあとも5秒経過するまでSetActorLocationで位置が強制されるので、結果的に硬直します
ちなみに、
タイムラインをコピペする方法
私のリポジトリからコピペしたい場合は、いったん私のリポジトリ上のタイムラインで右クリックから「外部カーブを作成」し、

できた外部カーブアセットを自分のプロジェクトに「移行」して

自分のプロジェクトのタイムライン内で「外部カーブ」/「なし」のところにその外部カーブを設定すると取り込めます。

そのあと「なし」だったところの3つ隣の×印から「内部カーブに変換」するとカーブアセットとの紐づけが解除されてタイムラインノードの中に埋め込まれます。(任意)
張り付いたまま移動
- 後ろに移動できると離れちゃうので横にだけ移動できるようにする
- 上下軸は捨てて左右軸だけ使う
- カメラの向きとは関係なく、壁の法線に対して左右に動かす
- 壁がなくなったらそれ以上移動できない or カバー状態じゃなくす
- RightVectorで少し横の位置からForwardVectorで前向きにトレース
- 今回はそれ以上移動できない仕様(トレース戻り値がfalseなら移動しない)とした
- 速度も通常だと早すぎるので遅くする
- CoverMoveSpeed:100
- ※ただしMin Analog Walk SpeedもIsProned時と同じように下げないと下限値150に貼りつく
CBP_SandboxCharacter > イベントグラフ > IA_Move
CBP_SandboxCharacter > InCoverMove
CBP_SandboxCharacter > イベントグラフ > UpdateMovement_PreCMC
くっついたら回転できない
- カプセルが壁のほうを向かずに回転できてしまうと、横移動するときに向きがおかしかったり、トレースがヒットしなくなる
- カメラの回転入力をキャラクター本体に反映させる設定をカバー時は止める
- (Strafe時も向きは止めているが、入力軸の向きがそれとも異なる)
- Use Controller Desired Rotation をFalseにする
- Orient Rotation to Movement をFalseにする

これは文章では理解しづらいと思います。やらない場合とやる場合を実際比べて体感してください。
壁から飛び出して銃撃戦
- 横に移動してからエイム姿勢にする
- これもタイムラインで
- 同じ手で撃つ場合、左右で踏み込む距離が違うのでモーションや長さも変わる
- エイム解除したら元に戻る (or 飛び出したまま操作可能にするのもあり)
アニメーション
PSDはやってみたけど大変そうなのであきらめる

チューザーテーブルで任意・任意・任意・任意・IsCoverフラグ=Trueという列を先頭に配置したところ、デバッグ表示でも正しく選ばれているように見えるのに、実際には違う行が選択される不具合にハマり時間が解けまくり断念(UE5.5.4)
※ 一応その件は先頭行じゃなくしたら正しく動作しました
- フラグでモーションマッチングを捨ててステートマシンに切り替える分岐
- アニメーションシーケンスが反対のものがない場合はMirrorノードで鏡に写した反転ポーズがつくれる
- Blend Poses by Bool で左右どちらを向いているかで条件分岐する
アニメーションのルートの方向が180度逆のものが切り替わるタイミングで高速に回転する問題
- 事前に向きを揃えておくのがおすすめ
- ステートマシン内で骨を180度回転させることもできるが、180度回したアニメーションのあと通常の向きのアニメーションと繋いだはずが、-180度回してくれればいいところ、+180度回してくれてとんでもない動きになる場合あり。
- 詳しくは動画で。
足がねじれる問題
- アニメーションシーケンスに適切なfoot_ikのモーションがついてない場合、Copy Boneで見た目通り動いているFKボーンからIKボーンに位置情報をコピペする
- ↑の結果、IKボーンの位置を頼りにAnimGraph後半のLegIKノードが地面との設置位置計算するのがほぼうまくいく
- これも詳しくは動画で
ABP_SandboxCharacter > AnimGraph モーションマッチング直後
ABP_SandboxCharacter > AnimGraph > CoverSystem

ステートの中身例

コメント