寻路系统 private

寻路系统

回答“NavMesh 数据如何进入运行时、NavMeshAgent 如何驱动角色、网络移动为何会失步”。

返回技术文档目录

本篇保留为快速概览。需要按源码、协议和排错步骤学习时,请继续阅读 20 客户端寻路与移动表现 和 21 服务端寻路权威与移动同步。

7. 寻路

项目使用 Unity NavMesh,不是自研 A*。关键文件:

  • Assets/Code/Game/OLogic/Common/NavMeshTool.cs
  • Assets/Code/Game/OLogic/Actor/Move/NavMoveStrategy.cs
  • Assets/Code/Game/OGame/Map/Systems/MapNavAssetsSystem.cs
  • Assets/Code/Game/OServices/View/Map/Navigation/MapNavObjectFactory.cs

NavMeshTool 封装 SamplePosition、Raycast、CalculatePath 和路径长度计算。运行链为:

  1. 地图导出导航资产 GUID 和 NavMeshLink。
  2. 客户端 MapProcessor 生成 NavMesh/Portal MapEntity。
  3. MapNavAssetsSystem 和 MapNavObjectFactory 加载导航对象。
  4. 角色 View 的 NavMeshAgent 交给 NavMoveStrategy。
  5. Begin() 先 Warp 到逻辑位置,再启用 Agent/Rigidbody。
  6. 目标变更时校验点在网格上,设置速度并 SetDestination()。
  7. Update 用 nextPosition/desiredVelocity 驱动刚体和朝向。
  8. OffMeshLink 手动 MoveTowards,到达后 CompleteOffMeshLink()。
  9. 剩余距离小于 stoppingDistance 后结束并冻结刚体。

Agent 不直接更新旋转,Rigidbody 速度跟随 Agent 的 nextPosition,旋转由项目逻辑控制。任意系统直接改 Transform 都可能令 Agent、刚体和逻辑坐标失配。

NavMoveSyncHelper 用路径拐点计算真实路程和 Duration,并做距离/时长失步检查。这用于平滑和检测,不代表客户端权威;Battle 仍维护最终状态。

排查顺序:目标能否 SamplePosition -> Agent 是否 active/isOnNavMesh -> 导航资产是否加载 -> areaMask/height/baseOffset -> Link 方向 -> Rigidbody 约束 -> 双端地图版本。


上一篇:地图编辑、导出与双端加载 下一篇:刷怪、触发器、AI 与掉落