寻路系统 private
寻路系统
回答“NavMesh 数据如何进入运行时、NavMeshAgent 如何驱动角色、网络移动为何会失步”。
本篇保留为快速概览。需要按源码、协议和排错步骤学习时,请继续阅读 20 客户端寻路与移动表现 和 21 服务端寻路权威与移动同步。
7. 寻路
项目使用 Unity NavMesh,不是自研 A*。关键文件:
Assets/Code/Game/OLogic/Common/NavMeshTool.csAssets/Code/Game/OLogic/Actor/Move/NavMoveStrategy.csAssets/Code/Game/OGame/Map/Systems/MapNavAssetsSystem.csAssets/Code/Game/OServices/View/Map/Navigation/MapNavObjectFactory.cs
NavMeshTool 封装 SamplePosition、Raycast、CalculatePath 和路径长度计算。运行链为:
- 地图导出导航资产 GUID 和 NavMeshLink。
- 客户端
MapProcessor生成 NavMesh/Portal MapEntity。 MapNavAssetsSystem和MapNavObjectFactory加载导航对象。- 角色 View 的
NavMeshAgent交给NavMoveStrategy。 Begin()先 Warp 到逻辑位置,再启用 Agent/Rigidbody。- 目标变更时校验点在网格上,设置速度并
SetDestination()。 - Update 用
nextPosition/desiredVelocity驱动刚体和朝向。 - OffMeshLink 手动 MoveTowards,到达后
CompleteOffMeshLink()。 - 剩余距离小于 stoppingDistance 后结束并冻结刚体。
Agent 不直接更新旋转,Rigidbody 速度跟随 Agent 的 nextPosition,旋转由项目逻辑控制。任意系统直接改 Transform 都可能令 Agent、刚体和逻辑坐标失配。
NavMoveSyncHelper 用路径拐点计算真实路程和 Duration,并做距离/时长失步检查。这用于平滑和检测,不代表客户端权威;Battle 仍维护最终状态。
排查顺序:目标能否 SamplePosition -> Agent 是否 active/isOnNavMesh -> 导航资产是否加载 -> areaMask/height/baseOffset -> Link 方向 -> Rigidbody 约束 -> 双端地图版本。