Enemy following Player in range

Hi, I’m trying to do a simple script where “Cube” objects follow “PlayerCube” when PC gets in a range of <50 from any C position. If I don’t do the if, it works fine, but all the cubes in my map will follow PC. It is not working (none of the cubes move when I approach them), and I guess I’m accessing the GameObjects’ position wrong or maybe my mistake is in the if statement. I appreciate any help you can offer. Here is my code:

var target : Transform; //the enemy's target
var moveSpeed = 50; //move speed
var rotationSpeed = 3; //speed of turning

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 () {
//if((target.transform.position-transform.position).sqrMagnitude<20){
var pos1 = GameObject.Find("PlayerCube").transform.position;
var pos2 = GameObject.Find("Cube").transform.position;
if(Vector3.Distance (pos1, pos2) < 50){
    	    //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;
    }
    }

I don’t know why you have the pos1 and pos2 variables inside the Update function, it doesn’t make sense. Presumably you’ve already cached the positions for both the NPC and the player (the NPC’s target). But beyond that…

In the if statement, you check whether NPC and player are within a distance of 20 in square space (using the square distance between both). Then you’re doing another square-root (= accurate) distance check between ‘Cube’ and ‘PlayerCube’ (both of which presumably represent the same entities) in the second if statement. That check will fail because of the difference between a squared and square-root distance value.
Assume Player(0,0) and NPC(5,5). Their distance in square space is 50. Your first if check fails, nobody does anything. The accurate distance is 7.071 (square-root of 50), so if you comment out the if statement, the second if statement evaluates to true and the rotation/movement code executes.

Make sure that all of your measurements are always in the same space (in this case, change the first if statement to use Vector3.Distance). Squared space is only useful when comparing multiple entities which are all evaluated inside that square space.

Also clean up the redundancy of pos1/pos2. GameObject.Find should never be called per frame, and you’re confusing the issue by not referring to the same objects consistently.