Пример #1
0
        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));
        }
Пример #2
0
        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));
        }
Пример #3
0
        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));
        }
Пример #4
0
        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));
        }