コヨーテタイム

課題

プラットフォームゲームのジャンプ操作に違和感があります。プレイヤーはコントロールが取りづらく、場合によっては足場に正しく飛び降りられないことがあります。

解決策

この問題を解決するには、「コヨーテタイム」と呼ばれるテクニックが有効です。これはプレイヤーにより高い操作感覚と、プラットフォームの端を移動するプロセスにおいて若干の「余裕時間」を提供します。また、プレイヤーがより自然にジャンプ操作を行えるようになります。

「コヨーテタイム」の仕組みは以下の通りです。

プレイヤーがプラットフォームの端から離れた場合、数フレームの間は依然として地面にいるかのようにジャンプできます。

そもそもなぜコヨーテ?

「コヨーテタイム」という名称は、地面を見下ろすまで落下しないカートゥーンキャラクターのコヨーテに由来しています。

alt alt

この機能を既存のプラットフォームキャラクターに追加してください。設定方法についてはプラットフォームキャラクターを参照してください。

タイミング処理に関しては、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キャラクターへの実装方法

この手順は3Dキャラクターにも同様の方法で適用できます。

プロジェクトのダウンロード

動く床 プロジェクト内のキャラクターにはコヨーテタイムが実装されています。

プロジェクトコードはこちらからダウンロードできます。 https://github.com/godotrecipes/2d_moving_platforms

関連レシピ