- Home /
How do i change this script to chase the closest target?
I've been having a lot of trouble on this, this script is on an enemy prefab in my multiplayer game i'm making. I didn't make the script so i'm having some trouble, would anyone be kind enough to edit this to chase the closest target(player)? Thanks, i would really appreciate it :D
var target : Transform; //the enemy's target
var moveSpeed = 3; //move speed
var rotationSpeed = 3; //speed of turning
var attackRange = 3; // distance within which to attack
var chaseRange = 10; // distance within which to start chasing
var giveUpRange = 20; // distance beyond which AI gives up
var attackRepeatTime : float = 1.5; // delay between attacks when within range
var anim : GameObject;
var maximumHitPoints = 5.0;
var hitPoints = 5.0;
var attack : AudioClip;
private var chasing = false;
private var attackTime : float;
var checkRay : boolean = false;
var idleAnim : String = "idle";
var walkAnim : String = "walk";
var attackAnim : String = "attack";
var dontComeCloserRange : int = 4;
private var myTransform : Transform; //current transform data of this enemy
function Awake(){
myTransform = transform; //cache transform data for easy access/preformance
anim.animation.wrapMode = WrapMode.Loop;
anim.animation[attackAnim].wrapMode = WrapMode.Once;
anim.animation[attackAnim].layer = 2;
anim.animation.Stop();
}
function Start(){
target = GameObject.FindWithTag("Player").transform;
}
function Update () {
target = GameObject.FindWithTag("Player").transform;
// check distance to target every frame:
var distance = (target.position - myTransform.position).magnitude;
if (distance < dontComeCloserRange){
moveSpeed = 0;
anim.animation[idleAnim].speed = .4;
anim.animation.CrossFade(idleAnim);
}else{
moveSpeed = Random.Range(4, 6);
anim.animation.CrossFade(walkAnim);
}
if (chasing) {
//move towards the player
myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
//rotate to look at the player
myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed*Time.deltaTime);
transform.eulerAngles = Vector3(0, transform.eulerAngles.y, 0);
// give up, if too far away from target:
if (distance > giveUpRange) {
chasing = false;
}
// attack, if close enough, and if time is OK:
if (distance < attackRange && Time.time > attackTime) {
anim.animation[attackAnim].speed = 2.0;
anim.animation.CrossFade(attackAnim);
target.SendMessage( "PlayerDamage", maximumHitPoints);
attackTime = Time.time + attackRepeatTime;
audio.PlayOneShot(attack, 1.0 / audio.volume);
}
} else {
// not currently chasing.
anim.animation[idleAnim].speed = .4;
anim.animation.CrossFade(idleAnim);
// start chasing if target comes close enough
if (distance < chaseRange) {
chasing = true;
}
}
}
function OnDrawGizmosSelected (){
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere (transform.position, attackRange);
Gizmos.color = Color.red;
Gizmos.DrawWireSphere (transform.position, chaseRange);
}
Answer by HarshadK · Apr 21, 2014 at 11:48 AM
See the FindClosestEnemy() function on this page from Unity documentation about GameObject.FindGameObjectsWithTag
I'm putting the same code here also for your reference:
using UnityEngine;
using System.Collections;
public class Example : MonoBehaviour {
GameObject FindClosestEnemy() {
GameObject[] gos;
gos = GameObject.FindGameObjectsWithTag("Enemy");
GameObject closest;
float distance = Mathf.Infinity;
Vector3 position = transform.position;
foreach (GameObject go in gos) {
Vector3 diff = go.transform.position - position;
float curDistance = diff.sqrMagnitude;
if (curDistance < distance) {
closest = go;
distance = curDistance;
}
}
return closest;
}
void Example() {
print(FindClosestEnemy().name);
}
}
Use the above code to understand the working and implement it in your code. Rather than giving you the fish, I am teaching you how to fish. ;-)
Thank you for trying to help me. But i'm not much of a coder, i managed to get most of what i wanted in my multiplayer game from other sites and such. Everything is working except for my code i posted. I appreciate that you took the time to try but i cant write coding. Thanks for the help :)
Your answer
Follow this Question
Related Questions
variable++ error... 1 Answer
find closest target? 1 Answer
How to stop an object of going to far 2 Answers
code for detecting if a 2d infinite runner player stopped moving because it hit a wall or something 1 Answer
How is the Bounds.SqrDistance calculated behind the scene? What algorithm/formula does it use? 2 Answers