Esempio n. 1
0
        protected override void Init(AIBehaviors fsm)
        {
            navMeshAgent = fsm.GetComponentInChildren <NavMeshAgent>();
            fsm.PlayAudio();

            nextCheckHasMovement = Time.time + checkHasMovementFrequency;

            player = fsm.GetClosestPlayer(objectFinder.GetTransforms());

            targetPosition = Vector3.zero;
        }
Esempio n. 2
0
 protected Transform GetTarget(AIBehaviors fsm)
 {
     if (findVisibleTargetsOnly)
     {
         return(fsm.GetClosestPlayerWithinSight(objectFinder.GetTransforms()));
     }
     else
     {
         return(fsm.GetClosestPlayer(objectFinder.GetTransforms()));
     }
 }
Esempio n. 3
0
        protected override void Action(AIBehaviors fsm)
        {
            if (!rotatesTowardTarget)
            {
                fsm.MoveAgent(fsm.transform, 0.0f, rotationSpeed);
            }
            else
            {
                Transform target = fsm.GetClosestPlayer(objectFinder.GetTransforms());

                if (target != null)
                {
                    fsm.MoveAgent(target, 0.0f, rotationSpeed);
                }
            }
        }
Esempio n. 4
0
        protected override void Action(AIBehaviors fsm)
        {
            Transform target = fsm.GetClosestPlayer(objectFinder.GetTransforms());
            string    attackAnimationName = animationStates[0].name;
            bool      useAnimationTime    = skinnedMeshRenderer == null || skinnedMeshRenderer.isVisible;

            if (!useAnimationTime && attackAnimation != null)
            {
                useAnimationTime = attackAnimation.cullingType == AnimationCullingType.AlwaysAnimate;
            }

            if (target != null)
            {
                HandlePreviousStateMovement(fsm, target);
            }

            AIAnimationState animState = fsm.animationStates.GetStateWithName(attackAnimationName);

            fsm.PlayAnimation(animState);

            if (scriptWithAttackMethod != null)
            {
                if (!string.IsNullOrEmpty(methodName))
                {
                    if (useAnimationTime && attackAnimation != null && attackAnimation[attackAnimationName] != null)
                    {
                        curAnimPosition = attackAnimation[attackAnimationName].normalizedTime % 1.0f;
                    }
                    else
                    {
                        curAnimPosition %= 1.0f;
                        curAnimPosition += Time.deltaTime / animationLength;
                    }

                    if (previousSamplePosition > attackPoint || curAnimPosition < attackPoint)
                    {
                        previousSamplePosition = curAnimPosition;
                        return;
                    }

                    previousSamplePosition = curAnimPosition;

                    TriggerCooldown();
                    Attack(fsm, target);
                }
            }
        }
Esempio n. 5
0
        protected override bool Reason(AIBehaviors fsm)
        {
            float sqrDist;

            // Checks if the flight ended
            switch (fleeMode)
            {
            case FleeMode.NearestTaggedObject:
            case FleeMode.FixedTarget:
                if (currentTarget != null)
                {
                    sqrDist = (fsm.aiTransform.position - currentTarget.position).sqrMagnitude;

                    if (sqrDist < sqrDistanceToTargetThreshold)
                    {
                        fsm.ChangeActiveState(flightEndedState);
                        return(false);
                    }
                }

                break;

            case FleeMode.Direction:
            case FleeMode.AwayFromNearestTaggedObject:
                Vector3 nearestObjectPosition = fsm.GetClosestPlayer(objectFinder.GetTransforms()).position;

                sqrDist = (fsm.aiTransform.position - nearestObjectPosition).sqrMagnitude;

                if (sqrDist > sqrStopFleeDistance)
                {
                    fsm.ChangeActiveState(flightEndedState);
                    return(false);
                }

                break;
            }

            return(true);
        }
Esempio n. 6
0
        public override Vector3 GetNextMovement(AIBehaviors fsm)
        {
            Vector3 result;

            switch (fleeMode)
            {
            case FleeMode.NearestTaggedObject:
                float nearestSqrDistance = Mathf.Infinity;
                int   targetIndex        = -1;

                for (int i = 0; i < fleeToObjects.Length; i++)
                {
                    Vector3 dist = fleeToObjects[i].transform.position - this.transform.position;

                    if (dist.sqrMagnitude < nearestSqrDistance)
                    {
                        nearestSqrDistance = dist.sqrMagnitude;
                        targetIndex        = i;
                    }
                }

                if (targetIndex != -1)
                {
                    currentTarget = fleeToObjects[targetIndex].transform;
                    result        = currentTarget.position;
                }
                else
                {
                    result = base.GetNextMovement(fsm);
                }

                break;

            case FleeMode.FixedTarget:
                if (fleeToTarget != null)
                {
                    currentTarget = fleeToTarget;
                    result        = fleeToTarget.position;
                }
                else
                {
                    Debug.LogWarning("Flee To Target isn't set for FleeState");
                    result = base.GetNextMovement(fsm);
                }

                break;

            case FleeMode.Direction:
                result = fsm.aiTransform.position + fleeDirection * stopFleeDistance;
                break;

            case FleeMode.AwayFromNearestTaggedObject:
                Vector3 nearestObjectPosition = fsm.GetClosestPlayer(objectFinder.GetTransforms()).position;
                Vector3 fsmPosition           = fsm.aiTransform.position;
                Vector3 direction             = (fsmPosition - nearestObjectPosition).normalized * stopFleeDistance;

                result = fsmPosition + direction;
                break;

            default:
                result = base.GetNextMovement(fsm);
                break;
            }

            return(result);
        }