コヨーテタイム
課題
プラットフォームゲームのジャンプ操作に違和感があります。プレイヤーはコントロールが取りづらく、場合によっては足場に正しく飛び降りられないことがあります。
解決策
この問題を解決するには、「コヨーテタイム」と呼ばれるテクニックが有効です。これはプレイヤーにより高い操作感覚と、プラットフォームの端を移動するプロセスにおいて若干の「余裕時間」を提供します。また、プレイヤーがより自然にジャンプ操作を行えるようになります。
「コヨーテタイム」の仕組みは以下の通りです。
プレイヤーがプラットフォームの端から離れた場合、数フレームの間は依然として地面にいるかのようにジャンプできます。
この機能を既存のプラットフォームキャラクターに追加してください。設定方法についてはプラットフォームキャラクターを参照してください。
タイミング処理に関しては、CoyoteTimerという名前のTimerノードを追加し、設定をOne Shotにします。
コヨーテタイム管理に必要な新しい変数を用意しましょう。
var coyote_frames = 6 # How many in-air frames to allow jumping
var coyote = false # Track whether we're in coyote time or not
var last_floor = false # Last frame's on-floor state
フレーム単位で時間を設定しているため、_ready()内でTimerの長さを設定する際にも次のように変換できます。
$CoyoteTimer.wait_time = coyote_frames / 60.0
各フレームで現在の is_on_floor() 値を保存し、次のフレームで使用するようにします。したがって、move_and_slide() の後に _physics_process() 内に以下を設定します。
last_floor = is_on_floor()
ジャンプ入力を検知した場合、キャラクターが床にいる状態か、またはコヨーテ時間モードかどうかを確認します。
if Input.is_action_just_pressed("jump") and (is_on_floor() or coyote):
velocity.y = jump_speed
jumping = true
コヨーテ状態への移行は、プレイヤーがプラットフォームの端から降りた瞬間に開始されます。これは、前回のフレームでは床の上にいたが、現在は床から離れた位置にいるということです。この条件を確認した上で、ちょうど地面から離れた時にタイマーを起動します。
if !is_on_floor() and last_floor and !jumping:
coyote = true
$CoyoteTimer.start()
CoyoteTimerは以下のタイミングでコヨーテ状態の終了を通知します。
func _on_coyote_timer_timeout():
coyote = false
この手順は3Dキャラクターにも同様の方法で適用できます。
プロジェクトのダウンロード
動く床 プロジェクト内のキャラクターにはコヨーテタイムが実装されています。
プロジェクトコードはこちらからダウンロードできます。 https://github.com/godotrecipes/2d_moving_platforms