GASPで伏せよう連載最終回の本記事では、UE5.5のGASPで匍匐前進をできるロコモーション追加を完成させます。
PSDでうまく移動させるために試行錯誤した件やモーションマッチングのデバッグ方法を解説します。
初回記事
モーションマッチングのポーズサーチデータベースに登録します。UnrealEngineの公式アニメーションサンプルGASPで立ち・しゃがみに加えて伏せ・ほふく状態を追加しましょう。
PSDに匍匐前進を追加
チューザーテーブル を開きます
伏せの動画で追加したProneIdleの下に追加しましょう
CHT_PoseSearchDatabases_Dense

止まっているときと移動時でわけるのでアイドルの条件も変えます
ムーブメントステートは移動速度で勝手に変わる仕組みなので
これをムービングにすればOKです
GaitはWantsToSprintなどの
影響を受けるので任意にしておきます

詳しく知りたい方はABPを追ってください
そのとき選ばれるPSDは、一旦適当なものにしてからフォルダにジャンプし、利用状況が似ている PSD_Dense_Crouch_Walk_Loops などの複製から作るのがよいでしょう
PSD_Dense_Crouch_Walk_Loops は8方向(横が2種類づつ)の10個登録されています

匍匐にこんなにたくさんは準備しなくてもいいかなと思いますが、準備できる人はやってください
ただしいきなりたくさん登録するとデバッグが難しいので、まずは1個で試しましょう
クラウチを真似して、ループでルートモーションに設定を変えましょう


デバッグ
チューザーテーブル
チューザーテーブルのデバッグはここで設定できます

立ち、しゃがみから伏せになって、キャラクターを動かすとちゃんとムービングに選択が切り替わっていますね

チューザーテーブルの選択ロジックは問題なさそうです
が、匍匐前進のアニメーション自体はうまくいってないですね
一瞬でリセットされてDJのチョップみたいな切り刻み状態になっています
リワインドデバッガー
では先ほどの問題をデバッグしていきましょう
ツールのデバッグにリワインドデバッガーがあります

日本語だと「デバッガを巻き戻す」でドキュメントと違っちゃってます
Ctrl+F1で録画ボタンを押すとログ収集が始まります。停止も同じボタンです

ログが取れたのでゲームを止めます
するとレベルシーケンスのように時間を巻き戻して、状況を見ながら情報を確認できます
情報が多すぎてわからないこともある気はしますが、名前である程度わかるかなと
シークバーがない?ので範囲外に動かしづらいですがアローキー左右で動かせそうです。
このあたりでアニメーションがフェードしながら切り替わっていますね

切り替えのタイミングがうまくいってないなどはこれでわかるかと思います
今回は同じアニメーションが、多重にブレンドされている様子がわかります

用が済んだらログを削除してもいいかなと思います
あと、リワインドデバッガーを使うと自動的にビジュアルロガーが有効になるかもしれません。
ので、こっち(「デバッガを巻き戻す」の少し下にあります)も停止するのを忘れずに
シーケンスの調整
前回見た、立ちからしゃがみへの遷移とは違って、しゃがみループには BlockTransition の通知はついてないですね

ちなみに PoseSearchBranchin はドキュメントにまだ説明がありませんがステートマシンセットアップ用です。

これの解説希望のご要望もいただいてますが、Two-way Blendノードの特殊な動きを使ったハック技的な処理をしていて、今時点これを改造して使うべきじゃなさそうでした。
あとはカーブ類ですが直接関係はなさそうかなと
あとはForce Root Lock にチェックがついていますね
これをチェックしておかないとアニメーションの終わりで、ジャンプしちゃう場合がありますね

ルートモーションの情報でそのアニメーションの動きを把握していて、軌道予測とマッチするアニメーションを選択するのに使う。
だけど、実際にはアニメーションシーケンスの動きを使ってキャラクターを動かすのではなく、あくまでコントローラからのキャラクターの動きをそのまま使う。
なので、ルートモーションさせないのでLockする
みたいな理解です
理想的には匍匐時は体が動くタイミングと、右足を曲げるタイミングで動き方も変えたいですね
そのへんのリアル感追及はそのうち研究してみたいと思います
速度早すぎるけどある程度改善しましたね
PSS ポーズサーチスキーマの調整
これは匍匐アニメーションがリセットされて切り刻まれる件の対策になります
PSD_Dense_Prone_Loops リスト下のデータベースの設定欄

PSSをデフォルトからアイドル用に変更したら、リセットされずにそれらしく匍匐前進できるようになりました
PSS_DefaultとPSS_Idleの違いはなんでしょうか
そういうときはコンテンツドロワーで両方選択して、アセットアクションから
プロパティマトリクスを開きます

差分があるところは「複数の値」となっているので、そこを片方づつみれば確認できます
検索に使われる情報チャンネルに違いがあるみたいです



チャンネルってなんやねんって話ですが、よっしーUEチャンネルと同じく、
興味を持って観察する相手って感じですかね
デフォルトはヘディングなので、頭の位置情報みたいなものを使っているのかなと
それよりIdleで見ているポーズチャンネル、つまりアニメーション自体の情報のほうが
いまのところよい結果ということでしょうかね

まぁ詳しく見たところでさっぱりわかりませんし、専門家でもなかなか難しいんじゃないかと
なので深追いはこのぐらいにしましょう
もう少しわかりそうなバイアスの値もいじってみましょう
コストバイアスの調整
コストが高いほうが選ばれにくくなる概念なので、元々マイナスですがさらに下げてみましょう

継続ポーズ なので、コストを下げると、同じアニメーションを続けやすくなる調整という理解です
よさそうですね
他にも下のほうには解析手法のパラメタがあります
このへんはよっしーは多変量解析の知識があるのである程度予測はつきますが、素人が触るものじゃないので基本的には放置しましょう
今回はこっちの作戦ではなくさきほどのスキーマを変える作戦にしておきます
※将来横回転とか追加するときに変える可能性はあります
移動速度調整
匍匐前進時の速度がしゃがみ歩きの速度では速すぎるので、まずはしゃがみ歩き時の速度を探しましょう
キャラクターには 最大歩行速度 MaxWalkSpeed がありますが、
GASPではStrafe時の移動の向きによって速度が変化するので、CBP上に変数管理されているはずです

前横後ろの3つ固まったベクトルになっていますね
使用箇所を調べると、Tickで毎フレーム動く前処理中にありました。
キャラクターの速度から向きを調べて、何かしらのカーブで移動方向に応じた味付けをして、2つの間の値で速度を決めているようですね

結構細かいですね
まぁ匍匐用にも3つ値を用意すればよいでしょう
しゃがみの前方向が225で速すぎたので100くらいにしてみましょう
速度は多少遅くなった気がしますが、まだ速いですね(※計測すると150になっています)
思い切って下げてみましょう。全部20にしてみます
変わりませんね
ほかの原因を探しましょう
速度調整 その2
動画ではデバッグ方法も説明していますので興味がある方は動画をご覧ください。

GameAnimationSample自体のデバッグ用ウィジェットから得られる情報などほかにもデバッグに役立つ情報はたくさんあります
(多すぎて使いこなせません(;’∀’))
150より大きな値なら設定した速度に変更できるけど、150を下回ることは決してできないということで、この設定値とは別の何かが下限ガードしている可能性が浮上しました
試しに150という値で検索してみるもそれらしいものはヒットせず。C++ソースをグレップすればわかるのかもしれませんが。。。
おしえて ChatGPT と聞いてみたところ、あっさり解決しました。
キャラクタームーブメントコンポーネントには「Min Analog Walk Speed」があり、
これが150以上に設定されていると、それ以下にはならないよと。

最小値のほうが最大値より優先なのは予想できていませんでした
原因が分かったところで、しゃがみと伏せ状態で最高速度を切り替える処理を実装しましょう
CBP_SandboxCharacter > CalculateMaxCrouchSpeed
方向でカーブから入力値を取る部分まではそのままでよいので、後半部分をコピペで分岐させましょう
肝心の速度は150でちょっと速かったので120くらいにしてみます
また横方向にはあまり移動できないほうがリアルかなと思うので、
思い切り小さく20にしておいて、後ろはそれより大きめで50くらいにしておきます
まだ肝心の150制限を緩和していませんが、設定欄はキャラクタームーブメントコンポーネントの歩行の欄にありますね

ただ、通常時のこの値を直接変えちゃうと、ほかにも色々問題が起きるかもしれないので
匍匐の時だけきりかえるようにしましょう
さきほどまでいじっていた速度計算の呼び出し元で、匍匐の時だけ書き換えます
これも変数にしたほうがいいかもしれませんが、
分解能なのでキャラ毎に変えることはないかなと思い直書きです
↑ 海外の方向けに日本語コメント内容:最低速度のほうが最大速度より優先なのでProne時に下げる
これでようやく、120達成です。後ろも50になってます。

前進は100でもいいかなって感じです。実際の速度はお好みで。アニメーションシーケンスの再生速度も併せて調整するとなおよいかと。
横や後退時もアニメーションが前に進もうとしていますが、それはアニメーション用意しないとですね
一応完成ですね
ストレイフ解除すれば回転もできます
参考情報
Unreal Engine のモーション マッチング | Unreal Engine 5.5 ドキュメンテーション | Epic Developer Community
Unreal Engine のモーション マッチングのデバッグ機能 | Unreal Engine 5.5 ドキュメンテーション | Epic Developer Community

今回見たよりもっと細かい実コストを見れるビューとかもありますね。それ見たところでどうすりゃ改善できるのかはほとんどわかりませんが(◎_◎;)
おわりに
いちおうGASP-ALSで銃を構えて撃つのもそれなりにできてます

ただししゃがんでいるとき用のオーバーレイ状態なので、色々矛盾は起きているのと、上下方向のエイムはまったく効きません
これはそこそこ大改造になりそうなのでまた後日検討します

それではまたのおこしを
コメント