/// <summary> /// 构建预制体 /// </summary> /// <param name="mom"></param> /// <param name="so"></param> public static void RebuildPrefab(MeshBakerCommon mom, ref SerializedObject so) { GameObject prefabRoot = mom.resultPrefab; GameObject rootGO = (GameObject)PrefabUtility.InstantiatePrefab(prefabRoot); SceneBakerUtilityInEditor.UnpackPrefabInstance(rootGO, ref so); //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) { MeshBakerUtility.Destroy(rs[i].gameObject); } } if (mom is MeshCombinerEntrance) { MeshCombinerEntrance entrance = (MeshCombinerEntrance)mom; MeshCombineHandler mbs = (MeshCombineHandler)entrance.meshCombiner; MeshCombineHandler.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("MeshCombiner合并器类型错误"); } //保存预制体 string prefabPth = AssetDatabase.GetAssetPath(prefabRoot); SceneBakerUtilityInEditor.ReplacePrefab(rootGO, prefabPth, ReplacePrefabOption.connectToPrefab); if (mom.meshCombiner.renderType != RendererType.skinnedMeshRenderer) { // For Skinned meshes, leave the prefab instance in the scene so source game objects can moved into the prefab. UnityEditor.Editor.DestroyImmediate(rootGO); } }
/// <summary> /// 保存网格资源至 Asset 中 /// </summary> public static void SaveMeshsToAssetDatabase(MeshBakerCommon mom, string folderPath, string newFileNameBase) { if (mom is MeshCombinerEntrance) { MeshCombinerEntrance mb = (MeshCombinerEntrance)mom; string newFilename = newFileNameBase + ".asset"; string ap = AssetDatabase.GetAssetPath(((MeshCombineHandler)mb.meshCombiner).GetMesh()); if (ap == null || ap.Equals("")) { Debug.Log("保存网格资源 " + newFilename); AssetDatabase.CreateAsset(((MeshCombineHandler)mb.meshCombiner).GetMesh(), newFilename); } else { Debug.Log("Mesh is an asset at " + ap); } } //else if (mom is MB3_MultiMeshBaker) //{ // MB3_MultiMeshBaker mmb = (MB3_MultiMeshBaker)mom; // List<MB3_MultiMeshCombiner.CombinedMesh> combiners = ((MB3_MultiMeshCombiner)mmb.meshCombiner).meshCombiners; // for (int i = 0; i < combiners.Count; i++) // { // string newFilename = newFileNameBase + i + ".asset"; // Mesh mesh = combiners[i].combinedMesh.GetMesh(); // string ap = AssetDatabase.GetAssetPath(mesh); // if (ap == null || ap.Equals("")) // { // Debug.Log("Saving mesh asset to " + newFilename); // AssetDatabase.CreateAsset(mesh, newFilename); // } // else // { // Debug.Log("Mesh is an asset at " + ap); // } // } //} else { Debug.LogError("Argument was not a MeshCombineEntrance or an MultiMeshBaker."); } }
public static GameObject CreateNewMeshBaker() { TextureCombineEntrance[] mbs = (TextureCombineEntrance[])GameObject.FindObjectsOfType(typeof(TextureCombineEntrance)); Regex regex = new Regex(@"\((\d+)\)$", RegexOptions.Compiled | RegexOptions.CultureInvariant); int largest = 0; try { for (int i = 0; i < mbs.Length; i++) { Match match = regex.Match(mbs[i].name); if (match.Success) { int val = Convert.ToInt32(match.Groups[1].Value); if (val >= largest) { largest = val + 1; } } } } catch (Exception e) { if (e == null) { e = null; //Do nothing supress compiler warning } } GameObject nmb = new GameObject("TextureCombineEntrance (" + largest + ")"); nmb.transform.position = Vector3.zero; TextureCombineEntrance tb = nmb.AddComponent <TextureCombineEntrance>(); tb.packingAlgorithm = PackingAlgorithmEnum.MeshBakerTexturePacker; ////MB3_MeshBakerGrouper mbg = nmb.AddComponent<MB3_MeshBakerGrouper>(); GameObject meshBaker = new GameObject("MeshBaker"); MeshCombinerEntrance mb = meshBaker.AddComponent <MeshCombinerEntrance>(); meshBaker.transform.parent = nmb.transform; ////mb.meshCombiner.settingsHolder = mbg; return(nmb.gameObject); }