public void Update() { int handleCount = 0; while (_navReqQueue.Count != 0 && handleCount < NavHandleData.MAX_REQ_COUNT_PRE_FRAME) { handleCount++; NavigationRequest req = _navReqQueue.Dequeue(); // 如果该请求与之前正在处理的ID相同,则会覆盖之前的 _processingData[req.reqID] = new NavHandleData(req, req.entity); _processingData[req.reqID].lastTickTime = Time.time; } // 遍历所有正在处理的请求 进行寻路处理 _loopProcessingKeyList = _processingData.Keys.ToList(); foreach (Guid id in _loopProcessingKeyList) { _loopNavHandleData = _processingData[id]; if (Time.time - _loopNavHandleData.lastTickTime > NavHandleData.NAV_TICK_TIME) { _loopNavHandleData.lastTickTime = Time.time; Process(_loopNavHandleData); } } }
private void RaiseMovementRequest(NavHandleData data) { _cacheChildData = data.GetChildNavData(); if (data.HasReachedTarget()) { NavManager.instance.RemoveMovementOrder(data.entityID); if (_cacheChildData != null) { foreach (NavHandleData tData in _cacheChildData) { NavManager.instance.RemoveMovementOrder(tData.entityID); } } // todo 清除RVO模拟 Simulator.Instance.Clear(); Debug.Log($"寻路请求{data.sourceRequest.reqID}完成 所有单位到达目标"); // 从正在处理的寻路列表移除 _processingData.Remove(data.sourceRequest.reqID); } else { NavManager.instance.UpdateMovementOrder(data.entityID, data.ConvertToMovementRequest()); if (_cacheChildData != null) { foreach (NavHandleData tData in _cacheChildData) { NavManager.instance.UpdateMovementOrder(tData.entityID, tData.ConvertToMovementRequest()); } } } }
private void Process(NavHandleData data) { for (int i = 0; i < _navigationBehaviourList.Count; i++) { _navigationBehaviourList[i].ReceiveData(data); if (_navigationBehaviourList[i].CanExecuteProcessStep()) { _navigationBehaviourList[i].ProcessStep(); } _navigationBehaviourList[i].Reset(); } RaiseMovementRequest(data); }
public virtual void ReceiveData(NavHandleData data) { navHandleData = data; }
public virtual void Reset() { navHandleData = null; }