Array of scripts: How to access the scripts by name?
I'm currently designing power up-type items. When they are picked up, they disappear and the power up affects the player. Every item has its own sprite and script.
What I want to do is that when an item spawns, a random sprite + script gets picked and added to the item. But every sprite should be kind of linked to its script, of course.
What I thought of was putting both the sprite names and the scripts in arrays, at the same positions.
string[] spriteNames = new string[2] {"ItemSpeedUpSprite", "ItemFireFasterSprite"};
PowerUp[] itemTypes = new PowerUp[2] {SpeedUp, FireFaster};
void Start () {
int rand = Random.Range (0, 1);
GetComponent<SpriteRenderer> ().sprite =
Resources.Load (spriteNames[rand], typeof(Sprite)) as Sprite;
gameObject.AddComponent<itemTypes[rand]>();
}
In this case for example, I would get for the random value "1" the sprite "ItemFireFasterSprite" and the script "FireFaster". "PowerUp" is the inherited super class of all item scripts.
I get however a compiler error for the PowerUp array. Something like "SpeedUp is a type, but it is being used like a variable." I apparently cannot just use the script's class as an array item, it seems. How can I access the scripts and put them in an array then? Or is there another way to access the scripts, e.g. by getting them by name or something?
Answer by Bigiansen · Sep 12, 2016 at 09:27 PM
Your problem is here -> PowerUp[] itemTypes = new PowerUp[2] {SpeedUp, FireFaster}; SpeedUp and FireFaster are types.
The stuff between the brackets represents the actual content of the array when initialized, not the types.
Example:
SpeedUp speedUp = *.GetComponent<SpeedUp>(); //variable A
FireFaster fireFaster= *.GetComponent<FireFaster >(); //variable B
PowerUp[] itemTypes = new PowerUp[2] {speedUp , fireFaster};
Where * is the reference to the GameObject that has the corresponding script components.
To access a script you usually do this:
ScriptClass myScript = GameObject.Find("GameObject name").GetComponent();
That last line however implies that a GameObject already has the scripts attached. But I want to load them from the Resources folder, put them in the array and attach them to a new object afterwards. $$anonymous$$aybe it would work if I instantiate the scripts every time I want to do this, i.e. ins$$anonymous$$d of "speedUp" I put "new speedUp()" in the itemTypes array?