public override State Tick(Enemy_Manager enemyManager, Enemy_Stats enemyStats, EnemyAnimatorManager enemyAnimatorManager) { if (isSleeping && enemyManager.isInteracting == false) { //play sleep anim Debug.Log("Is sleeping"); enemyAnimatorManager.PlayTargetAnimation(sleepAnimation, true); } #region Handle Target Detection Collider[] colliders = Physics.OverlapSphere(enemyManager.transform.position, detectionRadius, detectionLayer); for (int i = 0; i < colliders.Length; i++) { CharacterStats characterStats = colliders[i].transform.GetComponent <CharacterStats>(); if (characterStats != null) { Vector3 targetsDirection = characterStats.transform.position - enemyManager.transform.position; float viewableAngle = Vector3.Angle(targetsDirection, enemyManager.transform.forward); if (viewableAngle > enemyManager.minimumDetectionAngle && viewableAngle < enemyManager.maximumDetectionAngle) { enemyManager.currentTarget = characterStats; isSleeping = false; //play wake animation Debug.Log("Is awake!"); enemyAnimatorManager.PlayTargetAnimation(wakeAnimation, true); } } } #endregion #region Handle State Change if (enemyManager.currentTarget != null) { return(pursueTargetState); } else { return(this); } #endregion }
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); }