Camera & controls

Input / Jump Buffering

入力バッファ

直前の入力を短時間保存して実行可能時に発動する。

5 / 10

Interactive demo

Preparing the demo…

Input / Jump Buffering

Drag to orbit, Ctrl/⌘ + scroll to zoom. Use two fingers on touch screens.

This explanation is currently available in Japanese.

ひとことで

まだ実行できないタイミングで押されたボタンを短い間(0.1 秒前後)覚えておき、実行できるようになった瞬間に実行するしくみです。代表例はジャンプで、着地の少し前に押されたジャンプを覚えておき、着地したフレームで跳ばせます。これがないと、「押したのに跳ばなかった」という不満がすぐに出ます。

ゲームでの使いどころ

  • ジャンプ:着地の直前に押したジャンプを、着地と同時に実行する(ジャンプバッファ)。連続ジャンプが気持ちよくつながる。
  • 格闘ゲーム・アクションの攻撃:攻撃の終わりぎわに次の攻撃を押しておくと、硬直が解けた瞬間に出る(先行入力)。コンボがつながりやすくなる。
  • 回避・ダッシュ:被弾の硬直中に押した回避を、動けるようになった瞬間に実行する。
  • ネットワーク対戦:通信の遅れで少し早く届いた入力を、実行できる時刻まで保持する処理も同じ考え方。

しくみ

ボタンが押された時刻からの経過時間 tpresst_{\text{press}} を数えておきます。毎フレーム、

実行する  ⟺  tpress≤Tbuffer ∧ 実行できる状態\text{実行する} \iff t_{\text{press}} \le T_{\text{buffer}} \ \land\ \text{実行できる状態}

を調べ、実行したら tpress=∞t_{\text{press}} = \infty にして入力を消費します。押した瞬間に実行できなくても、TbufferT_{\text{buffer}} の間に実行できる状態(着地など)になれば、その瞬間に実行されます。

TbufferT_{\text{buffer}} はジャンプなら 0.1〜0.15 秒程度がよく使われます。長すぎると、ずっと前に押したボタンで意図しないジャンプが起き、かえって操作しにくくなります。

実装のポイント

  • 入力を必ず消費する:実行したあとに消し忘れると、同じ入力で 2 回跳んでしまいます。
  • 可変ジャンプとの関係:ボタンを離すと上昇を打ち切る作り(頂点付近の滞空調整)では、バッファで跳んだ瞬間にはボタンがもう離されていることがあります。その場合は低いジャンプにするか、押した時間を覚えておいて判断します。
  • コヨーテタイムと対に:コヨーテタイムは「遅すぎた入力」、入力バッファは「早すぎた入力」を救います。両方入れると、ジャンプの成否が遊ぶ人の感覚とほぼ一致します。
  • 行動ごとに別々のバッファ:ジャンプと攻撃を同じバッファにすると、あとから押したボタンで先の入力が上書きされます。行動ごとに覚えるか、順番に並べておきます(入力キュー)。

つまずきやすい点

  • フレーム数で数える:「6 フレーム」のようにフレームで数えると、フレームレートによって猶予の長さが変わります。秒で数えるか、固定タイムステップで判定します。
  • 入力を読むタイミング:入力を描画フレームで読み、ゲームの更新を固定タイムステップで行うと、1 回の押下が 0 回または 2 回として扱われることがあります。押された事実を次の更新まで保持します。
  • バッファが長すぎる:着地のずっと前に押したボタンで跳んでしまい、「跳ぶつもりがなかったのに跳んだ」という別の不満が生まれます。

デモで試すこと

  1. 小さな足場が並んでいて、着地したらすぐに跳ばないと足場の端から落ちます。プレイヤーは着地の 80 ms 前にジャンプを押します。
  2. 既定の「入力バッファ 120 ms」では、覚えておいた入力で着地と同時に跳び、「着地と同時に跳べた」が増え続けます。右下の図で、黄色の線(押した瞬間)から始まる青い帯(覚えている時間)の中に、赤い線(着地)が入っていることを確かめてください。
  3. 「入力バッファ」を 0 にすると、押した瞬間はまだ空中なので入力が捨てられ、着地しても跳ばずに足場から落ちます。
  4. 「着地より早く押す時間」をバッファより長くすると、バッファがあっても間に合わなくなります。

References

Unity Cinemachine Position Composer ↗

A general reference for this subcategory.