godot-genre-tower-defense について
Godotでタワーディフェンスゲームを開発するためのスキルで、ウェーブ進行、タワーの挙動、ターゲット選択、経路検証、パフォーマンス手法を扱います。固定レーン型と迷路型のレベル向けに、スクリプトと設計指針を備えています。
主な機能
- 01Resourceベースの敵ウェーブ
- 02タワーのステートマシンと攻撃処理
- 03優先度に基づく敵ターゲット選択
- 04タワー配置時の経路検証
- 05プールとPhysicsServerを使う弾の処理パターン
活用シーン
- 01設定可能な敵ウェーブの作成
- 02順序や残り距離、体力によるターゲット選択
- 03敵の経路を塞ぐ配置の防止
- 04弾数の多いステージの最適化
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ thedivergentai/ game-dev-agentic-skills --skill godot-genre-tower-defenseインストール後、Claude Code で/godot-genre-tower-defenseを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/architecture-overview.mdcommon-pitfalls-extended.mdelite-technical-patterns.mdgodot-tips.mdkey-mechanics.mdmigration-notes.mdscripts/burst_search_tower.gdgrid_path_validator.gdhoming_projectile_3d.gdorganic_enemy_movement.gdtower_defense_patterns.gdtower_targeting_system.gdtower.gdwave_manager.gdwave_resource_spawner.gd詳細
基本ループ
- 準備:所持通貨でタワーを建設/アップグレードします
- ウェーブ:敵が出現し、ゴールに向かって経路を進みます
- 防衛:タワーが自動で敵を狙い、ダメージを与えます
- 報酬:敵を倒すと通貨を獲得できます
- 難易度上昇:ウェーブが進むにつれて難易度や複雑さが増します
絶対に避けるべきこと(エキスパート向けのアンチパターン)
設計と戦略
- すべてのタワーを同じ役割にしてはいけません。オーラによるスロー、装甲貫通、対空、バーストスナイパー、範囲ダメージの各特性を必ず明確に分けてください。
- 逃げ道のない「デススパイラル」を発生させてはいけません。序盤に避けられない敗北を防ぐため、少額のカムバックボーナスや、貯めたゴールドへの利息を必ず用意してください。
- 序盤のウェーブを単なる作業に感じさせてはいけません。待ち時間をスキップしてゲームへの参加を促進する**「早期呼び出し」ボーナス**を必ず用意してください。
- クライアント側の経済更新を信用してはいけません。協力プレイでは、通貨の加算とタワーの購入を権威サーバーが検証するよう必ず実装してください。
経路探索と配置
- 迷路型ゲームでプレイヤーが出口を「封鎖」できるようにしてはいけません。タワーの配置を確定する前に、必ず**
NavigationServer2D.map_get_path()**で経路の存在を検証してください。 - 迷路型ゲームで同期的な
bake_navigation_polygon()を使ってはいけません。配置中に100ms以上のフレーム停止が発生するのを防ぐため、必ずワーカースレッドに処理をオフロードしてください。 - グリッド処理にグローバル座標を使ってはいけません。タワーをピクセル単位で正確に整列させるため、必ずVector2i/Vector3iに変換してください。
パフォーマンスとシステム
- 毎フレーム
get_overlapping_bodies()を呼び出してはいけません。必ずシグナル(body_entered/body_exited)を使い、ローカルのターゲットキャッシュを維持してください。 - 数が500を超える場合、弾の移動に
_process()を使ってはいけません。弾幕系の高負荷ティアでは、必ずPhysicsServer2D/3Dを直接使ってください。 - 数百個の弾を完全なノードとして生成してはいけません。リソースを再利用してガベージコレクションによるカクつきを避けるため、必ずオブジェクトプーリングを使ってください。
- 優先度に標準のStringを使ってはいけません。ターゲット選択ループでO(1)のハッシュ比較を行うため、必ず
StringName(&"first"、&"strongest")を使ってください。 - PathFollowノードの
progressプロパティを無視してはいけません。出口に最も近いターゲットをO(1)で特定する方法として、必ずこれを使ってください。 - 毎フレーム、タワーの探索処理を実行してはいけません。CPUサイクルを大幅に節約するため、必ずターゲット取得の探索を制限してください(例:5~10フレームごと)。
- タワーの
CollisionShapeを非一様にスケーリングしてはいけません。衝突計算を正しく保つため、必ずShapeリソースの半径プロパティを調整してください。 - 死亡した敵をすぐに削除してはいけません。物理サーバーのクラッシュを防ぐため、必ず**set_deferred("disabled", true)**を使い、1フレーム待ってください。
- 巨大なswitch文にウェーブをハードコードしてはいけません。バランス調整とシーケンス編集を容易にするため、必ず**カスタムリソース(.tres)**を使ってください。
🛠 エキスパート向けコンポーネント(scripts/)
独自のエキスパート向けパターン
- wave_manager.gd - Resourceベースの敵構成とクリーンアップ機能を備えた、プロ仕様のウェーブ制御システムです。
- tower.gd - FSMによる状態管理と射撃ロジックを備えた、タレットの基底クラスです。
- tower_targeting_system.gd - 効率的なターゲット選択を実現する、自律的な優先度ロジック(First/Last/Strongest/Weakest)です。
モジュール式コンポーネント
- tower_defense_patterns.gd - 最遠ターゲットの判定ロジックと、PhysicsServerを使った弾の最適化パターンをまとめています。
決定木(スクリプトの確認必須)
経路のスタイル
| スタイル | アプローチ | スクリプト/API |
|---|---|---|
| 固定レーン | Path2D / PathFollow2Dのprogress | wave_manager.gd、wave_resource_spawner.gd |
| 迷路型 | 配置前に封鎖をチェック | NavigationServer2D.map_get_path / AStarGrid2D(絶対に使わない) |
| 自然な曲線 | Bezier PathFollowのprogress | 毎フレームの追跡処理よりPathFollowを優先 |
ターゲット選択の優先順位
| 優先度 | ソートキー | 必須 |
|---|---|---|
| 最優先 | progress が最大(出口に最も近い) | tower_targeting_system.gd |
| 最後 | progress が最小 | 同上 — 最後に実装済み |
| 最強/最弱 | health の降順/昇順 | 同上 — 最弱は実装済み |
シグナルでキャッシュした範囲 Area の進入/退出と、フレーム分割した取得(acquire_interval_frames)を使用してください。毎フレーム get_overlapping_bodies() を呼び出してはいけません。
経済
| 項目 | ルール | スクリプト |
|---|---|---|
| ウェーブ構成 | リソース .tres のウェーブ | wave_manager.gd |
| 協力プレイでの購入 | サーバーがゴールドを検証 | tower_defense_patterns.gd |
| 逆転要素 | 利子/早期呼び出しボーナス | デザインレベル — タワー FSM では扱わない |
PhysicsServer 弾丸の推奨実装
数が約 500 を超える場合:
- 必須 tower_defense_patterns.gd の
spawn_fast_bullet(PhysicsServer3Dのキネマティック RID)。 - RID をプールし、AoE には
intersect_shapeを使用し、死亡時には衝突の無効化を遅延させます。 - 数が少ない場合は、homing_projectile_3d.gd/プール済みノードで問題ありません。
タワー FSM
必須:tower.gd を使用して、待機 → 取得 → 準備 → 発射を行います。ターゲット選択は tower_targeting_system.gd に保持します。
詳細レシピ(必要に応じて)
| トピック | リファレンス/スクリプト |
|---|---|
| ウェーブ/タワー/経路 | architecture-overview.md |
| 弾丸の先読みとターゲット選択 | key-mechanics.md |
| 迷路の検証とバースト検索 | elite-technical-patterns.md + grid_path_validator.gd |
リファレンス
段階的開示:特定の API を調査するときに限り公式ドキュメントへのリンクを開いてください。関連スキルは、関連領域へ誘導するときに読み込みます。スキル群全体を事前に読み込まないでください。
公式ドキュメント
- ナビゲーションの概要(2D) — 迷路型タワーディフェンスでの経路の有効性を確認するための、NavigationRegion2D のベイク処理とマップクエリです。
- NavigationAgents の使用 — タワーによって歩行可能な領域が変化する際の、エージェントによる経路追従と回避です。
- NavigationServer2D — タワーの設置を確定する前に、
map_get_pathで経路を塞いでいないか確認します。 - AStarGrid2D — ナビゲーションを全面的にベイクせずに、整数グリッド上で建設セルをシミュレートする経路プローブです。
- PathFollow2D — 固定レーンの敵や First/Last ターゲティングで使う
progress/progress_ratioです。 - PathFollow3D — ウェーブスポナーやホーミング照準の基準点で使う、3D トラックの追従機能です。
- Area2D の使用 — 毎フレーム重なりを確認する代わりに、シグナル駆動の範囲キャッシュ(
body_entered/body_exited)を使います。 - 物理演算の概要 — タワーの範囲攻撃が他のタワーや壁ではなく敵に命中するよう、レイヤー/マスクを設定します。
- サーバーの使用 — Node のオーバーヘッドを避け、多数の弾丸に PhysicsServer のボディを使用します。
- リソース — ハードコードされたスポーン分岐の代わりに、WaveDefinition の
.tresデータを使います。 - 複数スレッドの使用 — 配置中の非同期なナビゲーション再ベイクに WorkerThreadPool/Thread パターンを使います。
- TileMap の使用 — 建設セル、経路、配置スナップに TileMapLayer のグリッドを使います。
関連スキル
前提条件
- godot-project-foundations — ウェーブやタワーを接続する前に、プロジェクト設定、レイヤー、シーン構造を整えます。
- godot-navigation-pathfinding — 迷路型タワーディフェンスに必要な NavigationServer のベイク、エージェント、経路クエリを扱います。
- godot-tilemap-mastery — 建設可能なセルやレーンの描画に使う TileMapLayer/TileSet のグリッドを扱います。
補完
- godot-2d-physics — 大量のウェーブに対応する Area2D の射程、レイヤー、PhysicsServer2D の弾丸パターン。
- godot-state-machine-advanced — StringName を使ったタワーの FSM 状態(Idle/Acquire/Attack/Cooldown)。
- godot-economy-system — 敵を倒した報酬、利息、序盤の早期コール収入を、悪循環に陥らずに実現します。
- godot-combat-system — ダメージタイプ、装甲貫通、範囲攻撃、弾丸の命中判定。
- godot-resource-data-patterns — 型付きの Wave/Tower Resources と、バランス調整に使う
duplicate(true)。 - godot-game-loop-waves — スポーナーを中心とした準備・防衛・報酬フェーズのオーケストレーション。
- godot-signal-architecture — フレーム単位のポーリングを使わない wave_started / enemy_died / currency_changed バス。
- godot-performance-optimization — 大量の弾丸がある状況でのプーリング、サーバーボディ、頻度を抑えた取得検索。
- godot-monte-carlo-balancer — 難易度カーブをリリースする前に、ウェーブの DPS、敵の突破率、経済バランスの範囲をサンプリングします。
下流/利用側
- godot-genre-rts — 経路検証と経済的な圧力を再利用する、拠点防衛とユニット配置のループ。
- godot-multiplayer-networking — 協力プレイのタワーディフェンス向け、権威サーバーによる購入検証と、信頼性を保証しないミニオン同期。
マスター
- godot-master — スキル横断での検索に使うライブラリルーターおよびミラーされたモジュールエントリ。
コメント
Markdown 対応