NavigationRegion2D
2026/4/14大约 3 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — NavigationRegion2D
NavigationRegion2D
节点继承关系
继承自 Node
| 类型 | 名称 | 说明 |
|---|---|---|
| 属性 | Name | 节点名称 |
| 属性 | ProcessMode | 处理模式(始终 / 暂停时 / 仅编辑器) |
| 属性 | ProcessPriority | 处理优先级,数字越小越先执行 |
| 信号 | ready | 节点进入场景树并准备就绪 |
| 信号 | tree_entered | 节点进入场景树 |
| 信号 | tree_exited | 节点完全离开场景树 |
| 方法 | GetNode<T>() | 按路径获取子节点 |
| 方法 | AddChild() | 添加子节点 |
| 方法 | RemoveChild() | 移除子节点 |
| 方法 | QueueFree() | 帧结束后释放节点 |
| 方法 | GetParent() | 获取父节点 |
定义
NavigationRegion2D 用来定义游戏世界中哪些区域是可以行走的。你可以把它想象成在城市地图上用绿色高亮标注"人行道和广场"——只有被标注的区域,AI 角色才会在上面走路。
使用频率:★★★★ 常用——做任何有 AI 角色移动的 2D 游戏都离不开它
节点用途
- 告诉寻路系统"这片区域可以走"
- 配合 NavigationMesh 资源定义可行走区域的形状
- 多个 NavigationRegion2D 可以拼接覆盖整个关卡
- 支持导航层(navigation_layers)来区分不同类型的可行走区域(比如地面、水中、空中)
使用场景
- 2D RPG 游戏的地图:在城镇地图上放置一个 NavigationRegion2D,标记出角色可以走的街道和广场
- 即时战略游戏:标记部队可以行走的地面区域
- 塔防游戏:定义敌人的行进路线区域
- 多地形关卡:用不同的导航层区分陆地和水域,让某些角色只能走陆地
常用节点搭配
| 搭配节点 | 搭配方式 |
|---|---|
| NavigationAgent2D | Agent 在 Region 定义的区域内寻路移动 |
| NavigationLink2D | 连接两个不连续的 Region |
| NavigationObstacle2D | 在 Region 内添加动态障碍物 |
| TileMap / TileMapLayer | 配合 TileSet 编辑器烘焙导航网格 |
生效必备素材/资源
- NavigationMesh 资源:必须给 NavigationRegion2D 分配一个 NavigationMesh 资源,否则它不定义任何可行走区域。你可以通过代码烘焙,也可以在编辑器中手动绘制多边形顶点。
节点属性与信号
属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| navigation_mesh | NavigationMesh | — | 导航网格资源,定义可行走区域的形状 |
| enabled | bool | true | 是否启用此导航区域,关闭后 AI 不会在此区域寻路 |
| navigation_layers | int | 1 | 导航层位掩码,用于区分不同类型的可行走区域 |
信号
| 信号名 | 触发时机 |
|---|---|
| navigation_mesh_changed | 导航网格资源发生变化时 |
| navigation_mesh_changed | 区域被启用或禁用时 |
常用方法
| 方法 | 返回值 | 说明 |
|---|---|---|
| get_navigation_map_rid() | RID | 获取底层导航地图的 RID |
| is_enabled() | bool | 是否已启用 |
| set_enabled(enabled) | void | 设置是否启用 |
| get_navigation_layers() | int | 获取导航层位掩码 |
| set_navigation_layers(layers) | void | 设置导航层位掩码 |
代码示例
通过代码烘焙导航网格
以下示例展示如何用代码创建一个简单的矩形导航区域:
C
using Godot;
public partial class NavRegionSetup : Node2D
{
private NavigationRegion2D _navRegion;
public override void _Ready()
{
_navRegion = GetNode<NavigationRegion2D>("NavigationRegion2D");
// 创建一个新的导航网格
var navMesh = new NavigationMesh();
var vertices = new Godot.Collections.Array<Vector2>
{
new Vector2(0, 0),
new Vector2(500, 0),
new Vector2(500, 500),
new Vector2(0, 500)
};
// 设置导航网格的顶点(2D 模式下自动转换为 3D)
navMesh.SetVertices(new Godot.Collections.Array<Vector3>
{
new Vector3(0, 0, 0),
new Vector3(500, 0, 0),
new Vector3(500, 0, 500),
new Vector3(0, 0, 500)
});
// 分配给 NavigationRegion2D
_navRegion.NavigationMesh = navMesh;
GD.Print("导航区域已设置完成!");
}
}GDScript
extends Node2D
@onready var _nav_region: NavigationRegion2D = $NavigationRegion2D
func _ready() -> void:
# 创建一个新的导航网格
var nav_mesh = NavigationMesh.new()
nav_mesh.vertices = PackedVector3Array([
Vector3(0, 0, 0),
Vector3(500, 0, 0),
Vector3(500, 0, 500),
Vector3(0, 0, 500)
])
# 分配给 NavigationRegion2D
_nav_region.navigation_mesh = nav_mesh
print("导航区域已设置完成!")