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?

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.