- Home /
Zombie AI scripts
Hello i found two scripts on the Internet, one finds the closest target and one attacks and follows and stuff but i need to put them together so that the zombie knows what target is closest and use the other script to attack and follow when the tagged object is within distance, Can anybody study the script and try to combine them as i want? Please?
Script 1:
var target : Transform; //the enemy's target
var moveSpeed = 3; //move speed
var rotationSpeed = 3; //speed of turning
var attackThreshold = 1.5; // distance within which to attack
var chaseThreshold = 10; // distance within which to start chasing
var giveUpThreshold = 20; // distance beyond which AI gives up
var attackRepeatTime = 1; // delay between attacks when within range
private var chasing = false;
public var attackTime : float;
var myTransform : Transform; //current transform data of this enemy
function Awake()
{
myTransform = transform; //cache transform data for easy access/preformance
}
function Start()
{
if (target == null && GameObject.FindWithTag("Player"))
target = GameObject.FindWithTag("Player").transform;
}
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;
animation.Play("run");
// 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 > attackRepeatTime) {
animation.Play("attack");
target.SendMessage("ApplyDamage",10);
// Attack! (call whatever attack function you like here)
}
if (distance < attackThreshold) {
moveSpeed=0;
//stop when close enough
}
attackTime = Time.time+ attackRepeatTime;
}
else {
// not currently chasing.
animation.Play("idle");
// start chasing if target comes close enough
if (distance < chaseThreshold) {
chasing = true;
}
}
}
function OnTriggerEnter (other: Collider) {
if (other.gameObject.CompareTag("Bullet")){
chaseThreshold=100000000;
}
}
Script 2:
// the tag to search for (set this value in the inspector)
var searchTag = "Respawn";
// the frequency with which to re-scane for new nearest target in seconds // (set in inspector) var scanFrequency = 1.0;
// the current target private var target : Transform;
function Start() { // set up repeating scan for new targets: InvokeRepeating("ScanForTarget", 0, scanFrequency ); }
function Update() { // we rotate to look at the target every frame (if there is one) if (target != null) { transform.LookAt(target); } }
function ScanForTarget() { // this should be called less often, because it could be an expensive // process if there are lots of objects to check against target = GetNearestTaggedObject();
}
function GetNearestTaggedObject() : Transform { // and finally the actual process for finding the nearest object:
var nearestDistanceSqr = Mathf.Infinity;
var taggedGameObjects = GameObject.FindGameObjectsWithTag(searchTag);
var nearestObj : Transform = null;
// loop through each tagged object, remembering nearest one found
for (var obj : GameObject in taggedGameObjects) {
var objectPos = obj.transform.position;
var distanceSqr = (objectPos - transform.position).sqrMagnitude;
if (distanceSqr < nearestDistanceSqr) {
nearestObj = obj.transform;
nearestDistanceSqr = distanceSqr;
}
}
return nearestObj;
}
first of all, please properly format the code, select it all, and then hit the little code button, this will format it easier so we can read it and help!
why do i always seem to get a parsing error on line (1,12) when i try to enable script 1? what's going on... (Assets/Scripts/Zombie AI.cs(1,12): error CS8025: Parsing error)
Answer by darkforce1980 · Apr 09, 2012 at 10:37 AM
I think jeg can do somthing better for you:
this script below find the target.. attakt it .... and kill it ... if it cant find og lost a target....it go to den nearste wayponit...and start look for it with this setup there is 5 waypoint and one target
var wayPoint1 : Transform; var wayPoint2 : Transform; var wayPoint3 : Transform; var wayPoint4 : Transform; var wayPoint5 : Transform; var victim : Transform; var speed : float; var lastWaypoint=0;
var rotationSpeed : float;
var damage : int; var dice : int = 1; var baseDamage : int = 1;
private var myTransform : Transform;
//set monster states to a number for easy checking easy to add more states private var idle : int = 0; private var returnToSpawn : int = 1; private var chasePlayer : int = 2; private var attackPlayer : int = 3; private var dead :int = 4;
private var status = returnToSpawn; private var monsterStats : String; private var seconds : int; private var savedTime : int;
function Awake() { myTransform = transform;
} function OnGUI() { GUI.Box(Rect(220,10,200,100), monsterStats); }
function Update() { var target : Transform; var dist1 = Vector3.Distance(wayPoint1.position, myTransform.position); var dist2 = Vector3.Distance(wayPoint2.position, myTransform.position); var dist3 = Vector3.Distance(wayPoint3.position, myTransform.position); var dist4 = Vector3.Distance(wayPoint4.position, myTransform.position); var dist5 = Vector3.Distance(wayPoint5.position, myTransform.position); var aggro = Vector3.Distance(victim.position, myTransform.position); var statusString :String; seconds = Time.time;
if(aggro > 20) status = returnToSpawn; else if(aggro == 20 || aggro < 20 && aggro > 2) status = chasePlayer; else if(aggro < 2) status = attackPlayer;
/ if (dist > 50 ||(aggro > 20 && dist > 3)) status = returnToSpawn; else if(dist <30 && (aggro < 20 && aggro > 2)) status = chasePlayer; else if(aggro < 2) status = attackPlayer; / switch(status) { case returnToSpawn:
//Find næsten waypoint hvis du er mere end 4 meter fra det og du har miste spiller eller aldrig har set ham
if(dist1 < dist2 && dist1 < dist3 && dist1 < dist4 && dist1 < dist5 && dist1 > 4 && lastWaypoint == 0){
target = wayPoint1;
lastWaypoint = 1;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint1";
Debug.Log("miste spiller gå til ");
break;
}
if(dist2 < dist3 && dist2 < dist4 && dist2 < dist5 && dist2 < dist1 && dist2 > 4 && lastWaypoint == 0){
target = wayPoint2;
lastWaypoint = 2;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint1";
Debug.Log("1");
break;
}
else if(dist3 < dist4 && dist3 < dist5 && dist3 < dist1 && dist3 < dist2 && dist3 > 4 && lastWaypoint == 0){
target = wayPoint3;
lastWaypoint = 3;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint3";
Debug.Log("1");
break;
}
else if(dist4 < dist5 && dist4 < dist1 && dist4 < dist2 && dist4 < dist3 && dist4 > 4 && lastWaypoint == 0){
target = wayPoint4;
lastWaypoint = 4;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint4";
Debug.Log("1");
break;
}
else if(dist5 < dist1 && dist5 < dist2 && dist5 < dist3 && dist5 < dist4 && dist5 > 4 && lastWaypoint == 0){
target = wayPoint5;
lastWaypoint = 5;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint5";
Debug.Log("1");
break;
}
//Find næsten waypoint hvis du er mindre eller ligmed 4 meter fra det og du har miste spiller eller aldrig har set ham
if(dist1 < dist2 && dist1 < dist3 && dist1 < dist4 && dist1 < dist5 && dist1 <= 4 && lastWaypoint == 0){
target = wayPoint2;
lastWaypoint = 2;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint2";
Debug.Log("1");
break;
}
if(dist2 < dist3 && dist2 < dist4 && dist2 < dist5 && dist2 < dist1 && dist1 <= 4 && lastWaypoint == 0){
target = wayPoint3;
lastWaypoint = 3;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint1";
Debug.Log("1");
break;
}
else if(dist3 < dist4 && dist3 < dist5 && dist3 < dist1 && dist3 < dist2 && dist3 <= 4 && lastWaypoint == 0){
target = wayPoint4;
lastWaypoint = 4;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint4";
Debug.Log("1");
break;
}
else if(dist4 < dist5 && dist4 < dist1 && dist4 < dist2 && dist4 < dist3 && dist4 <= 4 && lastWaypoint == 0){
target = wayPoint5;
lastWaypoint = 5;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint4";
Debug.Log("1");
break;
}
else if(dist5 < dist1 && dist5 < dist2 && dist5 < dist3 && dist5 < dist4 && dist5 <= 4 && lastWaypoint == 0){
target = wayPoint1;
lastWaypoint = 1;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint1";
Debug.Log("1");
break;
}
//Gå hen til dit waypoint
if(dist1 < dist2 && dist1 < dist3 && dist1 < dist4 && dist1 < dist5 && dist1 > 4 && lastWaypoint == 1){
target = wayPoint1;
lastWaypoint = 1;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint1";
Debug.Log("Gå til waypoint 1");
break;
}
if(dist2 < dist3 && dist2 < dist4 && dist2 < dist5 && dist2 < dist1 && dist2 > 4 && lastWaypoint == 2){
target = wayPoint2;
lastWaypoint = 2;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint1";
Debug.Log("1");
break;
}
else if(dist3 < dist4 && dist3 < dist5 && dist3 < dist1 && dist3 < dist2 && dist3 > 4 && lastWaypoint == 3){
target = wayPoint3;
lastWaypoint = 3;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint3";
Debug.Log("1");
break;
}
else if(dist4 < dist5 && dist4 < dist1 && dist4 < dist2 && dist4 < dist3 && dist4 > 4 && lastWaypoint == 4){
target = wayPoint4;
lastWaypoint = 4;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint4";
Debug.Log("1");
break;
}
else if(dist5 < dist1 && dist5 < dist2 && dist5 < dist3 && dist5 < dist4 && dist5 > 4 && lastWaypoint == 5){
target = wayPoint5;
lastWaypoint = 5;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint5";
Debug.Log("1");
break;
}
//Gå hen til næste til næste waypoint
if(dist1 < dist2 && dist1 < dist3 && dist1 < dist4 && dist1 < dist5 && dist1 <= 4 && lastWaypoint == 1){
target = wayPoint2;
lastWaypoint = 2;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint2";
Debug.Log("gå til waypoint 2");
break;
}
if(dist2 < dist3 && dist2 < dist4 && dist2 < dist5 && dist2 < dist1 && dist2 <= 4 && lastWaypoint == 2){
target = wayPoint3;
lastWaypoint = 3;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint3";
Debug.Log("1");
break;
}
else if(dist3 < dist4 && dist3 < dist5 && dist3 < dist1 && dist3 < dist2 && dist3 <= 4 && lastWaypoint == 3){
target = wayPoint4;
lastWaypoint = 4;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint4";
Debug.Log("1");
break;
}
else if(dist4 < dist5 && dist4 < dist1 && dist4 < dist2 && dist4 < dist3 && dist4 <= 4 && lastWaypoint == 4){
target = wayPoint5;
lastWaypoint = 5;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint4";
Debug.Log("1");
break;
}
else if(dist5 < dist1 && dist5 < dist2 && dist5 < dist3 && dist5 < dist4 && dist5 <= 4 && lastWaypoint == 5){
target = wayPoint1;
lastWaypoint = 1;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint1";
Debug.Log("1");
break;
}
//Gå til et waypoint selvom du er tættere på et andet
if(dist1 < dist2 && dist1 < dist3 && dist1 < dist4 && dist1 < dist5 && dist2 > 4 && lastWaypoint == 2){
target = wayPoint2;
lastWaypoint = 2;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint2";
Debug.Log("Gå til waypoint 2");
break;
}
if(dist2 < dist3 && dist2 < dist4 && dist2 < dist5 && dist2 < dist1 && dist3 > 4 && lastWaypoint == 3){
target = wayPoint3;
lastWaypoint = 3;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint3";
Debug.Log("1");
break;
}
else if(dist3 < dist4 && dist3 < dist5 && dist3 < dist1 && dist3 < dist2 && dist4 > 4 && lastWaypoint == 4){
target = wayPoint4;
lastWaypoint = 4;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint4";
Debug.Log("1");
break;
}
else if(dist4 < dist5 && dist4 < dist1 && dist4 < dist2 && dist4 < dist3 && dist5 > 4 && lastWaypoint == 5){
target = wayPoint5;
lastWaypoint = 5;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint5";
Debug.Log("1");
break;
}
else if(dist5 < dist1 && dist5 < dist2 && dist5 < dist3 && dist5 < dist4 && dist1 > 4 && lastWaypoint == 1){
target = wayPoint1;
lastWaypoint = 1;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/2) * Time.deltaTime;
statusString = "wayPoint1";
Debug.Log("1");
break;
}
case chasePlayer:
target = victim;
lastWaypoint = 0;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime);
myTransform.position += transform.forward * (speed/1) * Time.deltaTime;
statusString = "Chase";
break;
case attackPlayer:
target = victim;
lastWaypoint = 0;
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed *Time.deltaTime);
statusString = "Attack";
if ( aggro > 1 )
status = chasePlayer;
if(seconds != savedTime)
{
damage =(((Random.Range(1,baseDamage)) * (Random.Range(1, dice)))* seconds);
Spillerliv.playLives = -damage;
savedTime = seconds;
}
}
myTransform.eulerAngles = new Vector3(0,myTransform.eulerAngles.y, 0);
monsterStats = "Spawn Distance: " + dist1 + "\nVictim Distance: " + aggro + "\nStatus: " + statusString + "\nDamage: " + damage + "\nseconds: " + seconds + "\nsavedTime: " + savedTime;
}
the next scrip you need to put on your player...for him to have life and lost life
static var playLives: int; function OnGUI(){ GUI.Label(Rect(10,30,200,50),"Heath: " + (playLives+100) + "% "); if(playLives <= -100) Destroy(gameObject); }
I am working on finding a way to make this must bettere put it that best I got so far.
I am the teamleader of a gamedevelloping team.... we are all close to newbee in the this ...but we hope to make a good game and start firm to sell og develpoiing more games... we are at this time... 6 in our team now... sinds we are both working on a zombie like game ...why not try to work together and share good info about making AI and maybe other things in the game .... find me on facebook my email is borget@hotmail.com use it to find me..... I do not read my email most of the time soo you facebook
@allenziff you probably didn't implement it correctly. I'd suggest reading it in-depth and try to understand what each part does. Consider and appreciate it's length.
I worked on the script for a little bit and i got it to work, Thank you so much for posting it. -darkforce1980
can you tell me how to identify the idetifiers? like returToSpawn chase player and etc.
@Ipwndthebeast just add this at the start of the script
var returnToSpawn: GameObject;
var chasePlayer: GameObject;
var attackPlayer: GameObject;
var Spillerliv: GameObject;
This script is good. Thanks @darkforce1980.
Answer by YoungDeveloper · Nov 24, 2014 at 10:19 PM
If you want free sample for zombie AI and weapons check OMA kit. Free download is on his page. https://www.youtube.com/watch?v=C32N5lfrBNo&list=UU1IdQuZ390hhqacNIHICUWw
thats an FPS kit some of us want to make our own :) its aight to use to learn though
Your answer
Follow this Question
Related Questions
Multiple Cars not working 1 Answer
Need help with javascript AI 1 Answer
zombie ai script 1 Answer
ZOMBIE AI SCRIPT 1 Answer
Zombie attack script help 1 Answer