Script not working properly, cannot figure out why.

Hello,

I am working on an AI. This AI has 2 states, specified by a boolean. When the boolean is false, the AI picks a random point and moves to it. When it reaches this point, it should pick another point to move to. For some reason, this doesnt work.

import System.Collections.Generic;
#pragma strict

//var players = new List.<GameObject>();
//		players.Add(array[i]);

//Players
var players : GameObject[];

//Who is it
var whoEverIsIt : GameObject;

//Who to target whilst it
var closestPlayer : GameObject;

//Am I it?
var it : boolean = false;

//Point to run to
private var point : Vector3;

//Speed
var speed : float = 10.0;

//Size of movement area
var size : Vector2;

//Lights
var glow : Light;

//Can change
private var canChange : boolean = true;

function Start()
{
	GeneratePoint();
}

function Update ()
{
    players = GameObject.FindGameObjectsWithTag ("neutral");
	whoEverIsIt = GameObject.FindGameObjectWithTag("it");
	
	if(it)
	{
		GetClosestPlayer();
		transform.position = Vector3.MoveTowards( transform.position, closestPlayer.transform.position, speed*Time.deltaTime );
		glow.enabled = true;
		gameObject.tag = "it";
	} else {
		transform.position = Vector3.MoveTowards( transform.position, point, speed*Time.deltaTime );
		glow.enabled = false;
		gameObject.tag = "neutral";
	}
	
	if(!it  Vector3.Distance(transform.position, whoEverIsIt.transform.position) < 1  canChange)
	{
		toTrue();
	} else if(it  Vector3.Distance(transform.position, closestPlayer.transform.position) < 1  canChange)
	{
		toFalse();
	}
	
	if(Vector3.Distance(transform.position, point) < 2 || Vector3.Distance(transform.position, point) > 10)
	{
		GeneratePoint();
	}
}

function GetClosestPlayer()
{
    if(players.length > 0)
    {
        var closestEnemy = players[0];
        var dist = Vector3.Distance(transform.position, players[0].transform.position);
 
        for(var i=0;i<players.Length;i++)
        {
            var tempDist = Vector3.Distance(transform.position, players[i].transform.position);
            if(tempDist < dist) {
                closestEnemy = players[i];
            }
        }
 
        //do something with the closestEnemy
        closestPlayer = closestEnemy;
    }
}

//From it to not it
function toFalse()
{
		it = false;
		speed = 15;
		canChange = false;
		yield WaitForSeconds(2);
		speed = 10;
		it = false;
		canChange = true;
		GeneratePoint();
}

//From not it to it
function toTrue()
{
		it = true;
		speed = 5;
		canChange = false;
		yield WaitForSeconds(2);
		speed = 11;
		it = true;
		canChange = true;
}


//Generates a point to run to whilst not it
function GeneratePoint()
{
	var x : float = Random.Range(0, size.x + 1);
	var z : float = Random.Range(0, size.y + 1);
	
	point = Vector3(x, 0.2, z);
}

I suspect the problem lies within these statements:

 else {
		transform.position = Vector3.MoveTowards( transform.position, point, speed*Time.deltaTime );
		glow.enabled = false;
		gameObject.tag = "neutral";
	}

And

//Generates a point to run to whilst not it
function GeneratePoint()
{
	var x : float = Random.Range(0, size.x + 1);
	var z : float = Random.Range(0, size.y + 1);
	
	point = Vector3(x, 0.2, z);
}

But I am not sure. Help?

I would suggest you add in prints to each of your functions checking particular values. That way you can see what is being reached and what equals what at that time.

print("ok we are here");

Ok,

Now my AI’s move around, and it all works. For a little while.

import System.Collections.Generic;
#pragma strict

//var players = new List.<GameObject>();
//		players.Add(array[i]);

//Players
var players : GameObject[];

//Who is it
var whoEverIsIt : GameObject;

//Who to target whilst it
var closestPlayer : GameObject;

//Am I it?
var it : boolean = false;

//Point to run to
private var point : Vector3;

//Speed
var speed : float = 10.0;

//Size of movement area
var size : Vector2;

//Lights
//var glow : Light;

var onMat : Material;
var offMat : Material;

//Can change
private var canChange : boolean = true;

function Start()
{
	GeneratePoint();
}

function Update ()
{
    players = GameObject.FindGameObjectsWithTag ("neutral");
	whoEverIsIt = GameObject.FindGameObjectWithTag("it");
	
	if(it)
	{
		renderer.material = onMat;
		GetClosestPlayer();
		transform.position = Vector3.MoveTowards( transform.position, closestPlayer.transform.position, speed*Time.deltaTime );
		//glow.enabled = true;
		gameObject.tag = "it";
	} else {
		renderer.material = offMat;
		transform.position = Vector3.MoveTowards( transform.position, point, speed*Time.deltaTime );
		//glow.enabled = false;
		gameObject.tag = "neutral";
	}
	
	if(!it  Vector3.Distance(transform.position, whoEverIsIt.transform.position) < 1  canChange)
	{
		toTrue();
	} else if(it  Vector3.Distance(transform.position, closestPlayer.transform.position) < 1  canChange)
	{
		toFalse();
	}
	
	if(Vector3.Distance(transform.position, point) < 2 || Vector3.Distance(transform.position, point) > 10)
	{
		GeneratePoint();
	}
}

function GetClosestPlayer()
{
    if(players.length > 0)
    {
        var closestEnemy = players[0];
        var dist = Vector3.Distance(transform.position, players[0].transform.position);
 
        for(var i=0;i<players.Length;i++)
        {
            var tempDist = Vector3.Distance(transform.position, players[i].transform.position);
            if(tempDist < dist) {
                closestEnemy = players[i];
            }
        }
 
        //do something with the closestEnemy
        closestPlayer = closestEnemy;
    }
}

//From it to not it
function toFalse()
{
		it = false;
		speed = 15;
		canChange = false;
		yield WaitForSeconds(2);
		speed = 10;
		it = false;
		canChange = true;
		GeneratePoint();
}

//From not it to it
function toTrue()
{
		it = true;
		speed = 5;
		canChange = false;
		yield WaitForSeconds(2);
		speed = 11;
		it = true;
		canChange = true;
}


//Generates a point to run to whilst not it
function GeneratePoint()
{
	var x : float = Random.Range(0, size.x + 1);
	var z : float = Random.Range(0, size.y + 1);
		Debug.Log("Generating point");
	point = Vector3(x, 0.2, z);
}

My code should emulate the ‘tag’ game that children play. For some reason, after a little while more than one AI become ‘it’, then none become it.

Again, your code is so long, posted here, I personally do not have the time to sort thru it all but I do recommend that you practice the prints, to see where things are going arye. Try and isolate it.