// The serialized object reference is necessary to work around a nasty unity bug. public static void RebuildPrefab(MB3_MeshBakerCommon mom, ref SerializedObject so) { if (MB3_MeshCombiner.EVAL_VERSION) { return; } if (mom.meshCombiner.LOG_LEVEL >= MB2_LogLevel.debug) { Debug.Log("Rebuilding Prefab: " + mom.resultPrefab); } GameObject prefabRoot = mom.resultPrefab; GameObject rootGO = (GameObject)PrefabUtility.InstantiatePrefab(prefabRoot); //remove all renderer childeren of rootGO MBVersionEditor.UnpackPrefabInstance(rootGO, ref so); Renderer[] rs = rootGO.GetComponentsInChildren <Renderer>(); for (int i = 0; i < rs.Length; i++) { if (rs[i] != null && rs[i].transform.parent == rootGO.transform) { MB_Utility.Destroy(rs[i].gameObject); } } if (mom is MB3_MeshBaker) { MB3_MeshBaker mb = (MB3_MeshBaker)mom; MB3_MeshCombinerSingle mbs = (MB3_MeshCombinerSingle)mb.meshCombiner; MB3_MeshCombinerSingle.BuildPrefabHierarchy(mbs, rootGO, mbs.GetMesh()); } else if (mom is MB3_MultiMeshBaker) { MB3_MultiMeshBaker mmb = (MB3_MultiMeshBaker)mom; MB3_MultiMeshCombiner mbs = (MB3_MultiMeshCombiner)mmb.meshCombiner; for (int i = 0; i < mbs.meshCombiners.Count; i++) { MB3_MeshCombinerSingle.BuildPrefabHierarchy(mbs.meshCombiners[i].combinedMesh, rootGO, mbs.meshCombiners[i].combinedMesh.GetMesh(), true); } } else { Debug.LogError("Argument was not a MB3_MeshBaker or an MB3_MultiMeshBaker."); } string prefabPth = AssetDatabase.GetAssetPath(prefabRoot); MBVersionEditor.ReplacePrefab(rootGO, prefabPth, MB_ReplacePrefabOption.connectToPrefab); if (mom.meshCombiner.renderType != MB_RenderType.skinnedMeshRenderer) { // For Skinned meshes, leave the prefab instance in the scene so source game objects can moved into the prefab. Editor.DestroyImmediate(rootGO); } }
public static void RebuildPrefab(MB3_MeshBakerCommon mom) { if (MB3_MeshCombiner.EVAL_VERSION) { return; } GameObject prefabRoot = mom.resultPrefab; GameObject rootGO = (GameObject)PrefabUtility.InstantiatePrefab(prefabRoot); //remove all renderer childeren of rootGO Renderer[] rs = rootGO.GetComponentsInChildren <Renderer>(); for (int i = 0; i < rs.Length; i++) { if (rs[i] != null && rs[i].transform.parent == rootGO.transform) { MB_Utility.Destroy(rs[i].gameObject); } } if (mom is MB3_MeshBaker) { MB3_MeshBaker mb = (MB3_MeshBaker)mom; MB3_MeshCombinerSingle mbs = (MB3_MeshCombinerSingle)mb.meshCombiner; MB3_MeshCombinerSingle.BuildPrefabHierarchy(mbs, rootGO, mbs.GetMesh()); } else if (mom is MB3_MultiMeshBaker) { MB3_MultiMeshBaker mmb = (MB3_MultiMeshBaker)mom; MB3_MultiMeshCombiner mbs = (MB3_MultiMeshCombiner)mmb.meshCombiner; for (int i = 0; i < mbs.meshCombiners.Count; i++) { MB3_MeshCombinerSingle.BuildPrefabHierarchy(mbs.meshCombiners[i].combinedMesh, rootGO, mbs.meshCombiners[i].combinedMesh.GetMesh(), true); } } else { Debug.LogError("Argument was not a MB3_MeshBaker or an MB3_MultiMeshBaker."); } string prefabPth = AssetDatabase.GetAssetPath(prefabRoot); PrefabUtility.ReplacePrefab(rootGO, AssetDatabase.LoadAssetAtPath(prefabPth, typeof(GameObject)), ReplacePrefabOptions.ConnectToPrefab); if (mom.meshCombiner.renderType != MB_RenderType.skinnedMeshRenderer) { Editor.DestroyImmediate(rootGO); } }