Пример #1
0
    public void Update()
    {
        switch (m_currentState)
        {
        case EState.INITIAL:
            m_nextState = EState.KEEP_POSITION;
            ChangeState();
            break;

        case EState.KEEP_POSITION:
            if (m_attackTimer.CheckTimer())
            {
                m_nextState = EState.SHOOT;
                ChangeState();
                break;
            }
            break;

        case EState.SHOOT:

            if (MathExtent.IsInRange(Vector3.Distance(transform.position, m_blackboard.m_player.position), m_blackboard.m_soloAttackDistanceToPlayer))
            {
                Shoot();
                m_nextState = EState.KEEP_POSITION;
                ChangeState();
                break;
            }

            break;
        }
    }
Пример #2
0
    public void Update()
    {
        switch (m_currentState)
        {
        case EStates.INITIAL:
            m_nextState = EStates.WANDER;
            ChangeState();
            break;

        case EStates.WANDER:

            if (!MathExtent.IsInRange(Vector3.Distance(this.transform.position, m_blackboard.m_player.position), m_blackboard.m_alertRadius))
            {
                m_nextState = EStates.FIGHT;
                ChangeState();
            }
            break;

        case EStates.FIGHT:

            if (MathExtent.IsInRange(Vector3.Distance(this.transform.position, m_blackboard.m_player.position), m_blackboard.m_alertRadius))
            {
                m_nextState = EStates.WANDER;
                ChangeState();
            }
            break;
        }
    }
Пример #3
0
        public static SteeringOutput GetSteering(KinematicState ownKS, SArrive info)
        {
            Vector3 l_distanceToTarget = info.m_target.position - ownKS.m_position;

            if (l_distanceToTarget.magnitude < info.m_closeEnoughRadius)
            {
                return(NULL_STEERING);
            }

            if (l_distanceToTarget.magnitude > info.m_slowDownRadius)
            {
                return(Seek.GetSteering(ownKS, info.m_target));
            }

            float   l_desiredSpeed    = ownKS.m_maxLinearSpeed * (l_distanceToTarget.magnitude / info.m_slowDownRadius);
            Vector3 l_desiredVelocity = l_distanceToTarget.normalized * l_desiredSpeed;

            Vector3 l_requiredAcceleration = (l_desiredVelocity - ownKS.m_linearVelocity) / info.m_timeToDesiredSpeed;

            l_requiredAcceleration = MathExtent.Clip(l_requiredAcceleration, ownKS.m_maxLinearAcceleration);

            SteeringOutput result = new SteeringOutput();

            result.m_linearAcceleration = l_requiredAcceleration;

            return(result);
        }
Пример #4
0
        public virtual void ApplyFTI(SteeringOutput steering, GameObject target)
        {
            transform.rotation    = Quaternion.Euler(0, MathExtent.VectorToAngle(target.transform.position - m_ownKS.m_position) - 90f, 0);
            m_ownKS.m_orientation = transform.rotation.eulerAngles.y;

            steering.m_angularActive = false;
        }
        public static SteeringOutput GetSteering(KinematicState ownKS, SObstacleAvoidance info)
        {
            Ray        l_ray = new Ray(ownKS.m_position, ownKS.m_linearVelocity.normalized);
            RaycastHit l_hitInfo;

            if (Physics.Raycast(l_ray, out l_hitInfo, info.m_avoidDistance))
            {
                SURROGATE_TARGET.position = l_hitInfo.point + l_hitInfo.normal * info.m_avoidDistance;
                return(Seek.GetSteering(ownKS, SURROGATE_TARGET));
            }

            l_ray = new Ray(ownKS.m_position, MathExtent.AngleToVector(MathExtent.VectorToAngle(ownKS.m_linearVelocity.normalized) + info.m_AngleSecondWhisk));

            if (Physics.Raycast(l_ray, out l_hitInfo, info.m_primaryWhiskerLenght * info.m_RatioSecondWhisk))
            {
                SURROGATE_TARGET.position = l_hitInfo.point + l_hitInfo.normal * info.m_avoidDistance;
                return(Seek.GetSteering(ownKS, SURROGATE_TARGET));
            }

            l_ray = new Ray(ownKS.m_position, MathExtent.AngleToVector(MathExtent.VectorToAngle(ownKS.m_linearVelocity.normalized) - info.m_AngleSecondWhisk));

            if (Physics.Raycast(l_ray, out l_hitInfo, info.m_primaryWhiskerLenght * info.m_RatioSecondWhisk))
            {
                SURROGATE_TARGET.position = l_hitInfo.point + l_hitInfo.normal * info.m_avoidDistance;
                return(Seek.GetSteering(ownKS, SURROGATE_TARGET));
            }

            return(NULL_STEERING);
        }
Пример #6
0
        public static SteeringOutput GetSteering(KinematicState ownKS)
        {
            Vector3 l_direction = MathExtent.AngleToVector(ownKS.m_orientation);

            SURROGATE_TARGET.position = ownKS.m_position + l_direction;

            return(Seek.GetSteering(ownKS, SURROGATE_TARGET));
        }
Пример #7
0
        public static SteeringOutput GetSteering(KinematicState ownKS, ref SWander info)
        {
            info.m_targetOrientation           += info.m_wanderRate * MathExtent.Binomial();
            SURROGATE_TARGET.transform.position = MathExtent.AngleToVector(info.m_targetOrientation) * info.m_wanderRadius;

            SURROGATE_TARGET.transform.position += ownKS.m_position + MathExtent.AngleToVector(ownKS.m_orientation) * info.m_wanderOffset;

            return(Seek.GetSteering(ownKS, SURROGATE_TARGET));
        }
Пример #8
0
 protected virtual void ApplyLWYGI(SteeringOutput steering)
 {
     if (m_ownKS.m_linearVelocity.magnitude > 0.001f)
     {
         transform.rotation    = Quaternion.Euler(0f, MathExtent.VectorToAngle(m_ownKS.m_linearVelocity), 0f);
         m_ownKS.m_orientation = transform.rotation.eulerAngles.y;
     }
     steering.m_angularActive = false;
 }
Пример #9
0
        public static SteeringOutput GetSteering(KinematicState me, SKeepPosition info)
        {
            float targetOrientation = info.m_target.transform.eulerAngles.y;

            targetOrientation += info.m_requiredAngle;

            Vector3 finalTargetPosition = MathExtent.AngleToVector(targetOrientation).normalized;

            finalTargetPosition *= info.m_requiredDistance;

            SURROGATE_TARGET.position = info.m_target.position + finalTargetPosition;

            return(Seek.GetSteering(me, SURROGATE_TARGET));
        }
Пример #10
0
        public static SteeringOutput GetSteering(KinematicState ownKS, SIntercept info)
        {
            if (info.m_targetLinearVelocity == null)
            {
                return(NULL_STEERING);
            }

            float l_predictedTimeToTarget = (info.m_target.position - ownKS.m_position).magnitude / ownKS.m_linearVelocity.magnitude;

            l_predictedTimeToTarget = MathExtent.Clip(l_predictedTimeToTarget, info.m_maxPredictionTime);

            SURROGATE_TARGET.position = info.m_target.position + (info.m_targetLinearVelocity * l_predictedTimeToTarget);

            return(Seek.GetSteering(ownKS, SURROGATE_TARGET));
        }
Пример #11
0
 protected virtual void ApplyLWYG(SteeringOutput steering)
 {
     if (m_ownKS.m_linearVelocity.magnitude > 0.001f)
     {
         SURROGATE_TARGET.transform.rotation = Quaternion.Euler(0, MathExtent.VectorToAngle(m_ownKS.m_linearVelocity), 0);
         m_alignInfo.m_target = SURROGATE_TARGET;
         SteeringOutput st = Align.GetSteering(m_ownKS, m_alignInfo);
         steering.m_angularAcceleration = st.m_angularAcceleration;
         steering.m_angularActive       = st.m_angularActive;
     }
     else
     {
         steering.m_angularActive = false;
     }
 }
Пример #12
0
        public static SteeringOutput GetSteering(KinematicState ownKS, SEvade info)
        {
            if (info.m_targetLinearVelocity == null)
            {
                return(NULL_STEERING);
            }

            float l_distanceToMe           = (ownKS.m_position - info.m_target.position).magnitude;
            float l_predictedCollisionTime = l_distanceToMe / info.m_targetLinearVelocity.magnitude;

            l_predictedCollisionTime = MathExtent.Clip(l_predictedCollisionTime, info.m_maxPredictionTime);

            SURROGATE_TARGET.position = info.m_target.position + info.m_targetLinearVelocity * l_predictedCollisionTime;

            return(Flee.GetSteering(ownKS, SURROGATE_TARGET));
        }
Пример #13
0
        public static SteeringOutput GetSteering(KinematicState ownKS, SVelocityMatching info)
        {
            if (info.m_targetLinearVelocity == null)
            {
                return(NULL_STEERING);
            }

            Vector3 l_requiredAcceleration = (info.m_targetLinearVelocity - ownKS.m_linearVelocity) / info.m_timeToDesiredVelocity;

            l_requiredAcceleration = MathExtent.Clip(l_requiredAcceleration, ownKS.m_maxLinearAcceleration);

            SteeringOutput l_result = new SteeringOutput();

            l_result.m_linearAcceleration = l_requiredAcceleration;

            return(l_result);
        }
Пример #14
0
        public static SteeringOutput GetSteering(KinematicState ownKS, SAlign info)
        {
            float l_requiredAngularSpeed;
            float l_requiredAngularAcceleration;
            float l_angleSize;

            float l_requiredRotation = info.m_target.rotation.eulerAngles.y - ownKS.m_orientation;

            if (l_requiredRotation < 0f)
            {
                l_requiredRotation += 360f;
            }

            if (l_requiredRotation > 180f)
            {
                l_requiredRotation = -(360f - l_requiredRotation);
            }

            l_angleSize = Mathf.Abs(l_requiredRotation);

            if (l_angleSize <= info.m_closeEnoughAngle)
            {
                return(NULL_STEERING);
            }

            if (l_angleSize > info.m_slowDownAngle)
            {
                l_requiredAngularSpeed = ownKS.m_maxAngularSpeed;
            }
            else
            {
                l_requiredAngularSpeed = ownKS.m_maxAngularSpeed * (l_angleSize - info.m_slowDownAngle);
            }

            l_requiredAngularSpeed       *= Mathf.Sign(l_requiredRotation);
            l_requiredAngularAcceleration = (l_requiredAngularSpeed - ownKS.m_angularSpeed) / info.m_timeToDesiredAngularSpeed;

            l_requiredAngularAcceleration = MathExtent.Clip(l_requiredAngularAcceleration, ownKS.m_maxAngularAcceleration, true);

            SteeringOutput result = new SteeringOutput();

            result.m_angularAcceleration = l_requiredAngularAcceleration;
            return(result);
        }
Пример #15
0
        void Update()
        {
            //Get Accelerations
            SteeringOutput l_steering = GetSteering();

            //Stop if there is no acceleration
            if (l_steering == null)
            {
                m_ownKS.m_linearVelocity = Vector3.zero;
                m_ownKS.m_angularSpeed   = 0f;
                return;
            }

            float dt = Time.deltaTime;

            //Apply linear accelerations
            if (l_steering.m_linearActive)
            {
                m_ownKS.m_linearVelocity = m_ownKS.m_linearVelocity + l_steering.m_linearAcceleration * dt;
                m_ownKS.m_linearVelocity = MathExtent.Clip(m_ownKS.m_linearVelocity, m_ownKS.m_maxLinearSpeed);

                m_ownKS.m_position += m_ownKS.m_linearVelocity * dt + 0.5f * l_steering.m_linearAcceleration * dt * dt;
                transform.position  = m_ownKS.m_position;
            }
            else
            {
                m_ownKS.m_linearVelocity = Vector3.zero;
            }

            //Apply angular Accelerations
            if (l_steering.m_angularActive)
            {
                m_ownKS.m_angularSpeed = m_ownKS.m_angularSpeed + l_steering.m_angularAcceleration * dt;
                m_ownKS.m_angularSpeed = MathExtent.Clip(m_ownKS.m_angularSpeed, m_ownKS.m_maxAngularSpeed, true);

                m_ownKS.m_orientation += m_ownKS.m_angularSpeed * dt + 0.5f * l_steering.m_angularAcceleration * dt * dt;
                transform.rotation     = Quaternion.Euler(0f, m_ownKS.m_orientation, 0f);
            }
            else
            {
                m_ownKS.m_angularSpeed = 0f;
            }
        }
Пример #16
0
        public static SteeringOutput GetSteering(KinematicState ownKS, SNaiveWander info)
        {
            ownKS.m_orientation += info.m_wanderRate * MathExtent.Binomial();

            return(GoWhereYouLook.GetSteering(ownKS));
        }
Пример #17
0
        public static SteeringOutput GetSteering(KinematicState ownKS, SAlign info)
        {
            SURROGATE_TARGET.rotation = Quaternion.Euler(SURROGATE_TARGET.eulerAngles.x, MathExtent.VectorToAngle(info.m_target.position - ownKS.m_position), SURROGATE_TARGET.eulerAngles.z);
            info.m_target             = SURROGATE_TARGET;

            return(Align.GetSteering(ownKS, info));
        }