UE4のBluePrintで壁蹴りを実装してみましょう。
不思議なことに、日本語でUE4の「壁蹴り」「壁ジャンプ」と調べても出てこなかったので書きました。
壁蹴りの仕組みは自分が自作しているゲーム、ユニティちゃん&グレイちゃんの次回体験版バージョンの基本機能として入れているものを、そのまま載せています。
実装にあたり、以下のフォーラムを参考にしています。
[Blueprint] Wall Jump fail
※「UE4 Wall Kick」と検索すれば他のも出てきます。
前提条件
今回記載する壁蹴りのシステムは、「3d」のSide Scroller Templateを使用しています。
ロジックはBluePrintのみです。
今回はTraceを利用する方法で壁検出を実装します。
→Traceが重くてイヤ、という人は壁にオーバーラップ用のコリジョンを張り付けて判定する等、いろんな方法があるので調べてみてください。
壁蹴りの処理の流れ
今回実装した壁蹴りの処理は大まかに以下の通りです。
1.空中でジャンプのボタンを押す
2.キャラの少し上方向に半径50のSphereTraceを実行
3.WorldStatic、もしくはWorldDynamicがTraceで検出されたら、Launch Characterノードを実行
##①SphereTraceForOBjectでの壁検出
まず、壁判定用の関数を作成します。
SideScrollerCharacterという名前のBluePrintクラス(またはCharacterを継承したクラス)を開き、以下の画像のように関数を作成します。
処理の流れとして、GetActorUpVectoerに100をかけた位置に、半径(Redius)50のSpherTraceForObjectsを実行して、WorldStatic、WorldDynamicを検出するという内容になっています。
操作キャラクターよりも若干高い位置にすることで、地面のWorldStatic、WorldDynamicを検出するのを防いでいます。
SpherTraceForObjectsのDrawDebugTypeにFor Durationが選択されていますが、これはデバッグのためにTraceを画面に表示させているだけです。
デバッグ以外で画面に表示させる必要性はないので、リリースするときは必ず以下の通りDrawDebugTypeをNoneに指定してください。
これで壁検出ができました。
##②壁蹴り(壁ジャンプ)用の関数を作成
CharacterMovementにあるisFallingでキャラクターが空中にいるか否かが取れます。
もし、地上にいる場合は、CharacterのJump関数でキャラクターにジャンプさせます。
空中にいる場合は、①で作成した関数(画像の場合、純粋関数となっている「Detect Wall」の部分)を呼び出して壁があるか判定し、もし壁があった場合はLaunch Characterを呼び出して斜め上の方向にキャラクターを若干飛ばしています。
※Launch Characterの詳細は公式ドキュメントを見てください。
##③Jumpのインプットアクションイベントに、②で作成した関数を呼び出す。
以下のように、Jumpのインプットアクションに②で作成したジャンプの関数を呼び出します。
これで壁蹴りが実装出来ました。
この状態で壁の近く、かつ空中に居るときにジャンプボタンを押すと、以下のGifのように斜め上方向に壁蹴り(壁ジャンプ)すると思います。
#まとめ
というわけで、方法さえわかれば割と簡単に、かつ汎用的に使える壁蹴りの仕組みが出来ました。
壁蹴り、壁ジャンプをUE4で実装したいという人は参考にしてください。