public static void RebuildPrefab(MB3_MeshBakerCommon mom){ if (MB3_MeshCombiner.EVAL_VERSION) return; if (mom is MB3_MeshBaker){ MB3_MeshBaker mb = (MB3_MeshBaker) mom; MB3_MeshCombinerSingle mbs = (MB3_MeshCombinerSingle) mb.meshCombiner; GameObject prefabRoot = mom.resultPrefab; GameObject rootGO = (GameObject) PrefabUtility.InstantiatePrefab(prefabRoot); MB3_MeshCombinerSingle.BuildSceneHierarch(mbs, rootGO, mbs.GetMesh()); string prefabPth = AssetDatabase.GetAssetPath(prefabRoot); PrefabUtility.ReplacePrefab(rootGO,AssetDatabase.LoadAssetAtPath(prefabPth,typeof(GameObject)),ReplacePrefabOptions.ConnectToPrefab); Editor.DestroyImmediate(rootGO); } else if (mom is MB3_MultiMeshBaker){ MB3_MultiMeshBaker mmb = (MB3_MultiMeshBaker) mom; MB3_MultiMeshCombiner mbs = (MB3_MultiMeshCombiner) mmb.meshCombiner; GameObject prefabRoot = mom.resultPrefab; GameObject rootGO = (GameObject) PrefabUtility.InstantiatePrefab(prefabRoot); for (int i = 0; i < mbs.meshCombiners.Count; i++){ MB3_MeshCombinerSingle.BuildSceneHierarch(mbs.meshCombiners[i].combinedMesh, rootGO, mbs.meshCombiners[i].combinedMesh.GetMesh(),true); } string prefabPth = AssetDatabase.GetAssetPath(prefabRoot); PrefabUtility.ReplacePrefab(rootGO,AssetDatabase.LoadAssetAtPath(prefabPth,typeof(GameObject)),ReplacePrefabOptions.ConnectToPrefab); Editor.DestroyImmediate(rootGO); } else { Debug.LogError("Argument was not a MB3_MeshBaker or an MB3_MultiMeshBaker."); } }
public static void MigrateMultiMeshBakerToVersion3Component(GameObject go) { MB2_MultiMeshBaker tb2 = go.GetComponent <MB2_MultiMeshBaker>(); if (tb2 == null) { return; } Debug.Log("Migrating Mesh Baker"); MB3_MultiMeshBaker tb3 = go.AddComponent <MB3_MultiMeshBaker>(); tb3.textureBakeResults = tb2.textureBakeResults; tb3.bakeAssetsInPlaceFolderPath = tb2.bakeAssetsInPlaceFolderPath; tb3.objsToMesh = tb2.objsToMesh; tb3.resultPrefab = tb2.resultPrefab; tb3.useObjsToMeshFromTexBaker = tb2.useObjsToMeshFromTexBaker; tb3.meshCombiner.doCol = tb2.doCol; tb3.meshCombiner.doNorm = tb2.doNorm; tb3.meshCombiner.doTan = tb2.doTan; tb3.meshCombiner.doUV = tb2.doUV; tb3.meshCombiner.doUV1 = tb2.doUV1; tb3.meshCombiner.lightmapOption = tb2.lightmapOption; tb3.meshCombiner.outputOption = tb2.outputOption; tb3.meshCombiner.resultSceneObject = tb2.resultSceneObject; tb3.meshCombiner.renderType = tb2.renderType; DestroyImmediate(tb2); }
public static void SaveMeshsToAssetDatabase(MB3_MeshBakerCommon mom, string folderPath, string newFileNameBase){ if (MB3_MeshCombiner.EVAL_VERSION) return; if (mom is MB3_MeshBaker){ MB3_MeshBaker mb = (MB3_MeshBaker) mom; string newFilename = newFileNameBase + ".asset"; string ap = AssetDatabase.GetAssetPath(((MB3_MeshCombinerSingle) mb.meshCombiner).GetMesh()); if (ap == null || ap.Equals("")){ Debug.Log("Saving mesh asset to " + newFilename); AssetDatabase.CreateAsset(((MB3_MeshCombinerSingle) 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 MB3_MeshBaker or an MB3_MultiMeshBaker."); } }
// 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); } }
public static GameObject CreateNewMeshBaker() { MB3_TextureBaker[] mbs = (MB3_TextureBaker[])GameObject.FindObjectsOfType(typeof(MB3_TextureBaker)); 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("TextureBaker (" + largest + ")"); nmb.transform.position = Vector3.zero; MB3_TextureBaker tb = nmb.AddComponent <MB3_TextureBaker>(); tb.packingAlgorithm = MB2_PackingAlgorithmEnum.MeshBakerTexturePacker; MB3_MeshBakerGrouper mbg = nmb.AddComponent <MB3_MeshBakerGrouper>(); GameObject meshBaker = new GameObject("MultiMeshBaker"); MB3_MultiMeshBaker mmb = meshBaker.AddComponent <MB3_MultiMeshBaker>(); mmb.meshCombiner.settingsHolder = mbg; meshBaker.transform.parent = nmb.transform; return(nmb); }
void Start() { mbd = GetComponentInChildren <MB3_MultiMeshBaker>(); // instantiate game objects int dim = 10; GameObject[] gos = new GameObject[dim * dim]; for (int i = 0; i < dim; i++) { for (int j = 0; j < dim; j++) { GameObject go = (GameObject)Instantiate(prefab); gos[i * dim + j] = go.GetComponentInChildren <MeshRenderer>().gameObject; float randx = Random.Range(-4f, 4f); float randz = Random.Range(-4f, 4f); go.transform.position = (new Vector3(3f * i + randx, 0, 3f * j + randz)); float randrot = Random.Range(0, 360); go.transform.rotation = Quaternion.Euler(0, randrot, 0); Vector3 randscale = Vector3.one + Vector3.one * GaussianValue() * .15f; go.transform.localScale = randscale; //put every third object in a list so we can add and delete it later if ((i * dim + j) % 3 == 0) { objsInCombined.Add(gos[i * dim + j]); } } } //add objects to combined mesh mbd.AddDeleteGameObjects(gos, null, true); mbd.Apply(); objs = objsInCombined.ToArray(); //start routine which will periodically add and delete objects StartCoroutine(largeNumber()); }
//---Singleton-Pattern-ENDE------------------ private void Start() { mbd = GetComponentInChildren <MB3_MultiMeshBaker>(); }