tower-defense
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseTower Defense
Tower Defense
A playbook for tower defense — enemy pathing, wave spawning, tower targeting, and the
economy that ties them together. This is a compositional skill: it orchestrates pathing,
AI, and UI into a TD loop. It does not re-teach pathfinding; it defines the systems and the
balance levers (DPS vs. HP vs. income) that decide whether a TD is tense or trivial.
一份塔防游戏开发指南——涵盖敌人路径规划、Wave spawner、Tower targeting,以及将这些系统串联起来的经济系统。这是一项组合型技能:它将路径规划、AI和UI整合为塔防游戏的核心循环。本指南不会重新讲解寻路算法,而是定义塔防游戏的核心系统与平衡杠杆(DPS、生命值与收益的关系),这些因素决定了塔防游戏是紧张刺激还是平淡无趣。
When to use
使用场景
- Use when building a game where the player places towers that automatically attack waves of enemies following a path, spends earned currency to expand/upgrade, and loses if too many enemies leak through.
- Use when designing wave composition/pacing, tower targeting priorities, or the gold economy.
When not to use: the player directly controls a shooter → . Free-form base
building with needs → . For the pathfinding algorithm itself, use .
fps-shootersurvival-craftinggame-ai- 适用于开发这类游戏:玩家放置防御塔自动攻击沿路径移动的敌人波次,用赚取的货币扩建/升级防御塔,若过多敌人突破防线则游戏失败。
- 适用于设计波次构成/节奏、防御塔瞄准优先级,或金币经济系统。
不适用于: 玩家直接控制射击角色的场景 → 参考。自由形式基地建造类游戏 → 参考。若仅需寻路算法,请使用。
fps-shootersurvival-craftinggame-aiCore loop
核心循环
Prepare (place/upgrade towers with current gold) → start the wave → enemies path toward the
goal while towers auto-fire → earn gold from kills → survive the wave → repeat against a
harder one. The tension is a planning puzzle: is my current DPS enough for what's coming,
and can I afford the answer?
准备阶段(用现有金币放置/升级防御塔)→ 启动波次 → 敌人沿路径向目标移动,防御塔自动开火 → 击杀敌人赚取金币 → 存活过当前波次 → 迎接难度更高的下一波次,循环往复。 游戏的紧张感源于规划谜题:当前的DPS能否应对即将到来的敌人?我是否有足够的金币来解决这个问题?
Must-have systems
必备系统
- Enemy path — waypoint lanes, or grid + pathfinding for maze TD (refs).
- Wave spawner — timed, scripted sequences of enemy types with per-wave scaling.
- Towers — range, fire rate, damage, projectile/hitscan, splash; placement validity.
- Targeting — per-tower priority (first/last/closest/strongest/weakest) (refs).
- Economy — gold from kills + wave bonuses; tower/upgrade costs; sell refund.
- Lives / leak — enemies reaching the goal cost lives; 0 = game over.
- Wave/prep UI — lives, gold, next-wave preview, start-next-wave control.
- Enemy path — 航点式路线,或迷宫类塔防的网格+寻路系统(参考相关文档)。
- Wave spawner — 定时的、基于脚本的敌人类型序列,每波敌人属性会逐步提升。
- Towers — 射程、射速、伤害、投射物/即时命中、溅射效果;放置有效性判定。
- Targeting — 单塔瞄准优先级(最先/最后/最近/最强/最弱)(参考相关文档)。
- Economy — 击杀敌人奖励金币+波次通关奖励;防御塔/升级成本;出售防御塔的退款机制。
- Lives / leak — 敌人到达目标会扣除生命值;生命值归0则游戏结束。
- Wave/prep UI — 生命值、金币、下一波预览、启动下一波的控制界面。
Design knobs
设计调节项
| Knob | Effect | Notes |
|---|---|---|
| Enemy HP growth/wave | upgrade pressure | Geometric ~1.1–1.2× (refs). |
| Income vs. HP curves | difficulty | Player should almost afford each wave. |
| Tower DPS / range / cost | tower identity | Cheap+wide vs. expensive+tall. |
| Targeting priority | optimal placement | Changes play more than raw stats. |
| Enemy variety | counters one-build wins | Fast / armored / flying / swarm / boss. |
| Leak penalty | stakes | Cost lives and lost bounty. |
| Upgrade vs. build economy | strategy depth | Diminishing upgrade returns. |
| Wave pacing | tension curve | Spike → breather → spike, not monotonic. |
| 调节项 | 效果 | 说明 |
|---|---|---|
| 敌人生命值每波增长率 | 升级压力 | 通常采用几何增长,约1.1–1.2倍(参考相关文档)。 |
| 收益与生命值曲线对比 | 难度控制 | 玩家应刚好能负担应对每一波敌人的成本。 |
| 防御塔DPS/射程/成本 | 防御塔特性区分 | 廉价广域型 vs 昂贵高攻型。 |
| 瞄准优先级 | 最优放置策略 | 对玩法的影响大于基础属性数值。 |
| 敌人种类多样性 | 克制单一最优策略 | 快速型/装甲型/飞行型/ swarm型/ Boss型。 |
| 突破惩罚 | 风险提升 | 扣除生命值并损失赏金。 |
| 升级 vs 建造的经济平衡 | 策略深度 | 升级收益递减。 |
| 波次节奏 | 紧张感曲线控制 | 高峰→缓和→高峰,而非单调递增。 |
Patterns
模式示例
1. Wave spawner (timed, data-driven)
1. Wave spawner(定时、数据驱动)
python
undefinedpython
undefinedPseudocode. A wave is data: a list of (enemy_type, count, spacing). Spawn over time.
Pseudocode. A wave is data: a list of (enemy_type, count, spacing). Spawn over time.
wave = [ ("grunt", 10, 0.5), ("runner", 5, 0.3), ("tank", 2, 1.0) ]
def run_wave(wave):
for enemy_type, count, spacing in wave:
for _ in range(count):
spawn_enemy(enemy_type, at=path[0]) # enter at the path start
wait(spacing) # seconds between spawns (use a timer/coroutine)
# wave clears when all spawned enemies are dead or have leaked
undefinedwave = [ ("grunt", 10, 0.5), ("runner", 5, 0.3), ("tank", 2, 1.0) ]
def run_wave(wave):
for enemy_type, count, spacing in wave:
for _ in range(count):
spawn_enemy(enemy_type, at=path[0]) # enter at the path start
wait(spacing) # seconds between spawns (use a timer/coroutine)
# wave clears when all spawned enemies are dead or have leaked
undefined2. Tower targeting (filter to range, then pick by priority)
2. Tower targeting(先筛选射程内敌人,再按优先级选择)
python
undefinedpython
undefinedPseudocode. "First" (furthest along path) is the standard default for stopping leaks.
Pseudocode. "First" (furthest along path) is the standard default for stopping leaks.
def acquire_target(tower, enemies, mode="first"):
in_range = [e for e in enemies if distance(tower.pos, e.pos) <= tower.range]
if not in_range: return None
if mode == "first": return max(in_range, key=lambda e: e.progress) # furthest along path (stop leaks)
if mode == "last": return min(in_range, key=lambda e: e.progress) # least progress (guard the entrance)
if mode == "closest": return min(in_range, key=lambda e: distance(tower.pos, e.pos))
if mode == "strongest":return max(in_range, key=lambda e: e.hp) # burn down tanks first
if mode == "weakest": return min(in_range, key=lambda e: e.hp) # secure kills / last-hit bounty
return in_range[0]
undefineddef acquire_target(tower, enemies, mode="first"):
in_range = [e for e in enemies if distance(tower.pos, e.pos) <= tower.range]
if not in_range: return None
if mode == "first": return max(in_range, key=lambda e: e.progress) # furthest along path (stop leaks)
if mode == "last": return min(in_range, key=lambda e: e.progress) # least progress (guard the entrance)
if mode == "closest": return min(in_range, key=lambda e: distance(tower.pos, e.pos))
if mode == "strongest":return max(in_range, key=lambda e: e.hp) # burn down tanks first
if mode == "weakest": return min(in_range, key=lambda e: e.hp) # secure kills / last-hit bounty
return in_range[0]
undefined3. "Can this lane hold?" sanity check (DPS vs. HP)
3. “这条路线能否守住?”合理性检查(DPS vs 生命值)
python
undefinedpython
undefinedPseudocode. One tower's damage to one enemy crossing its range.
Pseudocode. One tower's damage to one enemy crossing its range.
tower_dps = tower.damage * tower.fire_rate
time_in_range = tower.range_coverage_length / enemy.speed
damage_dealt = tower_dps * time_in_range
tower_dps = tower.damage * tower.fire_rate
time_in_range = tower.range_coverage_length / enemy.speed
damage_dealt = tower_dps * time_in_range
Lane holds if summed damage_dealt from covering towers >= enemy.hp (per enemy). See refs.
Lane holds if summed damage_dealt from covering towers >= enemy.hp (per enemy). See refs.
undefinedundefinedPitfalls / failure modes
常见陷阱/失败模式
- Enemy HP scales slower than player income/DPS → game trivializes after a few waves. Tune the HP curve against the income curve (refs).
- One dominant tower/strategy → no decisions. Add enemy types that hard-counter builds (armored vs. rapid-fire, flying vs. ground-only) and diminishing upgrade returns.
- Maze TD that can fully block the goal → enemies get stuck/softlock. Forbid placements that sever the path; recompute paths when towers change (refs).
- No next-wave telegraph → specials feel random and unfair. Preview upcoming composition.
- Per-frame movement unscaled by → speed varies with frame rate. Scale steering by
dt.dt - Leaks only cost lives, not gold → leaking is sometimes optimal. Make leaks lose bounty too.
- Monotonic difficulty ramp → exhausting. Pace spikes and breathers.
- 敌人生命值增长慢于玩家收益/DPS → 几波后游戏变得毫无难度。需根据收益曲线调整生命值曲线(参考相关文档)。
- 单一强势防御塔/策略 → 玩家无需做决策。添加能强力克制特定玩法的敌人类型(装甲型克制速射塔,飞行型克制地面塔),并设置升级收益递减机制。
- 迷宫类塔防可完全阻断目标路径 → 敌人卡住/软锁。禁止放置会切断路径的防御塔;当防御塔位置变化时重新计算路径(参考相关文档)。
- 无下一波预告 → 特殊敌人出现显得随机且不公平。需预览下一波敌人构成。
- 每帧移动未按缩放 → 移动速度随帧率变化。需按
dt调整移动控制。dt - 突破仅扣除生命值,不损失金币 → 有时主动放敌人突破反而更优。需让突破同时损失赏金。
- 难度单调递增 → 玩家易疲惫。需安排难度高峰与缓和期交替。
Composition (build it from these skills)
组合构建(基于以下技能搭建)
- Pathing: for A*/flow-field/steering; for fixed lanes, simple waypoint following.
game-ai - Enemy movement: (or engine equivalent) to move along the path;
godot-2d-movementfor nav-based pathing.unity-navmesh - Map: /
godot-tilemapfor the grid/lanes;unity-tilemap-2dfor map layouts.level-design - Data: /
godot-resourcesto define towers, enemies, and waves as assets.unity-scriptableobjects - UI: for HUD layout, scaling, and the build menu;
game-ui-uxfor the concrete widgets (lives, gold, wave preview).godot-ui-control - Polish: for fire/hit/leak sound cues.
audio-design
- 路径规划: 使用实现A*/流场/转向寻路;固定路线则采用简单的航点跟随。
game-ai - 敌人移动: 使用(或对应引擎的同类技能)实现沿路径移动;使用
godot-2d-movement实现基于导航网格的寻路。unity-navmesh - 地图: 使用/
godot-tilemap制作网格/路线;使用unity-tilemap-2d设计地图布局。level-design - 数据: 使用/
godot-resources将防御塔、敌人、波次定义为资源资产。unity-scriptableobjects - UI: 使用设计HUD布局、缩放及建造菜单;使用
game-ui-ux实现具体控件(生命值、金币、波次预览)。godot-ui-control - 打磨: 使用添加开火/命中/突破的音效提示。
audio-design
References
参考资料
- For path representations (waypoints / A* / flow fields), targeting modes, DPS and economy
math, enemy scaling, and wave pacing, read .
references/balancing.md
- 关于路径表示(航点/A*/流场)、瞄准模式、DPS与经济系统计算、敌人属性缩放及波次节奏的内容,请阅读。
references/balancing.md