private void Attack() { moveStep = aiAttackSpeed * Time.deltaTime; transform.position = Vector3.MoveTowards(transform.position, attackPosition, moveStep); if (Vector3.Distance(transform.position, attackPosition) < 1f) { //revert to defense state aiStates3D = AIStates3D.defense; } }
// Update is called once per frame void Update() { aiPrevPosition = transform.position; aiPrevRotation = transform.rotation.eulerAngles; boundsCheck(); //Evasion change logic if (Time.time - timeElapsed_Evade > nextEvadeStartDuration) { aiEvadeDir = aiEvadeDirections[Random.Range(0, aiEvadeDirections.Length - 1)]; if (aiEvadeDir == aiEvadeDirections[0])//left { evadeToPosition = new Vector3(transform.position.x - 0.5f, 0, transform.position.z); } else if (aiEvadeDir == aiEvadeDirections[1])//right { evadeToPosition = new Vector3(transform.position.x + 0.5f, 0, transform.position.z); } else if (aiEvadeDir == aiEvadeDirections[2])//front { evadeToPosition = new Vector3(transform.position.x, 0, transform.position.z - 0.5f); } timeElapsed_Evade = Time.time; } performEvasion(evadeToPosition); //State change logic if (Time.time - timeElapsed_StateChange > nextStateChangeDuration) { if (aiStates3D == AIStates3D.defense) { aiStates3D = AIStates3D.attack; } else { aiStates3D = AIStates3D.defense; } attackPosition = playerRef.transform.position;//get the recent player pos timeElapsed_StateChange = Time.time; } //If the player is nearer to AI if (Vector3.Distance(playerRef.transform.position, this.transform.position) < aiSafeDistance) { switch (aiStates3D) { case AIStates3D.attack: Attack(); break; case AIStates3D.defense: Defense(); break; } } if (Vector3.Distance(aiPrevPosition, transform.position) != 0) { //animator.play animator.SetBool("isMoving", true); } else { animator.SetBool("isMoving", false); } transform.LookAt(playerRef.transform); }