level-design について
ゲームデザイナーや開発者向けの、エンジン非依存のレベルデザインスキルです。プレイヤーの移動性能から地形寸法を決め、ブロックアウト、テスト、反復を経てから装飾します。
主な機能
- 01移動性能に基づく寸法設計
- 02主要ルート、分岐、ゲートの計画
- 03ペース、遭遇、メカニクス導入の設計
- 04ブロックアウトとテストの反復
活用シーン
- 01主要ルートと任意ルートの計画
- 02ジャンプ距離や到達可能性の確認
- 03アート制作前のペース検証
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ gamedev-skills/ awesome-gamedev-agent-skills --skill level-designインストール後、Claude Code で/level-designを入力して読み込まれたか確認します。
同梱ファイルreferences/pacing-and-flow.md
詳細
レベルデザイン
レベルとは、空間を通じて届ける意図的な体験の連なりです。
優れたレベルデザインはプロセスです。まず移動の基準となる指標を定め、プリミティブでジオメトリをブロックアウトし、プレイしてから装飾を施します。逆の順序にはしません。このスキルはエンジンに依存しない実践方法です。2D グリッドや 3D のグリッドマップを配置するには、godot-tilemap/unity-tilemap-2d を使ってください。
使用する場面
- レベルの構成、つまりクリティカルパス、ペース配分、ゲーティング、遭遇、プレイヤーが学ぶ場面と試される場面を計画するときに使います。
- ブロックアウト → テスト → 反復 → 装飾のワークフローで、アートがなくても楽しくプレイできるレベルを作るときに使います。
- キャラクターの移動からレベルの指標を導き出し、ジオメトリを到達可能で公平なものにするときに使います。
**使用しない場面:**レベルをアルゴリズムで生成するには、procedural-gen を使ってください(オーサリングによるデザインとプロシージャルデザインは相補的です)。エンジンのタイル/グリッドペイントツールには、godot-tilemap/unity-tilemap-2d を使ってください。指標の基準となる移動アビリティには、エンジンの移動スキルと input-systems を使います。
基本のワークフロー
- **まず指標を導き出します。**キャラクターを測定します。最大ジャンプの高さと距離、走る速度、リーチ、カメラの範囲を確認します。すべての隙間、足場、通路のサイズはこれらの単位に基づいて決めます。ジオメトリを作る前に値を確定します。
- **ブロックアウト(ホワイトボックス/グレーボックス)。**テクスチャのないプリミティブを使い、正しい縮尺でレベル全体を作ります。変更が容易なうちに、流れ、見通し、到達可能性を検証します。まだアートは加えません。
- クリティカルパス(開始地点 → 目標地点)と、ほとんどのプレイヤーが通ると想定するゴールデンパスを定義します。そこから任意のルートや秘密のルートを分岐させます。
- **体験のペースを調整します。**緊張と休息を意図的な曲線で交互に配置します。戦闘の連続にはしません。プレイヤーが一息つき、先を予測できる余地を与えます。
- **教えてから試します。**各メカニクスを安全な場所で導入し、プレイヤーに練習させてから、プレッシャーのかかる状況で試します。難易度は直線的ではなく、鋸歯状に上げていきます。
- **意図を持ってゲートを設けます。**ロックとキー、アビリティ、一方通行の落下を使って順序とペースを制御します。壁ではなく、光、線、ランドマークで誘導します。
- **プレイテストして反復します。**実際のプレイヤーを観察します。どこで迷い、行き詰まり、退屈し、不公平に倒されるでしょうか?ブロックアウトを修正し、楽しくプレイできるようになってから装飾します。
パターン
1. プレイヤーの指標があらゆる寸法を決める
# Measure the character ONCE, then size geometry in these units. If the jump
# changes, gaps must be re-derived — never eyeball reachability.
const RUN_SPEED := 240.0 # px/s (or m/s in 3D)
const MAX_JUMP_H := 96.0 # peak height of a full jump
const MAX_JUMP_DIST := 200.0 # horizontal distance of a running jump
const SAFE_GAP := MAX_JUMP_DIST * 0.7 # comfortable, not pixel-perfect
const HARD_GAP := MAX_JUMP_DIST * 0.95 # a deliberate skill check
# Build platforms so required jumps use SAFE_GAP; reserve HARD_GAP for optional reward.
正確な指標を使えば、到達可能なレベルが実現できます。MAX_JUMP_DIST + 1 離れた足場には届きませんが、SAFE_GAP にある足場なら公平です。デザイナーとコードの認識を一致させるため、こうした定数はレベルデータのそばに置いてください。
2. 遭遇/ペース配分をデータとして表す(緊張のタイムライン)
# Author the level as a sequence of beats with an intended intensity (0..1).
# This makes the pacing curve explicit and reviewable before you build rooms.
const BEATS := [
{ "room": "entry", "type": "teach", "intensity": 0.1 },
{ "room": "hall_1", "type": "combat", "intensity": 0.5 },
{ "room": "vista", "type": "rest", "intensity": 0.1 }, # breather + reward
{ "room": "gauntlet", "type": "combat", "intensity": 0.8 },
{ "room": "save_room", "type": "rest", "intensity": 0.2 }, # before the boss
{ "room": "boss", "type": "climax", "intensity": 1.0 },
]
# Read the intensity column top-to-bottom: it should rise overall but dip for rests
# (a sawtooth), never flatline high. Drive spawns/music intensity from this.
3. ゲーティングとクリティカルパス(小さなグラフ)
# Model the level as rooms + gated connections. Validate that the goal is
# reachable with the keys/abilities the player can actually obtain in order.
const ROOMS := {
"entry": { "exits": [ { "to": "hall_1" } ] },
"hall_1": { "exits": [ { "to": "vista", "needs": "double_jump" },
{ "to": "side_room" } ] }, # optional branch
"side_room": { "exits": [ { "to": "hall_1" } ], "grants": "double_jump" },
"vista": { "exits": [ { "to": "boss", "needs": "red_key" } ] },
}
# Validation (do this!): from "entry", can the player reach "boss" given that
# "double_jump" is granted in "side_room" before "vista" requires it? A flood
# fill that only traverses an exit when its `needs` is already satisfiable
# proves the critical path isn't soft-locked.
落とし穴
- **プレイできるようになる前に装飾する。**検証していないブロックアウトを細部まで作り込むと、レイアウトの変更で最もコストのかかる作業が無駄になります。まずグレーボックスを作ってテストします。
- **指標を無視したジオメトリ:**ジャンプで越えられない隙間、リーチの届かない足場、カメラに必要な幅より狭い通路などです。すべてプレイヤーの単位でサイズを決めます。
- **単調なペース配分。**絶え間ない戦闘(または絶え間ない静けさ)はプレイヤーを鈍らせます。緊張と休息を交互に配置し、クライマックスの前には一息つける場面とセーブ地点を用意します。
- **教える前にメカニクスを試す。**プレイヤーが危険な場所で初めてハザードに遭遇します。安全に導入し、練習させてから試します。
- **ソフトロックと行き止まり。**ゲートの先でしか入手できないアビリティやキーを要求してはいけません。接続性だけでなく、クリティカルパス上でキーやアビリティを入手する順序も検証します。
- **視認性や誘導がない。**視線を引きつけるものがなければ、プレイヤーは迷います。光、誘導線、色、ランドマークを使って進むべき道を示します。
- 目印のない一方通行の落下は、プレイヤーを立ち往生させたり、不意を突いたりします。後戻りできない行動は事前に示します。
- **プロシージャル生成とオーサリングを混同する。**生成によって得られるのは多様性であり、オーサリングによるペース配分ではありません。多様性には
procedural-genを使い、意図を持たせるには手作業でオーサリングします。
参考資料
references/pacing-and-flow.md— 難易度と緊張感のカーブを詳しく解説します。指導ループの設計(導入→展開→ひねり→テスト)、読みやすさとガイダンスの手法、2D と 3D のレイアウトに関する考慮事項、ブロックアウトのレビューチェックリストを扱います。
関連スキル
godot-tilemap、unity-tilemap-2d— 2D レベルのグリッドをペイントします。3D ではグリッドマップを使用します。procedural-gen— 制作者が構成した構造を補完する多様性を生成します。game-ai— 構築した空間を移動する敵と遭遇します。platformer、puzzle、roguelike— このスキルを組み合わせるジャンルです。
コメント
Markdown 対応