- Home /
Identifying instances of prefabs in code
Hi
I have a script attached to a prefab (called wall) which allows instances of itself to be created. Each wall created is given a unique ID. The relevant code (js) is given below:
//This is the Prefab reference
public var wallPrefab : Transform;
//Each wall has an ID and this is the highest one
public static var maxWallIndex : int = 0;
public var wallIndex : int; //this wall index (starts at 1)
function createNew(startPos : Vector3, length : int, rot : double) : int
{
//create new instance of wall
var newWall : Transform;
newWall = Instantiate(wallPrefab, startPos, Quaternion.identity);
//...
//Set the ID for this instance and update the total number
maxWallIndex++;
wallIndex = maxWallIndex;
}
I need to create and modify walls dynamically from a few other scripts, so need to be able to identify and access the member functions of a particular instance of this prefab.
My original plan was to create tags dynamically then use FindGameObjectsWithTag
to access the correct instance. However since you cannot create tags in code, and GameObject.Find
returns just one object, I am a little stumped with this one. Any thoughts are greatly appreciated!
EDIT: I have since got around this problem by dynamically naming the instances. However any more elegant solutions would be welcomed!
gameObject.tag = "Player"; This is how you "create" tags dynamically :)
Answer by Narv · Aug 13, 2013 at 11:17 AM
Instead of having each prefab keep track of all the other prefabs of the same name (which seems to be what you are trying to explain), you could use a single script to manage all prefab instances. Then manage a generic List and when you want to remove from there, you can use the unique identifier for each object/component in the scene that unity already has in GetInstanceID()
http://docs.unity3d.com/Documentation/ScriptReference/Object.GetInstanceID.html
I use this in a game im making now with enemy tanks being stored in a master list and when new ones are spawned, they get added to the list, and removed from the list when destroyed so that I can iterate on all active enemies.
If you do this, make sure you do gameObject.GetInstanceID() if you are storing game objects as just "GetInstanceID()" by itself will return the ID of the script component.
Yep that is a much better way of going about it. I now have a "Wallmanager" script which is a lot easier. Thanks very much for the help.