public void Combine() { if (base.gameObject.isStatic) { Debug.LogWarning(string.Format("이미 StaticBatching이 동작 중이므로 컴바인할 수 없습니다. (\"{0}\")", base.gameObject.name), base.gameObject); return; } TsMeshCombine.Cells.ResetBound(); MeshFilter[] componentsInChildren = base.GetComponentsInChildren <MeshFilter>(); Matrix4x4 worldToLocalMatrix = base.transform.worldToLocalMatrix; Dictionary <TsMeshCombine.Key, TsMeshCombine.Combiner> dictionary = new Dictionary <TsMeshCombine.Key, TsMeshCombine.Combiner>(); MeshFilter[] array = componentsInChildren; for (int i = 0; i < array.Length; i++) { MeshFilter meshFilter = array[i]; GameObject gameObject = meshFilter.gameObject; Renderer renderer = meshFilter.renderer; Mesh sharedMesh = meshFilter.sharedMesh; if (!sharedMesh.name.Contains("Combined Mesh (root: scene)")) { if (renderer != null && renderer.enabled && sharedMesh != null && !gameObject.isStatic) { if (gameObject.collider is MeshCollider) { Debug.LogWarning(string.Format("[CombinedMesh] 오브젝트에 MeshCollider가 있어서 combine 할 수 없습니다. (Object=\"{0}\", Mesh=\"{1}\")", gameObject.name, meshFilter.sharedMesh.name), gameObject); } else { TsMeshUtil.CombineData data = default(TsMeshUtil.CombineData); data.mesh = sharedMesh; data.transform = worldToLocalMatrix * meshFilter.transform.localToWorldMatrix; Vector3 position = meshFilter.transform.position; Material[] sharedMaterials = renderer.sharedMaterials; for (int j = 0; j < sharedMaterials.Length; j++) { Material material = sharedMaterials[j]; data.subMeshIndex = Math.Min(j, data.mesh.subMeshCount - 1); TsMeshCombine.Key key = new TsMeshCombine.Key(material, gameObject.layer, position); TsMeshCombine.Combiner combiner; if (!dictionary.TryGetValue(key, out combiner)) { combiner = new TsMeshCombine.Combiner(material, gameObject.layer, base.transform, key.ToString()); dictionary.Add(key, combiner); } combiner.Add(data); } UnityEngine.Object.DestroyImmediate(renderer); UnityEngine.Object.DestroyImmediate(meshFilter); } } } } foreach (TsMeshCombine.Combiner current in dictionary.Values) { current.Combine(); } this.CleanUp(base.transform); UnityEngine.Object.Destroy(this); }
public void Combine() { Mesh mesh = TsMeshUtil.Combine(this.list, this.material.name); if (mesh != null) { mesh.name = string.Format("Combined ({0})", this.root.name); GameObject gameObject = new GameObject(this.Name); gameObject.transform.parent = this.root; gameObject.transform.localScale = Vector3.one; gameObject.transform.localRotation = Quaternion.identity; gameObject.transform.localPosition = Vector3.zero; gameObject.AddComponent(typeof(MeshFilter)); gameObject.AddComponent(typeof(MeshRenderer)); gameObject.renderer.material = this.material; gameObject.layer = this.layer; MeshFilter component = gameObject.GetComponent <MeshFilter>(); component.mesh = mesh; } else { int count = this.list.Count; int num = count / 2; TsMeshCombine.Combiner combiner = new TsMeshCombine.Combiner(this.material, this.layer, this.root, this.nameTag); TsMeshCombine.Combiner combiner2 = new TsMeshCombine.Combiner(this.material, this.layer, this.root, this.nameTag); for (int i = 0; i < num; i++) { combiner.list.Add(this.list[i]); } for (int j = num; j < count; j++) { combiner2.list.Add(this.list[j]); } combiner.Combine(); combiner2.Combine(); } }