- Home /
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);
}
}
Answer by justin35f · Jan 19, 2013 at 02:04 AM
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);
}
}
thanks, I didn't know you could have GameObjects as an array.
An array is just a container to hold information, regardless of DataType. I would definitely recommend what @numberkrunch mentioned, and that is to change your GameObject's to Transforms.
Answer by iwaldrop · Jan 19, 2013 at 12:41 AM
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 posted this same thing, but since I'm new, my answer has been in a moderation queue for well over an hour.
thanks, this answers my question as well but you and Justin Hammond basically had the same answer so I just chose any.
ins$$anonymous$$d of 'spawns[SO$$anonymous$$E VALUE BETWEEN 0 and 5] = SO$$anonymous$$EGA$$anonymous$$EOBJECT;' i'll just assign them in the unity editor.
Answer by numberkruncher · Jan 19, 2013 at 12:46 AM
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);
}
}
I agree with your comment about using @iwaldrop suggestion, specifically about using Transform[] rather than GameObject[]. I wrote up a very similar answer, but it's awaiting moderator approval to be posted. I also made the array of type GameObject, rather than Transform. If @TheCoolDog is only using it for the position/rotation information, then Transform is likely the better approach.
@justin35f I would imagine that the Transform
approach was better in both circumstances because you can access the game object efficiently via transform.gameObject
because the reference is stored locally and avoids the expensive GetComponent
call that occurs internally when using the .transform
property.
Your answer
Follow this Question
Related Questions
Prefab script values do not update 2 Answers
How to make levels spawn randomly? 0 Answers
why do I need to type variables classes? 2 Answers
Spawning at a random position away from the player 1 Answer
Select from an array based on values 1 Answer