- Home /
Creating a complex prefab during asset postprocessing
In OnPostprocessModel, I want to prepare a GameObject that is parented to another GameObject, and then create a prefab out of that. This works fine, but it leaves an instance in the scene. When I try to destroy the object after creating the prefab, the editor crashes. Here's the code:
public class MyAssetPostprocessor : AssetPostprocessor { public void OnPostprocessModel(GameObject gameObject) { // create an empty gameobject and add the mesh as a child GameObject prefabRoot = new GameObject("foo"); gameObject.transform.parent = prefabRoot.transform;
// create the prefab, and connect the dummy prefab root to it
Object prefab = EditorUtility.CreateEmptyPrefab("Assets/test.prefab");
EditorUtility.ReplacePrefab(prefabRoot, prefab, ReplacePrefabOptions.ConnectToPrefab);
// cleanup the gameobject instance in the scene
Object.DestroyImmediate(prefabRoot);
}
}
I'm not convinced I'm heading down the right path. What's the correct way to create complex prefabs during asset postprocessing, involving the asset which is being imported?
I get a little more mileage (e.g. editor doesn't crash) if I detach the game object being imported from the prefab root before I destroy the prefab root.
gameObject.transform.parent = null;
But a new object still appears in the scene as a disconnected prefab instance.
Answer by AngryAnt · Dec 07, 2009 at 11:12 AM
The GameObject being passed to OnPostprocessModel is not an in-scene GameObject, but the one going into your assets. Trouble starts when you attach this GameObject to an in-scene GameObject.
What you should do is:
- Instantiate a new scene GO based on your Assets GO:
- GameObject newGO = Instantiate (gameObject, Vector3.zero, Quaternion.Identity);
- Modify this newly created GO, parent etc.
- Do your prefab dance.
- Destroy the new GO - not the original Assets one.
Ah, I see. What I'm seeing now is that if I destroy the prefab root GO, the whole prefab still remains up in the scene as a disconnected prefab. If I destroy the instantiated scene GO (but not prefab root) then only the prefab root remains in the scene, as a disconnected prefab.... I'll keep futzing with it.
$$anonymous$$, it works now. I was using ReplacePrefabOptions.ConnectToPrefab ins$$anonymous$$d of ReplacePrefabOptions.Default.
Your answer
Follow this Question
Related Questions
How do I programmatically assign a GameObject to a prefab? 6 Answers
Can I generate prefab instances based on locators inside a 3d model file? 2 Answers
The name 'Joystick' does not denote a valid type ('not found') 2 Answers
Attaching scripts to Prefab objects... 1 Answer
Prefab problem... 0 Answers