Getting a variable by name

ok, I have six variables that are game objects, spawn1, spawn2 ect. In the script I want to be able to get the variable by name using a random number. So like
:

spawn_+random_number2

Please help, here is my script:


var coin_prefab:GameObject;
var spawn_1:GameObject;
var spawn_2:GameObject;
var spawn_3:GameObject;
var spawn_4:GameObject;
var spawn_5:GameObject;
var spawn_6:GameObject;

private var random_number:int;
private var random_number2:int;

function Awake()
{
	InvokeRepeating("spawn", Random.Range(5,15), Random.Range(5,15));
}

function spawn()
{
	random_number = Random.Range(1, 2);
	if (random_number == 1) //coin
	{
		random_number2 = Random.Range(1,6);
		pos = "spawn_"+random_number2.ToString().transform.position;
		rot = "spawn_"+random_number2.ToString().transform.rotation;
		Instantiate(coin_prefab, pos, rot);
	}
}

I would suggest creating an array to hold your GameObjects. That way you can just pass in random_number2 as the index.

var coin_prefab:GameObject;
var spawns : GameObject[];

private var random_number:int;
private var random_number2:int;

function Awake()
{
    InvokeRepeating("spawn", Random.Range(5,15), Random.Range(5,15));
}

function spawn()
{
    random_number = Random.Range(1, 2);
    if (random_number == 1) //coin
    {
       random_number2 = Random.Range(1,6);
       pos = spawns[random_number2].transform.position;
       rot = spawns[random_number2].transform.rotation;
       Instantiate(coin_prefab, pos, rot);
    }
}

Well, you can’t treat variable names like strings. I think you want to try this:

var coin_prefab:GameObject;
var spawns : GameObject[];

private var random_number:int;
private var random_number2:int;

function Awake()
{
    InvokeRepeating("spawn", Random.Range(5,15), Random.Range(5,15));
}

function spawn()
{
    random_number = Random.Range(1, 2);
    if (random_number == 1) //coin
    {
       random_number2 = Random.Range(1,6);
       pos = spawns[random_number2].transform.position;
       rot = spawns[random_number2].transform.rotation;
       Instantiate(coin_prefab, pos, rot);
    }
}

Then just assign each GameObject to a position in the array (if not in the inspector) like so (replacing all caps stuff w/your actual values):

spawns[SOME VALUE BETWEEN 0 and 5] = SOMEGAMEOBJECT;

I am not sure if this will work in UnityScript, but this does work in JavaScript:

random_number = Random.Range(1, 2);
if (random_number == 1) //coin
{
    random_number2 = Random.Range(1,6);

    var randomSpawner : GameObject;
    randomSpawner = this['spawn_' + random_number2.ToString()];

    // Avoid looking up the same transform component multiple times
    var spawnerTransform = randomSpawner.transform;
    pos = spawnerTransform.position;
    rot = spawnerTransform.rotation;
    Instantiate(coin_prefab, pos, rot);
}

I would be inclined to reference your spawners using Transform instead of GameObject to avoid the need to lookup the transform components each time.

Though I would use the approach suggested by @iwaldrop (but with Transform[] instead of GameObject[]):

var coin_prefab:GameObject;
var spawns : Transform[];

private var random_number:int;
private var random_number2:int;

function Awake()
{
    InvokeRepeating("spawn", Random.Range(5,15), Random.Range(5,15));
}

function spawn()
{
    random_number = Random.Range(1, 2);
    if (random_number == 1) //coin
    {
       random_number2 = Random.Range(1,6);
       pos = spawns[random_number2].position;
       rot = spawns[random_number2].rotation;
       Instantiate(coin_prefab, pos, rot);
    }
}