HOME / 第 7 部分 · 完整游戏项目实战 / 第 83 课
MODULE 7 · 完整游戏项目实战

第 83 课 · 塔防游戏实战(一):地图与路径

⏱ 预计时长 50 分钟📊 难度 进阶📚 模块 第 7 部分 · 完整游戏项目实战

🎯 本课学习目标

塔防三课之第一课:敌人沿路径走,炮塔打敌人。本课做地图与敌人路径。

📖 详细教学步骤

塔防设计设计

  • 敌人从起点沿路径走到终点(漏过去就扣命)
  • 玩家在路径旁建炮塔攻击敌人
  • 打死敌人得金币,金币买塔升级

本课:路径 + 敌人沿路径移动。

用 Path2D 定义路径搭建

  1. 添加 Path2D 节点,命名 EnemyPath
  2. 用曲线工具画出敌人行走的路径(点几下)
  3. 路径从入口到基地

💡 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 秒

测试路径测试

  1. 画一条 S 形路径
  2. F5:按按键触发 spawn,敌人沿路径走到底
  3. 调 speed 观察速度

🎉 敌人路径完成,下一课做炮塔攻击。

⚠️
敌人不走路径?

PathFollow2D 必须是 Path2D 的子节点,用 progress 控制,别改 position。

⚠️
敌人瞬移?

progress += speed*delta 每帧加,速度与帧率无关,不会瞬移。

🧪 动手试一试

🏋️ 课后练习

画一条含 5 个拐角的路径,让敌人匀速走完,到达终点打印「到达基地」并消失。

Path2D 曲线 + PathFollow2D.progress += speed*delta。

💡

PathFollow2D 是「沿路径移动」的专用节点,做塔防/赛车/轨道都行。

💡

路径可视化:选中 Path2D 可看到曲线。

🎓 本课小结

塔防路径:Path2D 画路径 + PathFollow2D 沿路径前进(progress 控制)+ 定时生成敌人 + 波次管理。