// bool _UpdateDistance(float distance) { if (_nextNode == null) { return(false); } ViVector3 nextPos = _nextNode._pos; float distRight = Distance(_currentPos, nextPos); if (distRight > distance) { _currentPos += _dir * distance; } else { float newDistance = distance - distRight; _currentPos = nextPos; _prePos = nextPos; if (ViRouteNode.HasEvent(_nextNode._eventId)) { _endCallbackList.Invoke(_nextNode._eventId); } S_Nodes.Delete(_nodes.GetHead()); _nextNode = _LerpToNextNode(); if (_nextNode != null) { _UpdateDistance(newDistance); } else { _ClearState(); } } return(true); }
ViRouteNode _LerpToNextNode() { if (_nodes.IsNotEmpty()) { ViRouteNode pNode = _nodes.GetHead().Data; _dir = pNode._pos - _prePos; _dir.z = 0.0f; _dir.Normalize(); return(pNode); } else { return(null); } }
public float Length() { float len = 0.0f; ViVector3 prePos = _currentPos; ViDoubleLinkNode2 <ViRouteNode> iter = _nodes.GetHead(); while (!_nodes.IsEnd(iter)) { ViRouteNode value = iter.Data; ViDoubleLink2 <ViRouteNode> .Next(ref iter); // len += Distance(value._pos, prePos); prePos = value._pos; } return(len); }