protected override Status Execute() { if (m_agent == null || m_sought == null) { return(StateToStatusHelper.ConditionToStatus(m_dataValid, Status.Error, Status.Failure)); } Vector3 agentPosition = m_agent.transform.position; Vector3 soughtPosition = m_sought.position; Vector3 soughtToAgent = agentPosition - soughtPosition; if (soughtToAgent.sqrMagnitude < m_reachDistanceSqr) { return(Status.Success); } if (m_agent.pathPending || m_agent.hasPath) { if ((m_agent.destination - soughtPosition).sqrMagnitude < m_recalculateToleranceSqr) { return(Status.Running); } } bool found = m_agent.SetDestination(soughtPosition); return(StateToStatusHelper.FailedToStatus(!found)); }
public static void FailedToStatusTest() { Assert.AreEqual(Status.Failure, StateToStatusHelper.FailedToStatus(true)); Assert.AreEqual(Status.Running, StateToStatusHelper.FailedToStatus(false)); Assert.AreEqual(Status.Failure, StateToStatusHelper.FailedToStatus(true, true)); Assert.AreEqual(Status.Running, StateToStatusHelper.FailedToStatus(false, true)); Assert.AreEqual(Status.Error, StateToStatusHelper.FailedToStatus(true, false)); Assert.AreEqual(Status.Error, StateToStatusHelper.FailedToStatus(false, false)); }
protected override Status Execute() { if (m_agent == null || m_avoided == null) { return(StateToStatusHelper.ConditionToStatus(m_dataValid, Status.Error, Status.Failure)); } Vector3 agentPosition = m_agent.transform.position; Vector3 avoidedPosition = m_avoided.position; Vector3 avoidedToAgent = agentPosition - avoidedPosition; if (!blackboard.TryGetStructValue(m_minDistanceToAvoidedPropertyName, out float minDistanceToAvoidedSqr)) { return(Status.Error); } minDistanceToAvoidedSqr *= minDistanceToAvoidedSqr; if (avoidedToAgent.sqrMagnitude > minDistanceToAvoidedSqr) { return(Status.Success); } if (m_agent.pathPending || m_agent.hasPath) { Vector3 destination = m_agent.destination; Vector3 avoidedToDestination = destination - avoidedPosition; if (!blackboard.TryGetStructValue(m_minDotToAvoidedPropertyName, out float minDotToAvoided)) { return(Status.Error); } if (avoidedToDestination.sqrMagnitude > minDistanceToAvoidedSqr && Vector3.Dot((destination - agentPosition).normalized, avoidedToDestination.normalized) > minDotToAvoided) { return(Status.Running); } } if (!blackboard.TryGetStructValue(m_avoidDistancePropertyName, out float avoidDistance)) { return(Status.Error); } Vector3 hidePosition = agentPosition + avoidedToAgent.normalized * avoidDistance; bool found = NavMesh.SamplePosition(hidePosition, out NavMeshHit hit, avoidDistance, m_agent.areaMask) && (hit.position - avoidedPosition).sqrMagnitude > minDistanceToAvoidedSqr && m_agent.SetDestination(hit.position); return(StateToStatusHelper.FailedToStatus(!found)); }
protected override Status Execute() { if (m_agent == null || m_followed == null) { return(StateToStatusHelper.ConditionToStatus(m_dataValid, Status.Error, Status.Failure)); } Vector3 agentPosition = m_agent.transform.position; Vector3 followedPosition = m_followed.position; Vector3 followedToAgent = agentPosition - followedPosition; if (!blackboard.TryGetStructValue(m_reachDistancePropertyName, out float reachDistance)) { return(Status.Error); } if (followedToAgent.sqrMagnitude < reachDistance * reachDistance) { m_agent.ResetPath(); return(Status.Running); } if (m_agent.pathPending || m_agent.hasPath) { if (!blackboard.TryGetStructValue(m_recalculateTolerancePropertyName, out float recalculateTolerance)) { return(Status.Error); } if ((m_agent.destination - followedPosition).sqrMagnitude < recalculateTolerance * recalculateTolerance) { return(Status.Running); } } bool found = m_agent.SetDestination(followedPosition); return(StateToStatusHelper.FailedToStatus(!found)); }