Hello, I am working on a 'tag' style game. One player is 'it', and that player has to try to tag other players. When the player who is 'it' tags another player, other said player becomes it instead. And the cycle repeats. Currently, my AI only works with 1 NPC, and one player. Im trying to change that, and be able to drop in more NPC's and have the game continue as normal. I tried editing the scripts to make them scale, but now they have many bugs and do not work properly. This script goes on the NPC: Code (csharp): #pragma strict //Player, currently not scalable var target : GameObject; //players var players : GameObject[]; //Am I it or not? var it : boolean; //Movement speed var speed : float = 10.0; //Size of movement area var size : Vector2; //Point to move to private var point : Vector3; //Light var glow : Light; //Can be tagged private var canChange : boolean = true; //Follow the player? private var followPlayer : boolean = false; function Start() { GeneratePoint(); } function Update() { if( it target == null) { GetClosestPlayer(); } if(it) { GetClosestPlayer(); } //Movement, following player if(it followPlayer) { transform.position = Vector3.MoveTowards( transform.position, target.transform.position, speed*Time.deltaTime ); } else if(it !followPlayer) { transform.position = Vector3.MoveTowards( transform.position, point, speed*Time.deltaTime ); } else if(!it) { transform.position = Vector3.MoveTowards( transform.position, point, speed*Time.deltaTime ); } //if tagged someone while it if(Vector3.Distance(transform.position, target.transform.position) < 0.5 it canChange) { toFalse(); //if tagged while not it } else if(Vector3.Distance(transform.position, target.transform.position) < 1 it == false canChange) { toTrue(); } //Generating points to run to if(Vector3.Distance(transform.position, point) < 2 !it) { GeneratePoint(); //Generating points to run to while it, adds slight variety in movements } else if(Vector3.Distance(transform.position, point) < 2 it) { GeneratePointNearTarget(); } //if the point is over 10 units away, generate another point if(Vector3.Distance(transform.position, point) > 10) { GeneratePoint(); } //Ignore this statement if(Vector3.Distance(transform.position, point) < 5 it) { GeneratePointNearTarget(); } //If it, turn on light if(it) { glow.enabled = true; gameObject.tag = "it"; } else { glow.enabled = false; gameObject.tag = "neutral"; } } //Generates a point to run to 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); } //Generates a point near the player, to run to function GeneratePointNearTarget() { followPlayer = false; var q : float = Random.Range(1, 11); var x : float = Random.Range(0, 5); var z : float = Random.Range(0, 5); if(q <= 5) { point = Vector3(target.transform.position.x + x, 0.2, target.transform.position.z + z); } else { followPlayer = true; } } //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; } //I realise I need this function (Below) to iterate through all the npcs (and the player) //and find the closest one, and set that as the target, but it doesn't work properly function GetClosestPlayer() { players = GameObject.FindGameObjectsWithTag("neutral"); 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 target = closestEnemy; } } and this onto the player: Code (csharp): //Movement #pragma strict //Movement var speed : float = 10.0; var trailThresh : float = 0.5; var wantedPos : Vector3; private var canDie : boolean = false; //It var it : boolean = true; //npc that is it var npcIt : GameObject; var glow : Light; private var canChange : boolean = true; function FixedUpdate() { npcIt = GameObject.FindGameObjectWithTag("it"); //Movement var ray = Camera.main.ScreenPointToRay (Input.mousePosition); var hit : RaycastHit; wantedPos.y = 0.1; if(Vector3.Distance(this.transform.position, wantedPos) > 0.5) { transform.position = Vector3.MoveTowards( transform.position, wantedPos, speed*Time.deltaTime); //transform.LookAt(wantedPos); //transform.Translate(Vector3.forward * Time.deltaTime * speed); } if (Physics.Raycast (ray, hit, 100)) { wantedPos = hit.point; } //Getting tagged if(Vector3.Distance(transform.position, npcIt.transform.position) < 1 it canChange) { toFalse(); } else if(Vector3.Distance(transform.position, npcIt.transform.position) < 0.5 it == false canChange) { toTrue(); } //Changing the lights if(it) { glow.enabled = true; } else if(!it) { glow.enabled = false; } } function toFalse() { it = false; speed = 15; canChange = false; yield WaitForSeconds(2); speed = 10; it = false; canChange = true; } function toTrue() { it = true; speed = 5; canChange = false; yield WaitForSeconds(2); speed = 11; it = true; canChange = true; } However, when I play, sometimes both lights are on, both are off, one is off one is on, etc. etc. It doesnt work. Help?