节点导航图系统

From Valve Developer Community
< Zh
Jump to navigation Jump to search
English (en)Русский (ru)中文 (zh)中文(臺灣) (zh-tw)Translate (Translate)

节点导航图(nodegraph)是地图中专用于辅助非玩家角色(NPC)(en)实时寻路的特殊组件。它由手动放置的"节点"和自动生成的连接线构成,在加载包含NPC的地图时会自动生成。

每个节点代表地图上一个NPC可移动的精确位置。游戏会自动在相邻节点间生成"连接线",NPC通过连接线在节点间移动(不一定沿直线移动,也不一定精确到达节点位置)。

Note.png注意:多人游戏中的机器人使用导航网格(en)而非节点导航图。

编译生成

节点导航图会在加载地图时自动编译为AIN(en)文件(除非已存在校验码匹配的AIN文件),输出文件存储在<game>\maps\graphs目录。编译时会向所有玩家显示"节点图已过期,正在重建..."提示。

Note.png注意:通过Steam分发Source游戏/模组的.ain文件时,游戏仍会判定文件过期并强制重建,导致所有玩家首次加载地图时看到重建提示。
Tip.png提示:可通过ai_norebuildgraph控制台参数禁用重建(建议写入autoexec.cfg(en))。但需注意这意味着.bsp的改动不会自动更新.ain,需手动同步节点图。

核心组件

节点类型

不同移动方式使用不同节点:

  • 地面节点:默认吸附到地面,供大多数NPC使用
  • 空中节点:供飞行NPC(en)悬浮移动
  • 攀爬节点:供攀爬NPC(en)在边缘移动

Hammer中的对应实体:

地面节点
info_node
info_node_hint
空中节点
info_node_air
info_node_air_hint
攀爬节点
info_node_climb

连接类型

节点图编译时,AI系统会在间距<720单位的节点间生成直线连接,并计算各NPC碰撞体(en)可通过性(忽略动态物体如物理道具和门)。

连接类型包括:

  • 地面连接:可步行/奔跑通过的节点间连接
  • 跳跃连接:需跳跃通过的相邻地面节点连接
  • 攀爬连接:攀爬节点间的垂直移动连接
  • 空中连接:空中节点间的飞行路径连接

NPC可配置使用多种连接类型,例如半衰期2 半衰期2npc_fastzombie能同时使用地面、跳跃和攀爬连接。

连接控制实体:

info_node_link
info_node_link_controller
info_radial_link_controller

构建指南

节点布局

《半条命2:第一章》倒数第二关的节点图设计
Note.png注意:节点数量上限为1500个。

节点图应粗略覆盖所有NPC可行走区域。基本原则:

  • 每个障碍物转角放置节点
  • 复杂区域需密集节点(支持战术动作如掩体利用)
  • 开阔区域减少节点(如海滩场景促使NPC快速推进)
  • 目标点需密集节点(避免NPC堆积)

实时编辑

主条目:  map_edit

使用map_edit(en)工具可在游戏内第一人称视角快速放置节点(自动解决displacement(en)地形适配问题),支持高级功能如手动删除连接。

提示节点

主条目:  Hint nodes
《半条命2》广场能源核心场景的蹲伏掩体提示节点

提示节点(en)为NPC提供环境信息:

  • 保留普通节点的导航功能
  • 仅在精确位置生效
  • 关键类型包括:
蹲伏掩体提示
标记安全掩体位置(不被敌人直视时生效)
跳跃权限覆盖
允许本不能跳跃的NPC(如市民)执行跳跃动作

完整列表参见Hint nodes(en)专题。

调试验证

主条目:  ai_show_connect
修复无效连接(褐线表示HUMAN_HULL不可通过)

使用ai_show_connect(en)命令验证连接:

  • 确保关键路径存在绿色连接线
  • 注意不同NPC Hull(en)类型的通过性差异
  • 修正方案:
 - 在转角处添加中转节点
 - 确保路径全程满足碰撞体尺寸
 - 适当外移靠近墙壁的节点

高级控制

info_node_link可强制建立节点连接,典型应用场景:

  • 电梯等移动平台NPC寻路
  • 使用方法:
 1. 放置起点/终点节点
 2. 创建info_node_link实体
 3. 输入两节点的NodeID

布局规范

门廊节点布局

门廊最优节点布局
主移动节点
确保门框直线通过性
略微前置避免NPC拥堵
侧翼节点
提供备用路径和掩体点
进出管制点
使用info_node_hint的"Entrance/Exit Pinch"类型
强制NPC单列通过(注意存在NPC误占位的BUG)

NPC寻路逻辑

NPC寻路流程: 1. 定位最近起点/终点节点 2. 验证路径连通性 3. 使用移动探针(en)检测实际可达性

相关命令