注意:タイトル画像のポーズはイメージです。ポーズやモーションは別途作る必要があります。
今回は前回の続きでジャンプがどのように実装されているかを知る。
前回まで作成したなんのアニメーションもついていないキャラを使って解説。
※以前から書いている通り実装方法を知るのが目的であり、アニメーションは実装しないので注意。
今回もUE5標準のBP_ThirdPersonCharacter
(新しいマネキン)に実装されているノードを参考にして作る。
実はこの実装をするノードはキー入力を含めてもたった3つ。
これをこのままCharacter
のブループリント内のイベントグラフに記述する。
Jump
ノードを呼び出せばジャンプする。
重力のような複雑な計算をする必要はなくこのノード1個を呼ぶだけでジャンプする。
デフォルトの場合はジャンプキーを長押ししても、すぐに離してもジャンプする高さは同一。
しかしJump Max Hold Time
に秒数を入力しておくとジャンプキーを押している間上昇し続ける
※設定した秒数以上は上昇しない
一番親になっているコンポーネント(Self)を選択し詳細タブにJump Max Hold Time
がある。
こちらはJump Max Hold Time
が0より大きいときのみ作用する。
Stop Jumping
が発動すると上昇中のキャラが上昇を停止して下降しはじめる。
Jump Max Hold Time=10
でジャンプする例スペースキー(デフォルトジャンプボタン)を押している間ジャンプし、離すと上昇が中断する。
じつは基本はこれだけ。
ジャンプに関する難しい演算なんかはCharacter
のBPを新規作成された時点で入っているCharacter Movement
コンポーネントが制御してくれる。
インプットアクションJump
はコントローラーの入力を取っている。
この赤ノードはプロジェクト設定のエンジン
> インプット
の中でキー設定されているもの。
キーは自由に追加/変更ができる。
上の設定だけだと、ボタン一発で一定の高さにジャンプする場合の高さ調整などができない。
どうしたらいいのだろうか。
実際はCharacter Movement
コンポーネントを選択した状態で詳細タブから細かいジャンプの設定ができる。
キャラクタームーブメント:跳躍/落下
のタブを使う。
ジャンプの高さ設定などは次の項で詳しく解説する。
記事が長いので上級と書いてあるものは読み飛ばして必要な設定だけ見れば良い。
この値を大きくするとより高くジャンプする。
恐らく最もよく触る値かと思う。
Jump Max Hold Time
は関係なくJump Z Velocity
を大きく設定すればジャンプキーをすぐに離しても大きく飛ぶようになる。
空中で移動キーを離した場合、移動がどれぐらい減衰するかを調整する。
例えば次はBraking Deceleration Falling = 0
(キーを離しても着地まで移動継続)
次はBraking Deceleration Falling = 1000
(キーを離すと移動がすぐに終了)
この値を1
に近づけるほど空中にいる間にも別方向へ移動が可能となる。
デフォルトの0.05
だと一度ジャンプしてしまうと空中で移動方向を変えることは出来ない(ほんの僅かには動く)
Air Control=1
(MAX)で、前ジャンプ中に後ろ方向へ切り替える例
つまり移動キーを空中で動かすことで、空中でも方向転換ができるようになる。
Air Control Boost Multiplier
とAir Control Boost Velocity Threshold
があるが...かなり上級者向け設定に思う。
ジャンプ中の横移動速度がVelocity Threshold
を下回った場合にAir Control
にAir Control Boost Multiplier
の値が乗算される(と思う)
要するに非常に遅い横移動でジャンプした時に、空中での方向転換がより効くように調整するものだと思われるがいつ使うのか私はわからない。
初心者はスルーでも良いと思う。
デフォルトの0
だと別のキャラの頭上などに着地したときに跳ね返されて変な方向に飛ぶ事がある。
この値を増やすと摩擦が増えて(?)別キャラの頭上に落ちた時もズリ落ちるような挙動に。
一方でこの値が高いと頭上ぴったりに落ちた時にボールのバウンドのような動きや、ガタガタと溝にハマったような動きになる可能性がある。
調整が難しいのでひとまず初心者はこちらもデフォルトで良い。
移動床などに乗っている時、コントローラーはニュートラルでもキャラ自体は何かしらの移動を行っている。
この状態でジャンプしたとき、この移動を受け継いだジャンプをするかどうかの設定(デフォルトでオン)
XYZがともにONで移動ボタンを押さずにジャンプだけ押すと次のようになる。
※紫の床は移動床
ぱっと見で何も起こってないような気がするが...次はXYZをOFF。
床から落ちてしまった。
つまりOFFで垂直にジャンプした場合床の移動をキャラクタが引き継がないので相対的に後ろに進んで床を降りてしまう
試してないが恐らくこちらは上と同等で「回転」を引き継ぐ設定。
その名の通りジャンプの頂点に達した時にイベントを発行するためのもの。
ただし、デフォルトでチェック不可。ノードを組んで実装する必要がある。
次がジャンプの頂点に達するとナイアガラエフェクトを発生させる実装例。
Jump
した直後にNotify Apex
をTrue
にする処理を入れて
On Reached Jump Apex
でイベントをバインドする(このイベントが発行する度Notify Apex
はFalse
になる。)
イベントのバインド(イベントディスパッチャの機能)という別で記事が必要な概念を含むため詳しく解説しない。
わかる人は使ってみてほしい。
※上級者設定なので知らなくても良い。
Advanced
となって折りたたまれているタブの中の設定の次を見ていく。
別のキャラクターの上に乗った時などにこの値が高いと吹き飛ばされる。
恐らくキャラクタの上にキャラクタが乗らないようにしたりするためのものだと思われる。
デフォルトの0.5
でもそこそこ跳ね返るが5
でテストすると次
キャラが上下に重なった時に吹き飛ばされるのが気になる場合はこれを0にする。
これが0
でも若干吹き飛ぶ場合は同時にFalling Lateral Friction
の効果が出ている可能性がある。
その場合はFalling Lateral Friction
の数値を大きくしてみよう。
上はJump Off Jump ZFactor=0
, Falling Lateral Friction=100
の例。
ズルズル~という感じで落ちる。
実はこの設定だけよくわかっていない。
次の英語フォーラムではフレームレートが突然落ちた時にジャンプの高さが変わってしまう不具合を解決できたとあるのでそういった場合に有効かもしれない。
Jump height and timers change based on framerate? Help. : unrealengine
Selfコンポーネントの詳細からJump Max Count
を増やしてやるとその分だけ多段ジャンプができる。
空中にいる間もこの回数まで更にジャンプで上に飛ぶことができる設定。
結局すべての設定項目を書いてしまったが、初心者はひとまずCharacter Movement
コンポーネント+Jump
ノードさえあればジャンプできるという事を覚えておきたい。
細かい設定の必要が出てきた時にまたこの記事を読んでもらえればと思う。