- Home /
Placing Prefabs in Prefabs.
I have a scene Hierarchy which looks like that
- root prefab (from an empty game object)
- architecture prefab
- plant prefab
- plant prefab
- plant prefab
When I drag a new root prefab in the scene everything works fine. If I change my first plant prefab all the plant prefabs change. But I found this thread in the forum that suggests otherwise. here
Am I missing something ? I use similar hierarchies for pretty much everything in my scene so if I do something wrong It would be NO good.
///Edit/// I see what is the problem now. If I change my original mesh things will update because everything points back to the original mesh. But if I do things in unity the prefab connection is lost. hmmm i still need to create groups of geometry with prefabs for cloning in an efficient way ... I really don't want to write code for placing 30 plants, garbage bins etc in the right place.
A really crude workaround I found so far is to put my architecture prefab in 0.0.0 create an empty game object at 0.0.0 (Not prefab) with my props as children. Then when I add a new instance of my architecture model, I duplicate the game object with the props and move it to the new coordinates.No root prefab !!! Looooads of work ...
lol, sorry I got lost a bit. Can I use prefabs in prefabs if no what is the best way to clone ready made areas of my scene?
I am also interested in whether prefabs-in-prefabs is possible. I have ships made of pre-set components, which themselves I'd like as pre-set classes. So +1 for a good answer to this! =)
Answer by Tetrad · May 04, 2010 at 09:53 PM
You can't have the concept of "nested" prefabs, no.
What you could do is set up some kind of dummy gameobject/node that, on Awake(), Instantiates your desired prefab at it's current position/rotation/scale.
So each game object that's a child of your root prefab would have a script that looks something like this:
class PrefabSpawner : MonoBehaviour { public GameObject prefab;
void Awake()
{
GameObject go = Instantiate( prefab, transform.position, transform.rotation );
go.transform.parent = transform.parent;
Destroy( gameObject );
}
}
The problem here is that this does not make the prefab visible in the editor, is there anything to remedy this?
Perhaps an Editor script could do that (make them visible that is). There is a 'material generator', maybe it would work something like that?
Answer by Bento-Studio · Mar 12, 2012 at 01:36 PM
Maybe our last plugin may help you! http://u3d.as/content/bento-studio/nested-prefab/2Jz
Answer by Antony-Blackett · Apr 05, 2011 at 11:52 PM
I know exactly what you want to do and I too cannot find a way to do it. :/
If I'm not mistaken you want the ability to create 'prefab links' in much the same way you get asset links. This would then allow you to have a number of objects and be able to use them individually as well as have a 'prefab links' hierarchy for common layouts etc.
You would think this would be an easy feature to add. it seems half the functionality is there with the asset linking.
Here's an example for people to help understand the problem.
I want to be able to do this (imagine this is the project view):
- prefab1
- prefab2
- commonLayoutPrefab
- prefab1
- prefab2
Changing prefab1 or prefab2 under commonLayoutPrefab should be the same as changing prefab1 or prefab2 at the base level as the ones under commonLayoutPrefab are only links to the originals.
I found this question looking for exactly what you mention. Boy would that be a nice feature to have.
Answer by spinaljack · Apr 20, 2010 at 07:55 PM
If you want to copy and paste sections on the scene use ctrl click on each item in the hierarchy window and then simply drag the whole lot into an empty prefab, then you can drag that prefab onto the scene as many times as you want.... I'm not sure it that's what you wanted though.
Thanks for your reply, but no it is not what I want. This is what I was doing but in this way you loose the connection of the prefabs inside the root prefab. Let's say you have 30 plants (prefab) inside a building (prefab) if you turn the plants and the building in a root prefab then the plants become unique. The solution I am working today is to delete the plants on runtime and replace them with a plant prefab that takes their coordinates and values. But I have some problems with it.
Answer by jakerman999 · Jan 13, 2011 at 06:56 PM
If you're looking for what I think you're looking for you can do it with the transform.parent property. I'll share a function I'm using to Instantiate hex cells in this manner.
function Cellspawn (colour, Colour) {
cell = Instantiate(colour, pos, Quaternion.identity); //create the cell
cell.GetComponent(tilemove).row = row; //set the row variable
cell.GetComponent(tilemove).column = column; //set the column variable
cell.transform.parent = this.transform.Find(Colour).transform; //set the cells parent
if (special ()) {
cell.GetComponent(tilemove).special=true; //sets special flag
}
}
In a running instance the hierarchy tab shows the cells nested within there own colour tags, which are empty gameobjects nested within the gameobject that spawns the cells. This I have set up beforehand although the colour tags could be created at runtime. The special function is really just a huge mess of if statements and spaghetti code I didn't want to look at anymore.
Your answer
Follow this Question
Related Questions
How should I structure this in Unity? 1 Answer
How do I properly duplicate an object in a editor script? 3 Answers
How can I duplicate an object and place it randomly near the original ? 0 Answers
Duplicate prefab and all its variants to new prefab with new variants 0 Answers
Possible Unity Glitch. A few lines of code erasing prefab data. 1 Answer