/// <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);
        }