HOME / 第 7 部分 · 完整游戏项目实战 / 第 83 课
MODULE 7 · 完整游戏项目实战
第 83 课 · 塔防游戏实战(一):地图与路径
🎯 本课学习目标
- 理解塔防游戏设计
- 设计敌人路径
- 实现敌人沿路径移动
塔防三课之第一课:敌人沿路径走,炮塔打敌人。本课做地图与敌人路径。
📖 详细教学步骤
塔防设计设计
- 敌人从起点沿路径走到终点(漏过去就扣命)
- 玩家在路径旁建炮塔攻击敌人
- 打死敌人得金币,金币买塔升级
本课:路径 + 敌人沿路径移动。
用 Path2D 定义路径搭建
- 添加
Path2D节点,命名 EnemyPath - 用曲线工具画出敌人行走的路径(点几下)
- 路径从入口到基地
💡 Path2D 的 Curve 定义一条路径,物体可沿它移动。
敌人沿路径移动代码
用 PathFollow2D 让敌人沿路径前进:
GDSCRIPT# enemy.tscn
# 结构: PathFollow2D (根) > CharacterBody2D/Area2D + Sprite
# 敌人脚本:
extends PathFollow2D
@export var speed: float = 120.0
func _physics_process(delta):
progress += speed * delta # 沿路径前进(progress 是路径位置)
if progress >= get_parent().curve.get_baked_length():
reached_base() # 到达终点
func reached_base():
print("敌人到达基地!")
queue_free()
动态生成敌人(波次)代码
定时在路径起点生成敌人:
GDSCRIPT# main.gd
const ENEMY = preload("res://enemy.tscn")
@onready var path: Path2D = $EnemyPath
func spawn_enemy():
var enemy = ENEMY.instantiate()
path.add_child(enemy) # 敌人作为 PathFollow2D 实例加进 Path2D
enemy.progress = 0 # 从起点开始
波次管理代码
一波一波地出敌人:
GDSCRIPTfunc start_wave(wave: int):
for i in range(3 + wave): # 波次越后敌人越多
spawn_enemy()
await get_tree().create_timer(0.8).timeout # 间隔 0.8 秒
测试路径测试
- 画一条 S 形路径
- F5:按按键触发 spawn,敌人沿路径走到底
- 调 speed 观察速度
🎉 敌人路径完成,下一课做炮塔攻击。
⚠️
敌人不走路径?
PathFollow2D 必须是 Path2D 的子节点,用 progress 控制,别改 position。
⚠️
敌人瞬移?
progress += speed*delta 每帧加,速度与帧率无关,不会瞬移。
🧪 动手试一试
🏋️ 课后练习
画一条含 5 个拐角的路径,让敌人匀速走完,到达终点打印「到达基地」并消失。
Path2D 曲线 + PathFollow2D.progress += speed*delta。
💡
PathFollow2D 是「沿路径移动」的专用节点,做塔防/赛车/轨道都行。
💡
路径可视化:选中 Path2D 可看到曲线。
🎓 本课小结
塔防路径:Path2D 画路径 + PathFollow2D 沿路径前进(progress 控制)+ 定时生成敌人 + 波次管理。