How to Develop a Game
Navigation
PublishDate: 2025-06-01 | CreateDate: 2025-06-01 | LastModify: 2025-06-01 | Creator:ljf12825

constructing

Navigation in 3D

Unity的默认NavMesh系统是为3D场景涉及的

Unity中的Navigation主要涉及路径寻找(Pathfinding)和导航网格(NavMesh)两大核心内容,广泛应用于AI和角色移动的场景中,特别是用于控制NPC的行动

NavMesh是一个为AI角色提供导航支持的系统。在一个3D场景中,NavMesh是通过对地面等可行走区域的“网格化”,让AI角色能在场景中找到通行路径

在Unity中,我们通过以下几个步骤来创建NavMesh:

  1. 导航面(NavMesh Surface):这是Unity中生成NavMesh的工具。通过在地面上添加一个NavMeshSurface组件来定义NavMesh的生成区域。
  2. 烘焙NavMesh:一旦设置好NavMeshSurface,就可以通过点击“Bake”按钮来生成NavMesh,这时可行走的区域会被标记出来,Unity会在该区域内生成一个路径网格。
  3. 设置不可行走区域:可以通过NavMesh Obstacle组件来定义障碍物,标记出不可走的区域,生成的NavMesh会自动避开这些区域。

NavMeshSurfacePanel

NavMeshAgent 是挂载在角色上的组件,负责根据计算出的路径自动引导角色移动。它依赖于NavMesh来判断路径和避开障碍物。NavMeshAgent 会计算从当前位置到目标点的路径,并使角色沿路径移动

NavMeshAgentPanel

属性

移动方法
可以通过代码控制角色的移动

NavMeshAgent agent = GetComponent<NavMeshAgent>();
agent.SetDestination(targetPosition);

这个方法会让角色自动计算到targetPosition的最短路径,并开始沿着路径移动

NavMeshPath是一个可以通过代码访问的类,它保存了计算出的路径的所有信息,包括路径的各个节点(Waypoints),可以使用它来获取更详细的路径信息

NavMeshPath path = new NavMeshPath();
NavMesh.CalculatePath(startPosition, targetPosition, NavMesh.AllAreas, path);

这段代码会计算从StartPositiontargetPostion的路径,并返回路径中的所有节点

路径寻找和动态障碍物

if (agent.isOnNavMesh) agent.SetDestination(newDestination);

Agent Avoidance(代理避免)

Unity的NavMesh系统支持代理避让功能。当多个NavMeshAgent对象在场景中一起移动时,系统会自动计算并避免它们相互碰撞,可以在NavMeshAgent的避让设置中调整优先级和半径,从而控制AI角色之间的避让行为

高级应用

Unity的NavMesh不仅可以用于角色导航,还可以与AI逻辑结合,用于实现复杂的行为,比如:

Navigation in 2D