void FixedUpdate() { if (IsParallel && _performer.State == UnitState.HasTargetInDefaultTask) { _canUpdateTargetPositionAndPath = false; return; } _performer.State = UnitState.CommandPerforming; _canUpdateTargetPositionAndPath = true; //разрешение искать более ближнюю цель //–исует линию от граничной ноды до точки, куда будет пытатьс¤ следовать юнит Debug.DrawLine(_targetPositionPair.FollowPosition, _targetPositionPair.NearestBoundaryNodePosition, Color.blue); if (TargetIsExist()) { Vector3 performerPos = _performer.transform.position; Vector3 closestPoint = _taskData.Target.collider.ClosestPointOnBounds(performerPos); float distance = Vector3.Distance(closestPoint, performerPos); if (distance <= _performer.AttackDistance) //если юнит на дистанции атаки { _canUpdateTargetPositionAndPath = false; _performer.Attack(_taskData.Target, _targetPositionPair); } else { if (_path != null) { //если юнит находитс¤ в ноде _targetPositionPair.FollowPosition, то следовать к NearestBoundaryNodePosition(к центру ближайшей граничной ноде цели), а не к _path.vectorPath[_currentWaypoint] Vector3 currentWaypoint = _path.vectorPath[_currentWaypointIndex]; Vector3 endWaypoint = _path.vectorPath[_path.vectorPath.Length - 1]; if (AstarPath.active.GetNearest(endWaypoint).node.GetNodeIndex() == AstarPath.active.GetNearest(performerPos).node.GetNodeIndex()) { if (Vector3.Distance(endWaypoint, performerPos) < GameManager.HalfNodeSizeSqrt) { currentWaypoint = _targetPositionPair.NearestBoundaryNodePosition; } } //поворот и перемещение к текущей Waypoint _performer.RotateAndMove(ref _currentWaypointIndex, currentWaypoint, _path); } else //если пути нет { _performer.UnitAnimation.State = UnitAnimation.States.Idle; } } } else //если цели нет { _performer.UnitAnimation.State = UnitAnimation.States.Idle; CompleteTask(); } }
void FixedUpdate() { _canUpdateTargetAndPath = true; //разрешение искать более ближнюю цель //Рисует линию от граничной ноды до точки, куда будет следовать юнит Debug.DrawLine(_targetPositionPair.FollowPosition, _targetPositionPair.NearestBoundaryNodePosition, Color.blue); if (TargetIsExist()) { Vector3 performerPos = _performer.transform.position; Vector3 closestPoint = _target.collider.ClosestPointOnBounds(performerPos); float distance = Vector3.Distance(closestPoint, performerPos); if (distance <= _performer.VisionDistance) { if (distance <= _performer.AttackDistance) //если юнит на дистанции атаки { _canUpdateTargetAndPath = false; _performer.Attack(_target, _targetPositionPair); } else { if (_path != null) { //если юнит находится в ноде _targetPositionPair.FollowPosition, то следовать к NearestBoundaryNodePosition(к центру ближайшей граничной ноды цели), а не к _path.vectorPath[_currentWaypoint] Vector3 currentWaypoint = _path.vectorPath[_currentWaypointIndex]; Vector3 endWaypoint = _path.vectorPath[_path.vectorPath.Length - 1]; if (AstarPath.active.GetNearest(endWaypoint).node.GetNodeIndex() == AstarPath.active.GetNearest(performerPos).node.GetNodeIndex()) { if (Vector3.Distance(endWaypoint, performerPos) < GameManager.HalfNodeSizeSqrt) { currentWaypoint = _targetPositionPair.NearestBoundaryNodePosition; } } //поворот и перемещение к текущей Waypoint _performer.RotateAndMove(ref _currentWaypointIndex, currentWaypoint, _path); } else //если пути нет { _performer.UnitAnimation.State = UnitAnimation.States.Idle; } } } else //если цель вне радиуса видимости юнита, то прекращаем следовать за ней { ClearTemporaryVariables(); _target = null; _performer.UnitAnimation.State = UnitAnimation.States.Idle; } } }