Saving SkinnedMeshRenderers to Prefab Assets in Editor Script

I have a snippet of code from a CreateAssetBundles.cs class way back in 2012 that saved individual SkinnedMeshRenderers on an fbx to individual assets. I’m reacquainting myself with some of my old skinnedmesh stitching logic as I’m a bit rusty after a more than decade long hiatus, but I’m running into an error that I never had back in the day.

      // Create assetbundles for each SkinnedMeshRenderer.
      foreach (SkinnedMeshRenderer smr in characterFBX.GetComponentsInChildren<SkinnedMeshRenderer>(true))
      {
          List<Object> toinclude = new List<Object>();

          // Save the current SkinnedMeshRenderer as a prefab so it can be included
          // in the assetbundle. As instantiating part of an fbx results in the
          // entire fbx being instantiated, we have to dispose of the entire instance
          // after we detach the SkinnedMeshRenderer in question.
          GameObject rendererClone = (GameObject) PrefabUtility.InstantiatePrefab(smr.gameObject);
          GameObject rendererParent = rendererClone.transform.parent.gameObject;

          // Error occurs in the following line: "Setting the parent of a transform which resides in a Prefab instance is not possible"
          rendererClone.transform.parent = null;

          Object.DestroyImmediate(rendererParent);
          Object rendererPrefab = GetPrefab(rendererClone, "rendererobject");
          toinclude.Add(rendererPrefab);
          // ...

When running the above code (in an Editor script), it seems we can no longer set the parent of a prefab instance transform, as I’m trying to set it to null to isolate the skinnedmesgrenderer from everything else. This used to work flawlessly way back when, but not anymore, and I’m hoping one of you gurus can shed some light on my ignorance here.

Many thanks in advance!

I was able to figure it out; here’s what I did:

// instantiate renderer prefab
GameObject rendererClone = (GameObject)PrefabUtility.InstantiatePrefab(smr.gameObject);
// unpack entire prefab
var root = PrefabUtility.GetOutermostPrefabInstanceRoot(rendererClone);
PrefabUtility.UnpackPrefabInstance(root, PrefabUnpackMode.Completely, InteractionMode.AutomatedAction);

// disconnect renderer GameObject from prefab instance
rendererClone.transform.SetParent(null);
// destroy prefab instance
Object.DestroyImmediate(root);

// do what you want with renderer GameObject...
Object rendererPrefab = GetPrefab(rendererClone, smrName);

This is what worked for me, but if anyone knows of a better way, please illuminate us.

Cheers!

Anthony