Example #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);
    }
Example #2
0
    public override State Tick(Enemy_Manager enemyManager, Enemy_Stats enemyStats, EnemyAnimatorManager enemyAnimatorManager)
    {
        Vector3 targetDirection    = enemyManager.currentTarget.transform.position - transform.position;
        float   viewableAngle      = Vector3.Angle(targetDirection, transform.forward);
        float   distanceFromTarget = Vector3.Distance(enemyManager.currentTarget.transform.position, enemyManager.transform.position);

        HandleRotationTowardsTarget(enemyManager);
        //select one of our many attacks
        //if the selected attack is not able to be used because of bad angle or distance, select a new attack
        //if the attack is viable, stop our movement and attack the target
        //set our recovery timer to the attacks recovery time
        //return to the combat stance state

        #region Attacks

        if (enemyManager.isPerformingAction)
        {
            return(combatStanceState);
        }

        if (currentAttack != null)
        {
            //if too close, get new attack

            if (distanceFromTarget < currentAttack.minimumDistanceNeededToAttack)
            {
                return(this);
            }
            //if we are close enough to atack, then let us proceed
            else if (distanceFromTarget < currentAttack.maximumDistanceNeededToAttack)
            {
                //if our enemy is within our attacks viewable angle, we attack
                if (viewableAngle <= currentAttack.maximumAttackAngle &&
                    viewableAngle >= currentAttack.minimumAttackAngle)
                {
                    if (enemyManager.currentRecoveryTime <= 0 && enemyManager.isPerformingAction == false)
                    {
                        enemyAnimatorManager.anim.SetFloat("Vertical", 0, 0.1f, Time.deltaTime);
                        enemyAnimatorManager.anim.SetFloat("Horizontal", 0, 0.1f, Time.deltaTime);
                        enemyAnimatorManager.PlayTargetAnimation(currentAttack.actionAnimation, true);
                        enemyManager.isPerformingAction  = true;
                        enemyManager.currentRecoveryTime = currentAttack.recoveryTime;
                        currentAttack = null;
                        return(combatStanceState);
                    }
                }
            }
        }
        else
        {
            GetNewAttack(enemyManager);
        }

        return(combatStanceState);
    }
Example #3
0
    private void GetNewAttack(Enemy_Manager enemyManager)
    {
        Vector3 targetsDirection   = enemyManager.currentTarget.transform.position - transform.position;
        float   viewableAngle      = Vector3.Angle(targetsDirection, transform.forward);
        float   distanceFromTarget = Vector3.Distance(enemyManager.currentTarget.transform.position, transform.position);
        //Debug.Log("Distance from target currently is: " + distanceFromTarget);

        int maxScore = 0;

        for (int i = 0; i < enemyAttacks.Length; i++)
        {
            EnemyAttackAction enemyAttackAction = enemyAttacks[i];

            if (distanceFromTarget <= enemyAttackAction.maximumDistanceNeededToAttack &&
                distanceFromTarget >= enemyAttackAction.minimumDistanceNeededToAttack)
            {
                //Debug.Log("Enemy in Distance!");
                if (viewableAngle <= enemyAttackAction.maximumAttackAngle &&
                    viewableAngle >= enemyAttackAction.minimumAttackAngle)
                {
                    //Debug.Log("Grabbed Max Score!");
                    maxScore += enemyAttackAction.attackScore;
                }
            }
        }

        int randomValue    = Random.Range(0, maxScore);
        int temporaryScore = 0;

        for (int i = 0; i < enemyAttacks.Length; i++)
        {
            EnemyAttackAction enemyAttackAction = enemyAttacks[i];

            if (distanceFromTarget <= enemyAttackAction.maximumDistanceNeededToAttack &&
                distanceFromTarget >= enemyAttackAction.minimumDistanceNeededToAttack)
            {
                if (viewableAngle <= enemyAttackAction.maximumAttackAngle &&
                    viewableAngle >= enemyAttackAction.minimumAttackAngle)
                {
                    if (currentAttack != null)
                    {
                        return;
                    }

                    temporaryScore += enemyAttackAction.attackScore;

                    if (temporaryScore > randomValue)
                    {
                        currentAttack = enemyAttackAction;
                    }
                }
            }
        }
    }
Example #4
0
    private void GetNewAttack(EnemyManager enemyManager)
    {
        Vector3 targetsDirection = enemyManager.currentTarget.transform.position - transform.position;
        float   viewableAngle    = Vector3.Angle(targetsDirection, transform.forward);

        enemyManager.distanceFromTarget = targetsDirection.magnitude;

        List <EnemyAttackAction> possibleAttacks = new List <EnemyAttackAction>(attacks.Length);
        int maxScore = 0;

        foreach (var attackAction in attacks)
        {
            if (attackAction.distanceNeededToAttack.IsInRange(enemyManager.distanceFromTarget))
            {
                if (viewableAngle <= attackAction.attackAngle * 0.5f)
                {
                    maxScore += attackAction.attackScore;
                    possibleAttacks.Add(attackAction);
                }
            }
        }

        int random    = Random.Range(0, maxScore);
        int tempScore = 0;

        foreach (var attackAction in possibleAttacks)
        {
            if (currentAttack != null)
            {
                return;
            }

            tempScore += attackAction.attackScore;

            if (tempScore > random)
            {
                currentAttack = attackAction;
            }
        }
    }