예제 #1
0
    public override State Tick(EnemyManager enemyManager, EnemyStats stats, EnemyAnimatorHandler animatorHandler)
    {
        Vector3 targetDirection = enemyManager.currentTarget.transform.position - enemyManager.transform.position;
        float   viewableAngle   = Vector3.Angle(targetDirection, transform.forward);

        if (currentAttack != null)
        {
            if (enemyManager.distanceFromTarget < currentAttack.distanceNeededToAttack.min)
            {
                return(this);
            }
            else if (enemyManager.distanceFromTarget < currentAttack.distanceNeededToAttack.max)
            {
                if (enemyManager.viewableAngle <= currentAttack.attackAngle * 0.5f)
                {
                    if (enemyManager.currentRecoveryTime <= 0f && !enemyManager.isPerformingAction)
                    {
                        animatorHandler.anim.SetFloat(AnimatorHandler.hashVertical, 0f, 0.1f, Time.deltaTime);
                        animatorHandler.anim.SetFloat(AnimatorHandler.hashHorizontal, 0f, 0.1f, Time.deltaTime);
                        animatorHandler.PlayTargetAnimation(currentAttack.actionAnimation, true);
                        enemyManager.isPerformingAction  = true;
                        enemyManager.currentRecoveryTime = currentAttack.recoveryTime;
                        currentAttack = null;
                        return(combatStanceState);
                    }
                }
            }
        }
        else
        {
            GetNewAttack(enemyManager);
        }
        return(combatStanceState);
    }
예제 #2
0
    public override State Tick(EnemyManager enemyManager, EnemyStats stats, EnemyAnimatorHandler animatorHandler)
    {
        if (enemyManager.isPerformingAction)
        {
            return(this);
        }

        Vector3 targetDirection = enemyManager.currentTarget.transform.position - enemyManager.transform.position;

        enemyManager.distanceFromTarget = targetDirection.magnitude;
        float viewableAngle = Vector3.Angle(targetDirection, transform.forward);

        if (enemyManager.distanceFromTarget > enemyManager.maxAttackingRange)
        {
            animatorHandler.anim.SetFloat(AnimatorHandler.hashVertical, 1f, 0.1f, Time.deltaTime);
        }
        else if (enemyManager.distanceFromTarget <= enemyManager.maxAttackingRange)
        {
            animatorHandler.anim.SetFloat(AnimatorHandler.hashVertical, 0f, 0.1f, Time.deltaTime);
        }

        HandleRotateTowardsTarget(enemyManager);
        enemyManager.agent.transform.localPosition = Vector3.zero;
        enemyManager.agent.transform.localRotation = Quaternion.identity;

        if (enemyManager.distanceFromTarget <= enemyManager.maxAttackingRange)
        {
            return(combatStanceState);
        }
        else
        {
            return(this);
        }
    }
예제 #3
0
    public override State Tick(EnemyManager enemyManager, EnemyStats stats, EnemyAnimatorHandler animatorHandler)
    {
        #region Handle Target detection
        Collider[] colliders = Physics.OverlapSphere(enemyManager.transform.position, enemyManager.detectionRadius, detectionLayer);
        for (int i = 0; i < colliders.Length; i++)
        {
            CharacterStats characterStats = colliders[i].transform.GetComponent <CharacterStats>();
            if (characterStats != null)
            {
                Vector3 targetDirection = characterStats.transform.position - enemyManager.transform.position;
                float   viewableAngle   = Vector3.Angle(targetDirection, enemyManager.transform.forward);

                if (viewableAngle > -enemyManager.detectionAngle && viewableAngle < enemyManager.detectionAngle)
                {
                    enemyManager.currentTarget = characterStats;
                }
            }
        }
        #endregion

        if (enemyManager.currentTarget != null)
        {
            return(pursueTargetState);
        }
        else
        {
            return(this);
        }
    }
예제 #4
0
 void Awake()
 {
     locomotion      = GetComponent <EnemyLocomotion>();
     animatorHandler = GetComponentInChildren <EnemyAnimatorHandler>();
     stats           = GetComponent <EnemyStats>();
     agent           = GetComponentInChildren <NavMeshAgent>();
     rigid           = GetComponent <Rigidbody>();
 }
예제 #5
0
    public override State Tick(EnemyManager enemyManager, EnemyStats stats, EnemyAnimatorHandler animatorHandler)
    {
        enemyManager.distanceFromTarget = Vector3.Distance(enemyManager.currentTarget.transform.position, enemyManager.transform.position);

        if (enemyManager.currentRecoveryTime <= 0f && enemyManager.distanceFromTarget <= enemyManager.maxAttackingRange)
        {
            return(attackState);
        }
        else if (enemyManager.distanceFromTarget > enemyManager.maxAttackingRange)
        {
            return(pursueTargetState);
        }
        else
        {
            return(this);
        }
    }
예제 #6
0
 public abstract State Tick(EnemyManager enemyManager, EnemyStats stats, EnemyAnimatorHandler animatorHandler);
예제 #7
0
 void Awake()
 {
     enemyManager    = GetComponent <EnemyManager>();
     animatorHandler = GetComponentInChildren <EnemyAnimatorHandler>();
 }
예제 #8
0
 void Start()
 {
     myAnimator = GetComponent <EnemyAnimatorHandler>();//?????
     myHealth   = GetComponent <Health>();
 }