『ぱるくーーる』というわけで、地面からじゃなくても、専用ブロックじゃなくても、いつもより高くても飛びつける改造や、着地時にローリングして衝撃を逃がしたりといったアクションの改造をしていきましょう。
レベル1 空中から飛びつき
サンドボックスキャラクターのブループリントを開きます
ジャンプボタンが押された時の処理で、地面を移動中じゃなかったら何もしない分岐がありますね
浮いているときはここがFalseなので動きません

条件判定をスキップしちゃいましょう

普通に飛びつける動作はそのままで、少し手前でジャンプしてから近づいて再度スペース押すと乗れるようになりましたね

トラバースできるかの計算自体がキャンセルされていたのをとにかくやってみるという簡単なハックです
レベル2 飛びつける高さ変更
さきほどバイパスした地面判定の次のノードが
トラバース動作をどれをやるかやらないか演算する処理です

ざっくりみると
- ステップ1は情報取得で
- ステップ2が前方にトラバーサブルブロックを探してあったら高さや奥行を取得する処理
- ステップ3は移動できる空間確認後、飛び乗る高さの差分と奥行計算
- ステップ4がトラバース動作の種類を決める処理で
- ステップ5でデータベースから最終決定
なので、ステップ4で、高さや奥行などの情報をもとにVaultやHurdle、Mantleなどのジャンルを決めて、どの行動をとるか決めるこのあたりを改造すれば、飛びつける高さも変えられそうですね
高さが50から125の間で、すぐ後ろに地面がなく、奥行が59未満のときは
Vault(跳び箱的なアクション)となります

それが選ばれなかったときで、似たような条件で、すぐ後ろに床があって、奥側のフチの高さが50以上だったら
Hurdle(上に避けてもとの動作を続ける、陸上競技のハードル走的なアクション)です

それでもないときは、高さが50から275までで、奥行が59以上あれば
Mantle(手でつかまって上に乗るアクション)です

なのでこの275という上限を変えれば乗れる高さを調整できそうですね
とりあえずコメントでもとの高さをメモって350のブロックに乗れるように360くらいに変えてみましょう

ここが350あるので飛んでみるとできませんね

これには罠があって、下の段が高さ100のトラバーサブルブロックになっていて、それに対して跳び乗れるか計算する処理で、上に載っているトラバーサブルブロックが障害物扱いになるためです
こんな感じで縦積みを横積みにすればOKです

そしてこれで飛べるようになるかというと、、、もう一つデータベース側の変更が必要です
ステップ5でチューザーテーブルでアニメーションが選択されますが

さっき上限を変更したマントルの中に進んでいくと、さらにずらっと条件分岐があり、ここにも高さの条件が設定されているので、
ここを変えないと最終結果がアニメーションなしになってしまいます
ここもかえましょう

できましたね
レベル3 着地時ローリング
高いところから着地するときに前転してみましょう
アニメーションのジャンプのフォルダに落下時にローリングするアニメーション「M_Neutral_Jump_F_Land_Roll_Lfoot」があります。

これを着地のもとのアニメーションと置き換えましょう
銃を撃つみたいにボタンでモンタージュ再生する作戦もアリと思いますが
着地時のアニメーションDBを変更する作戦でやってみましょう
チューザーテーブルをみます

着地はその次の行動でDBの格納先が分かれていますが
今回はスピードのあるランを対象にしてみます
ランの中で、このちょうど着地した瞬間という条件が2種類あって
右のヘビーのほうが高いところから落下してきたとき用です
それがTrueのときのPSD「PSD_Dense_Stand_Run_Lands_Heavy」を編集しましょう
前方向に進むときだけ、左右どちらの足スタートかで2種類設定されています

このグッと踏ん張ってから走るアニメーションを、さきほどみたローリングに置き換えましょう
両方でもいいですが今回は片側1個だけ入れます

他のアニメーションと設定が違うところがあるので設定を合わせましょう
ルートモーションの設定はここからはかえられませんが、ダブルクリックで開いてここでチェックを付けます

あとはもとのアニメーションが選ばれると再生されないのでこのリストから削除するか
ここの目玉のマークでコメントアウト扱いすることもできます


無事回転できましたね

よくみると回転の終わりと走りがうまくつながっていませんが、細かい調整はまたそのうちやりましょう
2024/08/05追記:EnableRootMotionだけでなく、Force Root Lockにチェックを付けると治ります。この件も下の補習動画で解説しています。
とはいえ今のうちに対策しておきたい問題もあります
銃をかまえる上半身固定のポーズに上書きされちゃうため、ローリング時に銃を構えていると、ありえない下半身だけローリング状態になっちゃっています
いくつか対策方法は考えられますが
ジャンプする時点でエイムを解除する簡単対処とします。
Strafe状態のときに銃をかまえられる設定にしているので、ジャンプ要求されたタイミングでしゃがみと同じく解除してしまいましょう

ジャンプ中に構えると再発するのであくまで簡単対処です
対処方法改良 (240801追記)
前述の簡単対処ではFPS化したエイム視点がジャンプ時・トラバース時に解除されてしまう別な問題が発生します。
なので、アニメーションBP側で、このローリング動作を行う条件=Just_Landed_Heavy(速い速度で着地した状態)のときは上半身のポーズをブレンドしない対策を行いましょう。

レベル4 トラバーサブルブロックなし
トラバーサル処理に戻り、いよいよ処理を本格的に改造します
ステップ2の部分です
元の処理確認
2の1ではまずカプセルを前方に飛ばして障害物を探し、ここで何かにぶつかったら、それがレベルブロックトラバーサブルかキャストして確認しています

ぶつからなかったり、相手がそれじゃなかったらトラバース失敗で終了していて
そうだったらブロック自体の処理で情報を計算しています

このブロック側に実装されている「Get Ledge Transforms」関数は、トラバーサブルブロックの上についているスプラインをもとに、計算した結果を構造体に入れて返す作りとなっています
最初が4辺のどれが近いかで、これで向きが決まるので斜めに跳べない原因にもなっています
次が決まった進入方向に対して横幅があるかの確認です
単純にスプラインの長さが規定値60以上あるかを比較しています
これが幅が60ないとトラバースできないことの原因となっています
でなぜ60にされているのかというと、その次の処理で60の半分、つまり30は端から内側にズラした位置にトラバースの開始地点を補正することで、空中に手や足をついてジャンプするありえないことを防ぐための予防措置です
どんなアニメーションをさせたいか次第ですね
後半は進入側のスプラインの反対にあるスプラインを取り出して位置情報を返しているだけです
改造
ではキャラクターBPにもどり改造していきましょう。
ステップ2の1と2の2を作り替えます
まず、もとのほとんどの処理は要りませんので、消してしまいます。
そして代わりの関数を作ります。
関数名はなんでもいいですが、もとのトラバーサブルブロックと同じような名前にしておきます

この最後のTraversal Resultはもともと一部情報が入っている構造体を直接わたすんじゃなくて
ここにあるから追記してっていう依頼方法にするために
「リファレンス渡し」というオプションにチェックをつけます

残るはこの関数のなかみを書くだけです
上から下向きにレイ(探索信号)をとばして、ぶつかったら=乗れるものという作戦とします

まずはFor loopで繰り返す処理を出します。
これでちょっとずつ前に進みながら上から下向きのレイがぶつかる障害物を探します
繰り返す回数分前に探索が進むので、回数はどこまで探したいかに合わせる必要があります
このTrace Forward Distanceという信号は、停止、歩行、走行で変わる探す距離情報なので、
これを探索用のレイの幅で割れば回数が求められます
先にこの関数ローカルの変数として探索幅を決めておいて(値は20にしておきました)
探す距離を探索幅で割ってceil上方向に丸めます
あと、これがトラバース開始の限界であって、後ろ側もまとめて探索しちゃおうと思うので
プラスで3回くらい多く回しておきます

これも変数とかでパラメタ調整したほうがいいでしょう
この回数をラストのほうにつなぎます。
開始のほうは0でもいいですが、0は自分の真上で探す意味があまりないので1にしておきます
次がFor-loopの中の処理です

Sphere Trace by Channelをつなぎます。
マルチは1回の探索で複数回ヒットする可能性のあるタイプですが
今回は1つでいいのでマルチがついていないほうです
球体のレイを飛ばす位置を計算します
まずこのインデックスに探索幅をかけたものがその回の距離で、1回目は20、2回目は40と探索幅づつ増えていきます
これをアクターの進行方向の単位ベクトルとかけると、進行方向に向かって長さ20、40の向き情報付きのベクトルができます
そしていま計算された情報にアクターの位置ベクトルを足すと、アクターの現在位置から20、40前方の位置が計算できます
そして、さらにここからZ軸方向に400上に移動した位置を開始点とし、足す前の自分と同じ高さまで探索することにします
球体の直径は探索幅と同じにすることで、隙間なく探せます
これで探す処理は完成です
一旦動きを確認してみましょう

赤が探索で、緑がぶつかった箇所です。しっかりレッジを検出できていそうですね
その場ジャンプと走ってジャンプで、探索する距離が変わっていることもわかりますね
それでは最後の情報を返す処理です
返したい情報はもとのブロックの処理からコピペしてきましょう
ほしいのはこの前側の情報と、あと後ろ側の情報です


まずヒットしたときだけ処理をしたいのでブランチです。ここからぶつかった相手の情報を分解します
Breakなんちゃらででます
あとはここにさきほどコピってきたノードに情報を渡してあげればよいわけです

まずはシーケンスノードで処理を前用後ろ用の2段に分けます。
前側の処理は、始めてヒットしたときが手前側になるので、Do Once 1回しか動かないノード をつないで、つなぎます
これで1度書き込まれたら上書きされないので、初めて探索レイがぶつかった箇所が手前側のレッジとなります
このImpact Pointというのがぶつかった点の位置情報なので、前側のエッジはこの点そのままでよいです
もう一つのノーマルというのは進入方向です。
斜めにも進めるようにしたいため、進入方向=アクターの向きでよいのですが、ノーマルはぶつかる向きなのでアクターの向きを反転させる必要があります。
奥側はそのままつなぐだけです
あとは奥側の位置は、一番最後にヒットしたときのImpact Pointが欲しいのですが、
For-loopでぶつかるたびに新しい値に更新されていけば、
最終的には端っこの情報が取れるので普通につなげば問題ありません
(1回だけ処理するんじゃないので、こちらはDo Onceは要りません)
リターゲットキャラへの調整
リターゲットした玉ねぎちゃんでも確認しましょう

アニメーションをモノマネしているだけなのでほとんど問題はおきません
1人称のカメラや銃を手に持つところなど、調整が必要な部分は以前の記事で説明しているので
まだ見てないかたは是非ご覧ください
つづく
次回は未定ですが、ピストルからシャボン玉弾の発射か、敵キャラにパルクール動作させる方法あたりをやってみようかなと思っています
コメント