// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { if (enemyTrash != null && enemyTrash.GetTarget() != null && enemyTrash.GetTarget().type == TargetType.TT_PLAYER) { Vector3 direction = enemyTrash.GetTarget().transf.position - enemyTrash.transform.position; var playerLayerMask = 1 << 12; // Cast ray to target in combat range RaycastHit hitC; bool combatRayHit = Physics.Raycast(enemyTrash.transform.position, direction, out hitC, enemyTrash.combatRange, playerLayerMask); // Cast ray to target in attack range RaycastHit hitA; bool attackRayHit = Physics.Raycast(enemyTrash.transform.position, direction, out hitA, enemyTrash.attackRange, playerLayerMask); // Debug draw combat ray Color rayColor; rayColor = combatRayHit ? Color.green : Color.red; Debug.DrawRay(enemyTrash.transform.position, direction, rayColor); bool change = true; if (!combatRayHit) { animator.SetTrigger("chase"); } else if (combatRayHit && !attackRayHit) { if (!randomCreated) { int num = Random.Range(0, 4); if (num == 0) { animator.SetTrigger("moveForward"); } else { animator.SetTrigger("moveAround"); } randomCreated = true; } } else if (attackRayHit) { enemyTrash.nav.Stop(); animator.SetTrigger("attack"); } else { change = false; } if (change) { animator.SetBool("combat", false); } } }
// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { if (enemyTrash == null) { enemyTrash = animator.transform.gameObject.GetComponent <EnemyTrash>(); enemyTrash.nav.Stop(); } int num = Random.Range(0, 2); if (num == 0) { rotationDirection = Vector3.up; } else { rotationDirection = Vector3.down; } moveAroundDuration = Random.Range(1.0f, 3.0f); startTime = Time.time; enemyTrash.transform.RotateAround(enemyTrash.GetTarget().transf.position, rotationDirection, enemyTrash.combatAngularSpeed * Time.deltaTime); }
// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { if (enemyTrash.nav.remainingDistance <= enemyTrash.attackRange) { enemyTrash.nav.Stop(); animator.SetBool("moveForward", false); animator.SetTrigger("attack"); //return enemyTrashTypes.ATTACK_STATE; } else if (enemyTrash.nav.remainingDistance > enemyTrash.combatRange) { animator.SetBool("moveForward", false); animator.SetBool("chase", true); } else { enemyTrash.nav.Resume(); if (enemyTrash.GetTarget() != null) { enemyTrash.nav.SetDestination(enemyTrash.GetTarget().transf.position); } } }
// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { if (enemyTrash.IsDead()) { animator.SetBool("die", true); if (!spawnedParticles) { spawnedParticles = true; enemyTrash.SpawnDeadParticles(); } } else if (enemyTrash.GetTarget() != null) { animator.SetBool("chase", true); } }
//OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { RaycastHit attackHit; Vector3 direction; bool rayAttackHit; Color rayColor; var targetLayerMask = 1 << 12; if (enemyTrash.GetTarget().transf != null) { switch (enemyTrash.GetTarget().type) { case TargetType.TT_PLAYER: // Cast ray to target in combat range direction = enemyTrash.GetTarget().transf.position - enemyTrash.transform.position; rayAttackHit = Physics.Raycast(enemyTrash.transform.position, direction, out attackHit, enemyTrash.combatRange, targetLayerMask); // Debug draw ray rayColor = rayAttackHit ? Color.green : Color.red; Debug.DrawRay(enemyTrash.transform.position, direction, rayColor); if (!rayAttackHit && !animator.GetBool("iddle")) { enemyTrash.nav.SetDestination(enemyTrash.GetTarget().transf.position); enemyTrash.nav.Resume(); } else if (rayAttackHit) { animator.SetBool("chase", false); animator.SetBool("combat", true); enemyTrash.nav.Stop(); } break; case TargetType.TT_ARTILLERY: // Cast ray to target in attack range direction = enemyTrash.GetTarget().transf.position - enemyTrash.transform.position; targetLayerMask = 1 << 19; rayAttackHit = Physics.Raycast(enemyTrash.transform.position, direction, out attackHit, enemyTrash.attackRange, targetLayerMask); // Debug draw ray rayColor = rayAttackHit ? Color.green : Color.red; Debug.DrawRay(enemyTrash.transform.position, direction, rayColor); // If not in attack range and have to go to the artillery calculate the target point out of the artillery and go there. if (!rayAttackHit && !animator.GetBool("iddle")) { RaycastHit destinationHit; Physics.Raycast(enemyTrash.transform.position, direction, out destinationHit, targetLayerMask); enemyTrash.nav.SetDestination(destinationHit.point); enemyTrash.nav.Resume(); } else { animator.SetBool("chase", false); animator.SetBool("attackArtillery", true); enemyTrash.nav.Stop(); } break; default: animator.SetBool("chase", false); animator.SetBool("iddle", true); break; } } else { animator.SetBool("chase", false); animator.SetBool("attackArtillery", false); animator.SetBool("combat", false); animator.SetBool("iddle", true); } }