All the objects in my script choose the same target.

I have a script that is attached to a prefab, this prefab is spawned in the game world 10 times. The script tells the objects to choose a target with the tag 'Stone' and there are about 400 stones in the world. The thing is, they all choose the exact same stone, how do I make them truly choose a random one?

if(FreeRoam == true)
{
RandomTarget = gameObject.FindWithTag("Stone");
DisFromRTarget = Vector3.Distance(this.transform.position, RandomTarget.transform.position);
transform.LookAt(RandomTarget.transform);
Speed = Walk;
transform.position = Vector3.MoveTowards(transform.position, RandomTarget.transform.position,  Speed * Time.deltaTime);
animation.Play("Walk");
}

cheers!

2 Answers

2

Use GameObject.FindGameObjectsWithTag and then Random.Range using '0' and the length of the GameObject array.

Read through the documentation for both, and if you're still having trouble, let me know and I'll update my answer with further details.


Updated...

if(freeRoam == true)
{
    var allStones = GameObject.FindGameObjectsWithTag("Stone");
    randomTarget = allStones[Random.Range(0,allStones.length)];
    disFromRTarget = Vector3.Distance(this.transform.position, randomTarget.transform.position);
    transform.LookAt(randomTarget.transform);
    speed = walk;
    transform.position = Vector3.MoveTowards(transform.position, randomTarget.transform.position,  Speed * Time.deltaTime);
    animation.Play("Walk");
}

Well, you have to select the target in Start() and do your move stuff in Update(). If you do that script above in update you will choose a new target every frame. If you do the whole thing just in Start() it will move a little bit and that's all. So split it after the Random.Range line.

Actually just calling you variable "RandomTarget" doesn't make your target random at all! :D

When you call FindWithTag function you get just the first element with that tag (I fought with that function just this morning! :D)

You should first get the whole array of GameObjects with the wanted tag, like this...

var myStones = GameObject.FindGameObjectsWithTag("Stone");

And then for every object which must point to one of those you can choose a random target...

var targetStone;
targetStone = Random.Range(0, myStones.length);

That should do the trick! :)

I was just joking about the variable name, of course! :D