예제 #1
0
    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);
            }
        }
    }
예제 #2
0
 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());
             }
         }
     }
 }
예제 #3
0
    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);
    }
예제 #4
0
 public virtual void ReceiveData(NavHandleData data)
 {
     navHandleData = data;
 }
예제 #5
0
 public virtual void Reset()
 {
     navHandleData = null;
 }