コヨーテタイムとジャンプバッファ:良いジャンプの 12 行
プレイヤーが「ジャンプの感触が悪い」と言うとき、たいていは 2 つの機能が欠けています。どちらも 30 分で書けます。
問題はどう現れるか
プラットフォーマーのプロトタイプを試した人は全員同じことを言います。「ジャンプが変」。何が悪いのかを正確に言える人はいません。コードは正しいのです。接地していればジャンプ、していなければジャンプしない。
問題はコードではなく人間の側にあります。プレイヤーは足場から外れたと気づいた瞬間にボタンを押しますが、そのときにはもう遅い。そして空中でジャンプを押したときは、着地した瞬間に跳んでほしいと期待しています。
2 つの小さな猶予
コヨーテタイムは、キャラクターが接地を離れた後もわずかの間ジャンプ権を残します。名前は、崖から飛び出して一瞬空中に留まるアニメのコヨーテに由来します。
ジャンプバッファは逆方向に働きます。着地の直前に押された入力を記憶しておき、接地した瞬間に適用するのです。
値はどう決めるか
私が計測したプロジェクトでは、どちらの猶予も 100〜150 ms がよく機能します。60 FPS なら 6〜9 フレームです。短すぎれば効果が感じられず、長すぎると空中から跳んでいるように見えます。
これらの値をコードに直接書かないでください。ScriptableObject かデータテーブルに置き、デザイナーがゲームを起動せずに変更できるようにします。
どこまで応用できるか
同じ考え方は他のあらゆる場面で効きます。攻撃入力のバッファリング、二段ジャンプの猶予、ぶら下がりの掴み判定、さらにはメニュー遷移中のキュー処理まで。
原則はこうです。プレイヤーの意図とゲームのルールが衝突したら、プレイヤー側に有利な判定を下す。それをしているゲームが「反応が良い」と呼ばれます。