void AttachCombineScriptToChildren() { for (int i = 0; i < masterTarget.transform.childCount; i++) { Transform t = masterTarget.transform.GetChild(i); SimpleMeshCombine smc = t.GetComponent <SimpleMeshCombine>(); if (!smc) { t.gameObject.AddComponent <SimpleMeshCombine>(); } } }
public void combineMeshes() { Transform sceneSections = getSceneSections(); // Iterate through all of the scene sections for (int sectionIndex = 0; sectionIndex < sceneSections.childCount; sectionIndex++) { SimpleMeshCombine meshCombiner = sceneSections.GetChild(sectionIndex).gameObject.GetComponent <SimpleMeshCombine>(); if (meshCombiner == null) { continue; } if (meshCombiner.transform.childCount == 0) { continue; } meshCombiner.CombineMeshes(); meshCombiner.combined.isStatic = true; } }
void CombineAll(bool combine, SimpleMeshCombine[] arr) { for (int i = 0; i < arr.Length; i++) { SimpleMeshCombine smc = arr[i]; if (combine && !smc.combined) { if (masterTarget.generateLightmapUV) { smc.generateLightmapUV = true; } smc.CombineMeshes(); } else if (!combine && smc.combined) { smc.EnableRenderers(true); if (smc.combined != null) { DestroyImmediate(smc.combined); } smc.combinedGameOjects = null; } } }
public void Awake() { simpleMeshCombine = GetComponent <SimpleMeshCombine>(); //simpleMeshCombine.CombineMeshes(); }
static void CreateBattleWithCombineMesh() { if (EditorApplication.isPlaying) { EditorUtility.DisplayDialog("提示", "不能在運行的時候執行", "OK", ""); return; } Transform[] selections = Selection.GetTransforms(SelectionMode.Assets); if (selections.Length == 0 || selections.Length > 1) { EditorUtility.DisplayDialog("提示", "選中一個Battle物體", "OK", ""); return; } if (selections[0].GetComponent <BattleBehaviour>() == null) { EditorUtility.DisplayDialog("提示", "未找到BattleBehaviour腳本", "OK", ""); return; } Transform battleT = selections[0]; //創建copy的gameobject GameObject battleCombineGo = GameObject.Instantiate <GameObject>(battleT.gameObject); string prefabName = battleT.name; string suffix = "_Raw"; int nameFormatIndex = prefabName.LastIndexOf(suffix); if (nameFormatIndex == prefabName.Length - suffix.Length) { //帶了後綴,刪掉後綴就是現在的名稱 prefabName = prefabName.Substring(0, nameFormatIndex); } battleCombineGo.name = prefabName; //battle才能被看見 int layer = battleT.gameObject.layer; //所有怪點刪除sprite renderer EnemyPoint[] enemyPoints = battleCombineGo.GetComponentsInChildren <EnemyPoint>(); for (int i = 0; i < enemyPoints.Length; i++) { SpriteRenderer[] renderers = enemyPoints[i].GetComponentsInChildren <SpriteRenderer>(); for (int j = 0; j < renderers.Length; j++) { DestroyImmediate(renderers[i]); } } //有SimpleMeshCombine腳本的物體為mesh根目錄。 有可能會有多個目錄 SimpleMeshCombine[] meshCombines = battleCombineGo.GetComponentsInChildren <SimpleMeshCombine>(); for (int i = 0; i < meshCombines.Length; i++) { SimpleMeshCombine tmpMeshCombine = meshCombines[i]; MeshRenderer[] meshRenderers = tmpMeshCombine.GetComponentsInChildren <MeshRenderer>(); //合併模型之後其它的renderer會被關閉,複製出來後,將所有對應目錄下關閉了的renderer全部刪掉 for (int j = 0; j < meshRenderers.Length; j++) { MeshRenderer renderer = meshRenderers[j]; if (!renderer.enabled) { //如果此renderer被關閉表示合併前的小模型,刪除 Object.DestroyImmediate(renderer.gameObject); } else { renderer.gameObject.layer = layer; } } if (tmpMeshCombine != null) { //合併腳本也直接刪掉 Object.DestroyImmediate(tmpMeshCombine); } } GameObject battleCombineGoPrefab = PrefabUtility.CreatePrefab(PREFAB_PATH + battleCombineGo.name + ".prefab", battleCombineGo); Object.DestroyImmediate(battleCombineGo); PrefabUtility.InstantiatePrefab(battleCombineGoPrefab); //EditorUtility.DisplayDialog("提示", "創建成功。 請重新賦值合併後的mesh", "ok"); if (battleT) { battleT.gameObject.SetActive(false); } }
void OnEnable() { smc = (SimpleMeshCombine)target; }
public static void Combine(SimpleMeshCombine target) { MeshFilter[] meshFilters = FindEnabledMeshes(target.transform); if (meshFilters.Length > 0) { GameObject combinedFrags = new GameObject(); combinedFrags.AddComponent <MeshFilter>(); combinedFrags.AddComponent <MeshRenderer>(); MeshInstance[] instances = new MeshInstance[meshFilters.Length]; GameObject[] combinedGOs = new GameObject[meshFilters.Length]; MeshFilter matFilter = null; for (int i = 0; i < meshFilters.Length; i++) { MeshFilter mf = meshFilters[i]; if (i == meshFilters.Length - 1) { matFilter = mf; } combinedGOs[i] = mf.gameObject; MeshInstance mi = new MeshInstance(); mi.mesh = mf.sharedMesh; // D.Log(mi.mesh.vertices.Length); // mi.subMeshIndex = mf.sharedMesh.subMeshCount; mi.subMeshIndex = 0; mi.transform = mf.transform.localToWorldMatrix; instances[i] = mi; } target.combinedGameObjects = combinedGOs; Mesh m = MeshCombineUtility.Combine(instances, false); // D.Log(target.transform.name+ // " Combined " + meshFilters.Length + " Meshes"); // D.Warn("Mesh: " + m.vertices.Length); // CombineInstance[] combine = new CombineInstance[meshFilters.Length]; // GameObject[] mfGOs = new GameObject[meshFilters.Length]; // for (int i=0; i<meshFilters.Length; i++) { // MeshFilter mf = meshFilters[i]; // MeshRenderer mr = combinedFrags.GetComponent<MeshRenderer>(); // mr.sharedMaterial = mf.transform.GetComponent<MeshRenderer>().sharedMaterial; // mfGOs[i] = meshFilters[i].gameObject; // CombineInstance ci = combine[i]; // ci.mesh = mf.transform.GetComponent<MeshFilter>().sharedMesh; // ci.transform = mf.transform.localToWorldMatrix; // combine[i] = ci; // } combinedFrags.GetComponent <MeshFilter>().mesh = m; combinedFrags.GetComponent <MeshRenderer>().sharedMaterial = matFilter.GetComponent <Renderer>().sharedMaterial; // combinedFrags.GetComponent<MeshFilter>().mesh = new Mesh(); // combinedFrags.GetComponent<MeshFilter>().sharedMesh.CombineMeshes(combine); // // Disabled for now // // if (target._generateLightmapUV){ // // Unwrapping.GenerateSecondaryUVSet(combinedFrags.GetComponent(MeshFilter).sharedMesh); // // combinedFrags.isStatic = true; // // } combinedFrags.name = "_Combined Mesh [" + target.transform.name + "]"; target.combined = combinedFrags.gameObject; combinedFrags.transform.parent = target.transform; EnableRenderers(meshFilters, false); } }