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;

}

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 + "

Victim Distance: " + aggro + "
Status: " + statusString + "
Damage: " + damage + "
seconds: " + seconds + "
savedTime: " + 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

If you want free sample for zombie AI and weapons check OMA kit. Free download is on his page. - YouTube