void Update() { if (character == null) { return; } // random play an idle sound. if (Time.time > soundTime + soundTimeDuration) { character.PlayIdleSound(); soundTimeDuration = Random.Range(0, IdleSoundDelay); soundTime = Time.time; } // get attack distance from primary weapon. DistanceAttack = character.PrimaryWeaponDistance; float distance = Vector3.Distance(PositionTarget, this.gameObject.transform.position); Vector3 targetDirectiom = (PositionTarget - this.transform.position); Quaternion targetRotation = this.transform.rotation; float str = TurnSpeed * Time.time; // rotation to look at a target if (targetDirectiom != Vector3.zero) { targetRotation = Quaternion.LookRotation(targetDirectiom); targetRotation.x = 0; targetRotation.z = 0; transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, str); } // if Target is exist if (ObjectTarget != null) { // lifeTimeTemp = Time.time; PositionTarget = ObjectTarget.transform.position; if (aiTime <= 0) { //aiState = Random.Range (0, 4); aiTime = Random.Range(10, 100); } else { aiTime--; } //Debug.Log(distance + "<="+ DistanceAttack); // attack only distance. if (distance <= DistanceAttack) { // Debug.Log("Attack : "+targetDirectiom); Attack(targetDirectiom); } else { if (distance <= DistanceMoveTo) { // rotation facing to a target. transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, str); } else { // if target is out of distance ObjectTarget = null; if (aiState == 0) { aiState = 1; aiTime = Random.Range(10, 500); PositionTarget = positionTemp + new Vector3(Random.Range(-PatrolRange, PatrolRange), 0, Random.Range(-PatrolRange, PatrolRange)); } } } } else { float length = float.MaxValue; for (int t = 0; t < TargetTag.Length; t++) { // Finding all the targets by Tags. GameObject[] targets = (GameObject[])GameObject.FindGameObjectsWithTag(TargetTag [t]); if (targets != null && targets.Length > 0) { for (int i = 0; i < targets.Length; i++) { float distancetargets = Vector3.Distance(targets [i].gameObject.transform.position, this.gameObject.transform.position); if ((distancetargets <= length && (distancetargets <= DistanceMoveTo || distancetargets <= DistanceAttack)) && ObjectTarget != targets [i].gameObject) { length = distancetargets; ObjectTarget = targets [i].gameObject; } } } } if (aiState == 0) { // AI state == 0 mean AI is free, so moving to anywhere aiState = 1; aiTime = Random.Range(10, 200); PositionTarget = positionTemp + new Vector3(Random.Range(-PatrolRange, PatrolRange), 0, Random.Range(-PatrolRange, PatrolRange)); } if (aiTime <= 0) { // random AI state aiState = Random.Range(0, 4); aiTime = Random.Range(10, 200); } else { aiTime--; } } character.MoveToPosition(PositionTarget); }