2022-04-26

【キャラを作ろう#3】ジャンプの実装【UE5】

キャラクターBPのジャンプを実装する。実はとても簡単。※タイトルのポーズはイメージです

Article Image

注意:タイトル画像のポーズはイメージです。ポーズやモーションは別途作る必要があります。

ジャンプの実装

今回は前回の続きでジャンプがどのように実装されているかを知る。

前回まで作成したなんのアニメーションもついていないキャラを使って解説。

※以前から書いている通り実装方法を知るのが目的であり、アニメーションは実装しないので注意。

今回もUE5標準のBP_ThirdPersonCharacter(新しいマネキン)に実装されているノードを参考にして作る。

新しいマネキン

読者レベル

  • ブループリントとコンポーネントの概念がわかっていればOK
  • このシリーズのバックナンバーは読んでいなくても分かる範囲で解説

ノードが超絶シンプル

実はこの実装をするノードはキー入力を含めてもたった3つ。

たった3つ

これをこのままCharacterのブループリント内のイベントグラフに記述する。

Jumpノード

Jumpノードを呼び出せばジャンプする。

重力のような複雑な計算をする必要はなくこのノード1個を呼ぶだけでジャンプする。

Jump Max Hold Time

デフォルトの場合はジャンプキーを長押ししても、すぐに離してもジャンプする高さは同一。

しかしJump Max Hold Timeに秒数を入力しておくとジャンプキーを押している間上昇し続ける

※設定した秒数以上は上昇しない

設定方法

一番親になっているコンポーネント(Self)を選択し詳細タブにJump Max Hold Timeがある。

self

Jump Max Hold Time

Stop Jumpingノード

こちらはJump Max Hold Time0より大きいときのみ作用する。

Stop Jumpingが発動すると上昇中のキャラが上昇を停止して下降しはじめる。

Jump Max Hold Time=10でジャンプする例

スペースキー(デフォルトジャンプボタン)を押している間ジャンプし、離すと上昇が中断する。

以上

じつは基本はこれだけ。

ジャンプに関する難しい演算なんかはCharacterのBPを新規作成された時点で入っているCharacter Movementコンポーネントが制御してくれる。

Character Movement

補足:インプットアクションって何

インプットアクションJump

インプットアクションJumpはコントローラーの入力を取っている。

この赤ノードはプロジェクト設定のエンジン > インプットの中でキー設定されているもの。

キーは自由に追加/変更ができる。

ジャンプする高さとかどうするの?

上の設定だけだと、ボタン一発で一定の高さにジャンプする場合の高さ調整などができない。

どうしたらいいのだろうか。

実際はCharacter Movementコンポーネントを選択した状態で詳細タブから細かいジャンプの設定ができる。

ジャンプの設定

キャラクタームーブメント:跳躍/落下のタブを使う。

ジャンプの高さ設定などは次の項で詳しく解説する。

詳細設定(必要なとこだけ読む)

記事が長いので上級と書いてあるものは読み飛ばして必要な設定だけ見れば良い。

Jump Z Velocity

この値を大きくするとより高くジャンプする。

恐らく最もよく触る値かと思う。

Jump Max Hold Timeは関係なくJump Z Velocityを大きく設定すればジャンプキーをすぐに離しても大きく飛ぶようになる。

Braking Deceleration Falling

空中で移動キーを離した場合、移動がどれぐらい減衰するかを調整する。

例えば次はBraking Deceleration Falling = 0(キーを離しても着地まで移動継続)

次はBraking Deceleration Falling = 1000(キーを離すと移動がすぐに終了)

Air Control

この値を1に近づけるほど空中にいる間にも別方向へ移動が可能となる。

デフォルトの0.05だと一度ジャンプしてしまうと空中で移動方向を変えることは出来ない(ほんの僅かには動く)

Air Control=1(MAX)で、前ジャンプ中に後ろ方向へ切り替える例

つまり移動キーを空中で動かすことで、空中でも方向転換ができるようになる。

上級:Air Control Boost ~~

Air Control Boost MultiplierAir Control Boost Velocity Thresholdがあるが...かなり上級者向け設定に思う。

ジャンプ中の横移動速度がVelocity Thresholdを下回った場合にAir ControlAir Control Boost Multiplierの値が乗算される(と思う)

要するに非常に遅い横移動でジャンプした時に、空中での方向転換がより効くように調整するものだと思われるがいつ使うのか私はわからない。

初心者はスルーでも良いと思う。

上級:Falling Lateral Friction

デフォルトの0だと別のキャラの頭上などに着地したときに跳ね返されて変な方向に飛ぶ事がある。

この値を増やすと摩擦が増えて(?)別キャラの頭上に落ちた時もズリ落ちるような挙動に。

一方でこの値が高いと頭上ぴったりに落ちた時にボールのバウンドのような動きや、ガタガタと溝にハマったような動きになる可能性がある。

調整が難しいのでひとまず初心者はこちらもデフォルトで良い。

Impart Base Velocity (X, Y, Z)

移動床などに乗っている時、コントローラーはニュートラルでもキャラ自体は何かしらの移動を行っている。

この状態でジャンプしたとき、この移動を受け継いだジャンプをするかどうかの設定(デフォルトでオン)

XYZがともにONで移動ボタンを押さずにジャンプだけ押すと次のようになる。

※紫の床は移動床

ぱっと見で何も起こってないような気がするが...次はXYZをOFF

床から落ちてしまった。

つまりOFFで垂直にジャンプした場合床の移動をキャラクタが引き継がないので相対的に後ろに進んで床を降りてしまう

Impart Base Angular Velocity

試してないが恐らくこちらは上と同等で「回転」を引き継ぐ設定。

上級:Notify Apex

その名の通りジャンプの頂点に達した時にイベントを発行するためのもの

ただし、デフォルトでチェック不可。ノードを組んで実装する必要がある。

次がジャンプの頂点に達するとナイアガラエフェクトを発生させる実装例。

ジャンプの頂点を取得

Jumpした直後にNotify ApexTrueにする処理を入れて

On Reached Jump Apexでイベントをバインドする(このイベントが発行する度Notify ApexFalseになる。)

イベントのバインド(イベントディスパッチャの機能)という別で記事が必要な概念を含むため詳しく解説しない。

わかる人は使ってみてほしい。

Advanced(読み飛ばしOK)

※上級者設定なので知らなくても良い。

Advancedとなって折りたたまれているタブの中の設定の次を見ていく。

Advanced

Jump Off Jump ZFactor

別のキャラクターの上に乗った時などにこの値が高いと吹き飛ばされる。

恐らくキャラクタの上にキャラクタが乗らないようにしたりするためのものだと思われる。

デフォルトの0.5でもそこそこ跳ね返るが5でテストすると次

キャラが上下に重なった時に吹き飛ばされるのが気になる場合はこれを0にする

これが0でも若干吹き飛ぶ場合は同時にFalling Lateral Frictionの効果が出ている可能性がある。

その場合はFalling Lateral Frictionの数値を大きくしてみよう。

上はJump Off Jump ZFactor=0, Falling Lateral Friction=100の例。

ズルズル~という感じで落ちる。

Apply Gravity While Jumping

実はこの設定だけよくわかっていない。

次の英語フォーラムではフレームレートが突然落ちた時にジャンプの高さが変わってしまう不具合を解決できたとあるのでそういった場合に有効かもしれない。

Jump height and timers change based on framerate? Help. : unrealengine

おまけ:多段ジャンプ

Selfコンポーネントの詳細からJump Max Countを増やしてやるとその分だけ多段ジャンプができる。

Jump Max Count

空中にいる間もこの回数まで更にジャンプで上に飛ぶことができる設定。

さいごに

結局すべての設定項目を書いてしまったが、初心者はひとまずCharacter Movementコンポーネント+Jumpノードさえあればジャンプできるという事を覚えておきたい。

細かい設定の必要が出てきた時にまたこの記事を読んでもらえればと思う。




謎の技術研究部 (謎技研)