UnrealEngineの公式アニメーションサンプルGASPで立ち・しゃがみに加えて伏せ・ほふく状態を追加しましょう。 モーションマッチング・ポーズ検索データベースに新しい状態を追加する方法をゆっくり解説します
GitHub: yossi40-100/GASP-ALS
本記事はアニメーションの前段として、キャラクター本体の制御を説明します。
キャラクター本体をしゃがみ/伏せ切り替え
CBP_SandboxCharacter の Crouch しゃがみを参考にします。
今回はZを押したら伏せる仕様とします。
しゃがみ長押しで伏せとかの仕様もありなので、そのへんはお好きにしてください。

といいつつ、ゲームパッドだとボタンが足りなくなりそうなので後日そうしようかなと思っています。
デバッグ補助
デバッグしやすいようにカプセルを見えるようにします。作業終わったら戻しましょう。
カプセルコンポーネントを選択して詳細欄からHidden in Game をチェック外します
あと、敵に撃たれちゃうのも今ちょっと邪魔なので、ダメージ喰らわないように、BattleGraphでAnyDamage処理を無効化しておきました(yossi40-100/GASP-ALS前提)
変数
伏せ状態用のフラグ isProned を作ります(列挙型にする手もあります。
そのほか、カプセルサイズを管理するFloat変数を作ります。
変数名 | 初期値(参考) | 用途 |
Is Proned | false | 伏せ状態管理フラグ |
Capsule Radius Stand | 50.0 | 立ちのカプセル半径 |
Capsule Half Height Stand | 86.0 | 立ちのカプセル高さ/2 |
Capsule Radius Prone | 25.0 | 伏せのカプセル半径 |
Capsule Half Height Prone | 25.0 | 伏せのカプセル高さ/2 |
Capsule Half Height Crouch | 60.0 | しゃがみのカプセル高さ/2 |
Prone Speeds | 100, 20, 50 | 匍匐移動速度(※後日使います。動画#3 |
キー入力イベント(処理の入口)
浮いてないときに、Z押すと伏せるか起きるか切り替わる処理を関数化しました。
立ちから直接伏せるのではなく、しゃがみを経由する仕様にします。
CBP_SandboxCharacter > イベントグラフ
伏せ処理: ToProne関数(しゃがみから伏せに遷移)
しゃがみの処理はこれを勝手にやってくれる関数があって、それと同じことを違うパラメタでやりたい感じです
C++だともう少し簡単にやれそうな気もします
立ち状態のカプセルサイズはカプセルが持っていて、伏せたときにはこれを小さめにします。カプセルの直径より高さを小さくはできません。縮められるのは円柱部分だけで最小でも球体はまるまる残るって感じですね。

なので、匍匐時はカプセルの中にキャラクターのメッシュが入りきることはなく、めっちゃはみ出ます。はみ出る部分が壁にめり込まないようには自力で対策が必要とのこと。
カプセルを寝かせてしまえばよいような気もしますが、そういう想定はされてないようです。
そういうことがしたい場合は、カプセルを使った通常のやつではなく、Moverという新しい移動制御コンポーネントでできそうです
が、、、UE5.5.0で試しに使ってみたらクラッシュしたので私はまだ試せていません。
カプセルサイズを変えるだけだと、伏せにしたときに空中に一旦浮いてから落下していますね。
カプセルの原点は中心なので、小さくするだけだと浮いちゃいます。

なので小さくすると同時に地面に着く位置に移動しましょう。
動かす関連のノードはたくさんありますが、今回はずらす「オフセット」を使います。

もとの半分の高さを引くと地面になりますが、カプセルの中心は変更後の伏せ状態の高さの半分上なので、しゃがみ状態の高さの半分引いて地面を求め、そこから伏せ状態の高さの半分追加ですね。
伏せるときは地面にくっついたままに改善できました。
CBP_SandboxCharacter > ToProne
伏せ解除:UnProne関数(伏せからしゃがみへ遷移)
CBP_SandboxCharacter > UnProne

ToProneに入れたカプセルの位置移動は省略しています。
よくみるとほんの一瞬浮いてますが、しゃがみの場合はあまり気にならないレベルで戻せています。ちゃんとやりたい方は上に逆の移動処理を追加しましょう 。
しゃがみと伏せで行き来できて、立ちから伏せへは行き来できない状態です 。
起き上がれるか判定 マクロ
冒頭のマクロは動画#4で追加した起き上がり判定処理です。
CBP_SandboxCharacter > CanProneToCrouch
計算説明は少し長くなるので一旦割愛し後日別記事にします。
しゃがみボタンで伏せ状態のままカプセルだけ立っちゃう問題
伏せ状態からしゃがみ入力「Cキー」で立てちゃう問題の対策です。
動画では一旦先送りして#4最後で回収していますが、ブログではまとめて済ませてしまいましょう。
伏せているときはしゃがんでいる状態でもある仕様に決めたため、しゃがみ解除する分岐の先でIsPronedを見て伏せからしゃがみへの遷移か、伏せていないしゃがみから立ちへの遷移か切り替えるだけでOKです。

もし、立ち姿勢から直接伏せに遷移させたいという場合も、キー入力時にまずはCrouchさせて、DelayUntilNextTickなどで1フレーム置いてToProneとすればよいでしょう。
※ しゃがみ・しゃがみ解除は1フレーム遅れて動作する仕様のようで、同じフレーム中には変更できません。
コメント