1. 3D导航与寻路
2026/4/14大约 2 分钟
3D导航与寻路
想象你在一座大楼里找人。你不会撞墙硬走,而是看门牌号、走走廊、拐弯,找到最短路线。3D 游戏里的 AI 角色也是这样——它们需要一张"室内地图"来知道哪里能走、哪里是墙。Godot 的导航系统就是帮 AI 画这张地图的工具。
本章你将学到
- 什么是导航网格(NavigationMesh),为什么 AI 角色需要它
- 如何用 NavigationRegion3D 给场景铺设"可行走区域"
- 如何烘焙(生成)导航网格
- 如何处理动态障碍物(比如门打开/关闭)
- 如何让 AI 角色自动寻路走到目标点
核心概念:导航网格
导航网格就像在场景地面上铺了一层看不见的"地毯",标出 AI 可以走到的所有区域。Godot 会根据场景中的碰撞体自动计算这块地毯的形状。AI 角色只能在这块地毯上移动,这样就不会穿墙了。
烘焙导航网格就像"拍照"——Godot 扫一遍场景,把能走的区域记录下来,生成一张导航地图。
代码示例:让 AI 角色寻路走向目标
下面展示如何用 NavigationRegion3D + NavigationAgent3D 让一个角色自动走向目标点。首先在场景中添加一个 NavigationRegion3D 节点并烘焙导航网格,然后给 AI 角色挂上 NavigationAgent3D 脚本:
C#
using Godot;
public partial class Enemy : CharacterBody3D
{
private NavigationAgent3D _agent;
private float _speed = 3.0f;
public override void _Ready()
{
_agent = GetNode<NavigationAgent3D>("NavigationAgent3D");
// 设置目标位置(比如玩家的位置)
_agent.TargetPosition = new Vector3(10, 0, 5);
}
public override void _PhysicsProcess(double delta)
{
// 获取下一步该走的方向
Vector3 nextPosition = _agent.GetNextPathPosition();
// 计算移动方向
Vector3 direction = (nextPosition - GlobalPosition).Normalized();
// 设置速度并移动
Velocity = direction * _speed;
MoveAndSlide();
}
}GDScript
extends CharacterBody3D
var agent: NavigationAgent3D
var speed: float = 3.0
func _ready():
agent = $NavigationAgent3D
# 设置目标位置(比如玩家的位置)
agent.target_position = Vector3(10, 0, 5)
func _physics_process(delta):
# 获取下一步该走的方向
var next_position = agent.get_next_path_position()
# 计算移动方向
var direction = (next_position - global_position).normalized()
# 设置速度并移动
velocity = direction * speed
move_and_slide()动态障碍物
场景里有些东西会移动,比如一扇门打开后,AI 应该能从门口走过去。Godot 提供了 NavigationObstacle3D 节点来处理这种情况——把它挂在会移动的物体上,导航系统会自动更新"可行走区域"。
相关章节
- 基础篇 - 3D 物理系统:导航依赖碰撞体来生成可行走区域
- 性能优化与 LOD:大场景中导航网格的优化策略
- 程序化生成:在随机生成的地图中使用导航
