platformer について
2D プラットフォームゲーム開発向けの組み合わせ型スキルです。ジャンプの感触、レベル構成、危険要素、目標を扱い、移動・タイルマップ・デザインの各スキルの組み合わせ方を示します。
主な機能
- 01走行・ジャンプコントローラーの設計
- 02ジャンプのタイミングと高さの調整
- 03一方向プラットフォームとコリジョンの設計
- 04危険要素、チェックポイント、目標の構成
- 05カメラ追従とフィードバックの計画
活用シーン
- 01横スクロールまたは単画面の制作
- 02ジャンプの応答性や感触の改善
- 03レベル内の危険要素とチェックポイントの設計
- 04エンジンの移動スキルとタイルマップスキルの組み合わせ
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ gamedev-skills/ awesome-gamedev-agent-skills --skill platformerインストール後、Claude Code で/platformerを入力して読み込まれたか確認します。
同梱ファイルreferences/feel-tuning.md
詳細
プラットフォーマー
2D プラットフォーマー向けのプレイブックです。走る/ジャンプする操作の「感触」、レベル構造、危険物、ゴールを扱います。これはコンポジション型のスキルです。エンジンの移動スキル、タイルマップスキル、デザインスキルを組み合わせて、実際に遊べるゲームを作ります。物理やタイルマップを改めて教えるものではなく、何を作るか、ジャンプの感触をどうよくするかを説明します。
使用する場面
- 横スクロール型またはシングル画面のプラットフォーマー、「マリオ風」/「Celeste風」、あるいは地面から地面へジャンプすることがゲームの中心的な動作となるゲームを作るときに使用します。
- ジャンプが浮遊感のあるもの、反応が鈍いもの、または「不公平」に感じられるもので、操作感の改善(コヨーテタイム、ジャンプバッファー、ジャンプの高さの可変化、角の補正)が必要なときに使用します。
使用しない場面: 重力のないトップダウン移動には、エンジンの移動スキルを直接使用してください。3D の一人称視点での移動には fps-shooter を使用します。グリッド移動/ターン制移動には roguelike を使用します。キネマティックボディ API を直接扱う場合は、godot-2d-movement(または使用するエンジンのコントローラースキル)を使用してください。
コアループ
穴や危険物を確認する → ジャンプするか移動するかを決める → 安全に着地する(または死ぬ) → 次のチェックポイント/ゴールに到達する。 プラットフォーマーの成否は、何千回も繰り返される一度一度のジャンプの瞬間ごとの感触で決まります。まずコントローラーを調整してください。それ以外はすべてコンテンツです。
必須システム
- 走行/ジャンプコントローラー — 水平方向の加速/減速、重力、ジャンプ、および以下の操作感を高める機能。
- 通常の衝突+一方向衝突 — 地面、壁、「下からすり抜けられる」プラットフォーム。
- レベルのジオメトリ — タイルマップまたは手作業で配置したコライダー。プレイ可能な空間です。
- 危険物+死亡/リスポーン — トゲ、穴、敵。最後のチェックポイントから再開します。
- チェックポイント/レベルのゴール — 進行を示す目印と勝利条件(旗、ドア、出口)。
- カメラ — デッドゾーンと先読みを使ってプレイヤーを追従し、レベルの境界内に収めます。
- 演出 — 着地時の土煙、スクワッシュ&ストレッチ、ヒットストップ、サウンド。低コストで、感触を大きく向上させます。
デザイン調整項目(ジャンプの感触を整える)
生の数値ではなく、結果(タイル単位の高さ、頂点に達するまでの秒数)を基準に調整してください。
| 調整項目 | 効果 | 妥当な初期値 |
|---|---|---|
| 最大ジャンプ高 | 届く高さ | 3–4 タイル |
| 頂点に達するまでの時間 | 「重さ」/キレ | 0.30–0.40 s |
| 落下時の重力倍率 | キレのある、浮遊感のない落下 | 上昇時の重力の 1.5–2.0× |
| コヨーテタイム | 足場を離れた直後のジャンプ | 0.08–0.12 s(60 fps で約 5–7 フレーム) |
| ジャンプバッファー | 着地直前に押してもジャンプできる猶予時間 | 0.10–0.15 s |
| ジャンプ高さの可変化 | タップ=小ジャンプ、長押し=最大ジャンプ | ボタンを離したとき、上昇速度を ×0.4–0.5 にする |
| 頂点での滞空 | 空中制御のため、頂点で短く浮遊させる | ` |
| 地上での加速/摩擦 | 反応性と滑りやすさの調整 | 0.05–0.1 s で最高速度に達する |
| 角の補正 | 1–2 px だけ引っかかった足場の端を乗り越える補正 | 横方向に最大約 4 px 移動させる |
推測に頼らず、操作感の値から重力とジャンプ速度を算出してください。パターン 1 を参照してください。
パターン
1. 高さ+時間からジャンプ物理を算出する(適当な数値を使わない)
# Pseudocode. Pick the FEEL you want, then derive the physics. y-axis points DOWN.
# From kinematics: h = (g * t^2) / 2 and v0 = g * t.
JUMP_HEIGHT = 3.5 * TILE # how high, in world units
TIME_TO_APEX = 0.35 # seconds to reach the top
gravity = (2 * JUMP_HEIGHT) / (TIME_TO_APEX ** 2) # rising gravity
jump_velocity = -(2 * JUMP_HEIGHT) / TIME_TO_APEX # negative = upward
fall_gravity = gravity * 1.8 # heavier on the way down → less floaty
2. コヨーテタイム+ジャンプバッファー+高さの可変化(操作感の中核)
# Pseudocode in the per-frame update. dt = seconds since last frame.
# Timers count DOWN; refresh coyote while grounded, buffer on a fresh press.
if on_floor:
coyote_timer = COYOTE_TIME # 0.1
if jump_pressed_this_frame:
buffer_timer = JUMP_BUFFER # 0.12
coyote_timer -= dt
buffer_timer -= dt
# A jump is allowed if we pressed recently AND were grounded recently.
if buffer_timer > 0 and coyote_timer > 0:
velocity.y = jump_velocity
buffer_timer = 0
coyote_timer = 0 # consume both so we can't double-jump
# Variable height: releasing jump early while still rising cuts the arc short.
if jump_released_this_frame and velocity.y < 0:
velocity.y *= 0.45
# Asymmetric gravity: snappier fall than rise.
g = fall_gravity if velocity.y > 0 else gravity
velocity.y += g * dt
3. 一方向プラットフォーム
上からは乗ることができ、下からはすり抜けられます。ほとんどのエンジンでは、タイル/コライダーに「一方向衝突」フラグが用意されています。有効にし、プレイヤーが下+ジャンプを押したときに数フレームだけ衝突を無効にして、プレイヤーが下にすり抜けられるようにします。衝突判定の計算を再実装しないでください。
つまずきやすい点/失敗例
- フレームごとの移動を
dtでスケーリングしない → フレームレートによって速度が変わります。速度の積分とタイマーには必ずdtを使用してください。(physics-tuningを参照。) - ジャンプがふわふわする → 重力が上昇時と下降時で同じです。上昇時よりも下降時の重力を強くしてください。
- 「ジャンプ入力が認識されなかった」 → 入力バッファリングがありません。着地前の約 0.1 秒間、ジャンプ入力をバッファリングしてください。
- 「足場から落ちて、ジャンプできなかった」 → コヨーテタイムがありません。地面を離れてから約 0.1 秒間はジャンプできるようにしてください。
- 壁に張り付く/タイルの継ぎ目に引っかかる → タイルごとのコライダーではなく、単一のカプセル/ボックスコライダーを使用し、コーナー補正を追加してください。
- 高速移動時に床をすり抜ける → 高速で動く剛体では、連続衝突検出を有効にするか、固定タイムステップを小さくしてください(
physics-tuningを参照。) - カメラが急に動いて、吐き気を引き起こす → 追従をスムーズにする/補間する、デッドゾーンを追加する、範囲内に制限する、といった対策をしてください。
- 教え方が悪く、難易度の壁ができる → 複数のメカニクスを組み合わせる前に、エリアごとに 1 つのメカニクスを導入してください。
構成(これらのスキルを組み合わせて構築)
- コントローラーのボディ:
godot-2d-movement(Godot のCharacterBody2D)。ほかのエンジンでは、エンジンのコア機能と物理スキル(unity-physics、phaser-arcade-physics、pygame-core)を使用してください。 - レベル: 地形には
godot-tilemap/unity-tilemap-2d、レイアウト、ペーシング、教える順序にはlevel-designを使用してください。 - 操作感/物理: タイムステップ、CCD、安定性には
physics-tuningを使用してください。 - 入力: バッファリング、キーの再割り当て、ゲームパッド対応には
input-systemsを使用してください。 - 仕上げ: 効果音/音楽には
audio-design、スクワッシュ&ストレッチにはエンジンのアニメーションスキルを使用してください。 - 開発プロセス: コンテンツを作成する前にコントローラーをグレーボックス化するには、
prototype-fastを使用してください。
参考資料
- ジャンプ計算の導出、操作感を調整するための完全な表、コーナー補正、移動する足場/一方通行の足場、カメラ追従については、
references/feel-tuning.mdをお読みください。