- Home /
Enemy AI targeting script
Hey I am having trouble with my enemy AI script. The enemy targets work well. The only thing I can't figure out is how to make it so when the enemy gets so close to me he stops. The problem I am having now is he gets close and starts going around in circles. Here is the script if that helps!
var target : Transform; var moveSpeed = 3; var rotationSpeed = 3; var attackThreshold = 3; var chaseThreshold = 10; var maxDistance = 3; var giveUpThreshold = 20; var attackRepeatTime = 1;
private var chasing = false; private var attackTime = Time.time;
var myTransform : Transform;
function Awake() { myTransform = transform; }
function Start() { target = GameObject.FindWithTag("Player").transform; //target the player }
function Update () {
// check distance to target every frame:
var distance = (target.position - myTransform.position).magnitude;
if (chasing) {
//rotate to look at the player
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,
Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed*Time.deltaTime);
//move towards the player
myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
// give up, if too far away from target:
if (distance > giveUpThreshold) {
chasing = false;
}
// attack, if close enough, and if time is OK:
if (distance < attackThreshold && Time.time > attackTime) {
// Attack! (call whatever attack function you like here)
attackTime = Time.time + attackRepeatTime;
}
} else {
// not currently chasing.
// start chasing if target comes close enough
if (distance < chaseThreshold) {
chasing = true;
}
}
}
Answer by doomprodigy · Jan 17, 2012 at 06:28 AM
What you want to use for a easy method is just a
if (Vector3.Distance(other.position, transform.position) < tooClose){
moveSpeed = 0;
}
That way once the AI's distance between the player and the AI is less than the tooClose variable you cut the move speed to 0, then just simply add another distance script asking if the distance between the player and the AI is greater than tooClose and make the moveSpeed variable = 3 (or whatever your movespeed was).
This is essentially what you are doing there but you are just not cutting of the moveSpeed variable to 0 and then once you are greater than you tooClose variable putting it back to normal.
Answer by Robwhitlow3 · Jan 25, 2012 at 02:10 AM
Thank you so much! That worked perfectly :) Sorry for the late reply, between work and college I'm swamped. But you were a great help!
Ins$$anonymous$$d of using an answer as a reply use the comment and edit function as I am using now. Also if someone has solved your problem then accept there answer as the correct answer so that others no need to look at it while trying to help.
Ahhhhh gocha. Sorry about that :p Is there a different way I should put it in there?
Answer by Robwhitlow3 · Jan 25, 2012 at 03:16 AM
Sorry but it's actually not 100% working. The target stops following me like expected, but he doesn't start following back. I thought I did a right if, else statement. But Im new to this. Did I put It in the wrong spot or is it not formatted right?
var target : Transform; //the enemy's target
var moveSpeed = 3; //move speed
var rotationSpeed = 3; //speed of turning
var attackThreshold = 3; // distance within which to attack
var chaseThreshold = 10; // distance within which to start chasing
var maxDistance = 3;
var giveUpThreshold = 20; // distance beyond which AI gives up
var attackRepeatTime = 1; // delay between attacks when within range
var tooClose = 2;
private var chasing = false; private var attackTime = Time.time;
var myTransform : Transform; //current transform data of this enemy
function Awake() { myTransform = transform; //cache transform data for easy access/preformance }
function Start() { target = GameObject.FindWithTag("Player").transform; //target the player }
function Update () {
// check distance to target every frame:
var distance = (target.position - myTransform.position).magnitude;
if (chasing) {
if (Vector3.Distance(target.position, transform.position) < tooClose){
moveSpeed = 0;
else(Vector3.Distance(target.position, transform.position) > tooClose) {
moveSpeed = 3;
}
}
//rotate to look at the player
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,
Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed*Time.deltaTime);
//move towards the player
myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
// give up, if too far away from target:
if (distance > giveUpThreshold) {
chasing = false;
}
// attack, if close enough, and if time is OK:
if (distance < attackThreshold && Time.time > attackTime) {
// Attack! (call whatever attack function you like here)
attackTime = Time.time + attackRepeatTime;
}
} else {
// not currently chasing.
// start chasing if target comes close enough
if (distance < chaseThreshold) {
chasing = true;
}
}
}
Your answer
Follow this Question
Related Questions
2D Random AI 1 Answer
free roaming enemy ai 1 Answer
Ai Targetting feet instead of my body 2 Answers
faster target selection 2 Answers
A* pathfinding avoidance 0 Answers