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 Add(TsMeshUtil.CombineData data) { this.list.Add(data); }