void Update() { if (character == null) { return; } //随机播放声音 if (Time.time > soundTime + soundTimeDuration) { character.PlayIdleSound(); soundTimeDuration = Random.Range(0, IdleSoundDelay); soundTime = Time.time; } if (!isServer || !character.IsAlive) { return; } float fps = (1 / Time.deltaTime); float delay = (fps / AIUpdateRate) * Time.deltaTime; currentDistanceWeapon = character.PrimaryWeaponDistance; if (currentDistanceWeapon > DistanceAttack) { currentDistanceWeapon = DistanceAttack; } if (Time.time > timeTmp + delay) { //随时间而更新 timeTmp = Time.time; character.isSeeAround = UnitZ.aiManager.IsPlayerAround(this.transform.position, SyncDistance); float distance = Vector3.Distance(PositionTarget, this.gameObject.transform.position); //如果目标存在 if (ObjectTarget != null) { DamageManager targetdamagemanager = ObjectTarget.GetComponent <DamageManager>(); PositionTarget = ObjectTarget.transform.position; Debug.DrawLine(this.transform.position, PositionTarget, Color.blue); Vector3 noise = new Vector3(Random.Range(-100, 100) / 100.0f, Random.Range(-100, 100) / 100.0f, Random.Range(-100, 100) / 100.0f) * (Accuracy - 1); if (Pointer != null) { Pointer.forward = ((PositionTarget + noise + (Vector3.up * Random.Range(0, 100) / 100.0f)) - Pointer.position).normalized; } if (aiTime <= 0) { aiState = Random.Range(0, 4); aiTime = Random.Range(1, CombatTime); if (distance < DistanceKill) { //如果目标距离很近,AI只能站立或者射击。 aiState = Random.Range(0, 2); } if (aiState == 0) { //站立 PositionMove = this.transform.position; } if (aiState == 1 || aiState == 2) { //移动到安全区 PositionMove = getRandomGo(); } } else { aiTime -= (1 / AIUpdateRate); } //远距离攻击 if (distance <= currentDistanceWeapon) { //如果AI看到一个可射击的目标 if (canSeeTarget(Pointer.transform.position, ObjectTarget)) { if (aiState == 0) { //站立射击 Attack(); PositionMove = this.transform.position; targetDirection = (PositionTarget - this.transform.position); } if (aiState == 1) { //移动射击 Attack(); PositionMove = positionMoveTmp; targetDirection = (PositionTarget - this.transform.position); } if (aiState == 2) { isShooting = false; //跑到安全区袭击后来者 PositionMove = positionMoveTmp; targetDirection = navAgent.desiredVelocity.normalized; } timeTmpLoseTarget = Time.time; } else { if (aiState != 2) { //如果看不到目标,就去寻找目标 PositionMove = PositionTarget; } targetDirection = navAgent.desiredVelocity.normalized; isShooting = false; //如果一段时间看不到目标,AI就失去目标 if (Time.time >= timeTmpLoseTarget + TimeLoseTarget) { ObjectTarget = null; return; } } } else { //如果目标距离比移动距离更近,AI可以移动到目标 if (distance <= DistanceMoveTo) { if (aiState == 0) { //战力等待 Attack(); PositionMove = this.transform.position; targetDirection = (PositionTarget - this.transform.position); } if (aiState == 1) { //移动到目标 PositionMove = PositionTarget; targetDirection = (PositionTarget - this.transform.position); } if (aiState == 2) { //跑到安全区 PositionMove = positionMoveTmp; targetDirection = navAgent.desiredVelocity.normalized; } } else { //如果目标距离过远,就失去目标 ObjectTarget = null; aiState = 0; } } if (targetdamagemanager && !targetdamagemanager.IsAlive) { ObjectTarget = null; aiState = 0; } SetDestination(PositionMove); } else { isShooting = false; //当战斗启用时,AI可以搜寻并攻击目标 if (Fighting) { ObjectTarget = findTarget(); } if (ObjectTarget != null) { aiState = 0; return; } if (aiState == 0) { //aistate=0 意味着AI是自由的,可以移动到任何地方 aiState = 1; aiTime = Random.Range(1, IdleTime); PositionTarget = getRandomGo(); PositionMove = PositionTarget; SetDestination(PositionMove); } if (aiTime <= 0) { //随机AI状态 aiState = 0; } else { aiTime -= (1 / AIUpdateRate); } //面对其他方向 targetDirection = navAgent.desiredVelocity.normalized; } if (!LockTarget) { findTarget(); } } attacking(); Quaternion targetRotation = this.transform.rotation; //旋转视角看目标 if (targetDirection != Vector3.zero) { targetRotation = Quaternion.LookRotation(targetDirection); targetRotation.x = 0; targetRotation.z = 0; transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, TurnSpeed * Time.deltaTime); } if (navAgent) { Debug.DrawLine(this.transform.position, PositionMove, Color.green); navAgent.speed = character.GetCurrentMoveSpeed(); } }
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); }
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; } if (isServer && character.IsAlive) { float fps = (1 / Time.deltaTime); float delay = (fps / AIUpdateRate) * Time.deltaTime; // calculate delay of sending if (Time.time > timeTmp + delay) { // sending by time timeTmp = Time.time; character.isServerControl = true; // get attack distance from primary weapon. DistanceAttack = character.PrimaryWeaponDistance; float distance = Vector3.Distance(PositionTarget, this.gameObject.transform.position); 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) { DamageManager targetdamagemanager = ObjectTarget.GetComponent <DamageManager>(); PositionTarget = ObjectTarget.transform.position; if (aiTime <= 0) { aiState = Random.Range(0, 4); aiTime = Random.Range(10, 100); } else { aiTime--; } // attack in distance. if (distance <= DistanceAttack) { if (aiState == 0 || BrutalMode) { 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)); } } } if (targetdamagemanager && !targetdamagemanager.IsAlive) { ObjectTarget = null; } } else { float length = float.MaxValue; for (int t = 0; t < TargetTag.Length; t++) { // Finding all the targets by Tags. TargetCollector targetget = UnitZ.aiManager.FindTargetTag(TargetTag[t]); if (targetget != null) { GameObject[] targets = targetget.Targets; if (targets != null && targets.Length > 0) { for (int i = 0; i < targets.Length; i++) { DamageManager targetdamagemanager = targets[i].GetComponent <DamageManager>(); if (targetdamagemanager != null && targetdamagemanager.IsAlive) { float distancetargets = Vector3.Distance(targets[i].gameObject.transform.position, this.gameObject.transform.position); if ((distancetargets <= length && (distancetargets <= DistanceMoveTo || distancetargets <= DistanceAttack || RushMode)) && 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--; } } } if (navAgent) { navAgent.SetDestination(PositionTarget); navAgent.speed = character.GetCurrentMoveSpeed(); } } }
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; } if (!isServer || !character.IsAlive) { return; } float fps = (1 / Time.deltaTime); float delay = (fps / AIUpdateRate) * Time.deltaTime; currentDistanceWeapon = character.PrimaryWeaponDistance; if (currentDistanceWeapon > DistanceAttack) { currentDistanceWeapon = DistanceAttack; } if (Time.time > timeTmp + delay) { // update by time timeTmp = Time.time; float distance = Vector3.Distance(PositionTarget, this.gameObject.transform.position); // if Target is exist if (ObjectTarget != null) { DamageManager targetdamagemanager = ObjectTarget.GetComponent <DamageManager>(); PositionTarget = ObjectTarget.transform.position; Debug.DrawLine(this.transform.position, PositionTarget, Color.blue); Vector3 noise = new Vector3(Random.Range(-100, 100) / 100.0f, Random.Range(-100, 100) / 100.0f, Random.Range(-100, 100) / 100.0f) * (Accuracy - 1); if (Pointer != null) { Pointer.forward = ((PositionTarget + noise + (Vector3.up * Random.Range(0, 100) / 100.0f)) - Pointer.position).normalized; } if (aiTime <= 0) { aiState = Random.Range(0, 4); aiTime = Random.Range(1, CombatTime); if (distance < DistanceKill) { // if target distance is closer than Distanc Kill, AI can only stand attack or move attack aiState = Random.Range(0, 2); } if (aiState == 0) { // stand PositionMove = this.transform.position; } if (aiState == 1 || aiState == 2) { // move to safe zone PositionMove = getRandomGo(); } } else { aiTime -= (1 / AIUpdateRate); } // attack in distance. if (distance <= currentDistanceWeapon) { // if see a target AI can attack if (canSeeTarget(Pointer.transform.position, ObjectTarget)) { if (aiState == 0) { // stand and attack Attack(); PositionMove = this.transform.position; targetDirection = (PositionTarget - this.transform.position); } if (aiState == 1) { // move and attack Attack(); PositionMove = positionMoveTmp; targetDirection = (PositionTarget - this.transform.position); } if (aiState == 2) { isShooting = false; // run to safe zone then attack later PositionMove = positionMoveTmp; targetDirection = navAgent.desiredVelocity.normalized; } timeTmpLoseTarget = Time.time; } else { if (aiState != 2) { // if cannot see a target, AI will go to finding a target PositionMove = PositionTarget; } targetDirection = navAgent.desiredVelocity.normalized; isShooting = false; // if cannot see a target for a while, AI lose Target if (Time.time >= timeTmpLoseTarget + TimeLoseTarget) { ObjectTarget = null; return; } } } else { // if target distance is closer than move to distance AI can move to a target if (distance <= DistanceMoveTo) { if (aiState == 0) { // stand and wait //Attack(); PositionMove = this.transform.position; targetDirection = (PositionTarget - this.transform.position); } if (aiState == 1) { // move to target PositionMove = PositionTarget; targetDirection = (PositionTarget - this.transform.position); } if (aiState == 2) { // run to safe zone PositionMove = positionMoveTmp; targetDirection = navAgent.desiredVelocity.normalized; } } else { // if target is out of distance, lose target ObjectTarget = null; aiState = 0; } } if (targetdamagemanager && !targetdamagemanager.IsAlive) { ObjectTarget = null; aiState = 0; } SetDestination(PositionMove); } else { isShooting = false; // AI can seek and attack a target when Fighting is Enabled if (Fighting) { ObjectTarget = findTarget(); } if (ObjectTarget != null) { aiState = 0; return; } if (aiState == 0) { // AI state == 0 mean AI is free, so moving to anywhere aiState = 1; aiTime = Random.Range(1, IdleTime); PositionTarget = getRandomGo(); PositionMove = PositionTarget; SetDestination(PositionMove); } if (aiTime <= 0) { // random AI state aiState = 0; } else { aiTime -= (1 / AIUpdateRate); } // faceing to a desier direction targetDirection = navAgent.desiredVelocity.normalized; } if (!LockTarget) { findTarget(); } } attacking(); Quaternion targetRotation = this.transform.rotation; // rotation to look at a target if (targetDirection != Vector3.zero) { targetRotation = Quaternion.LookRotation(targetDirection); targetRotation.x = 0; targetRotation.z = 0; transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, TurnSpeed * Time.deltaTime); } if (navAgent) { Debug.DrawLine(this.transform.position, PositionMove, Color.green); navAgent.speed = character.GetCurrentMoveSpeed(); } }