private void CombineMeshes() { List <Renderer> list = null; Dictionary <Material, List <Renderer> > dictionary = new Dictionary <Material, List <Renderer> >(); foreach (Renderer current in this.renderers) { if (current.enabled) { Material[] sharedMaterials = current.sharedMaterials; for (int i = 0; i < sharedMaterials.Length; i++) { Material material = sharedMaterials[i]; if (material != null) { List <Renderer> list2; if (!dictionary.TryGetValue(material, out list2)) { list2 = new List <Renderer>(); dictionary[material] = list2; } list2.Add(current); } } current.enabled = false; } else { if (list == null) { list = new List <Renderer>(); } list.Add(current); } } if (list != null) { int count = list.Count; for (int j = 0; j < count; j++) { this.renderers.Remove(list[j]); } list.Clear(); list = null; } foreach (KeyValuePair <Material, List <Renderer> > current2 in dictionary) { GameObject fromPool = this.meshCombinerGameObjectPool.GetFromPool(); UnityUtils.ChangeGameObjectParent(fromPool, this.containerObject); fromPool.name = current2.get_Key().name; MeshFilter component = fromPool.GetComponent <MeshFilter>(); fromPool.GetComponent <Renderer>().sharedMaterial = current2.get_Key(); List <Renderer> value = current2.get_Value(); int count2 = value.Count; CombineInstance[] array = new CombineInstance[count2]; for (int k = 0; k < count2; k++) { MeshFilter component2 = value[k].GetComponent <MeshFilter>(); UnityUtils.SetCombineInstance(ref array[k], component2.sharedMesh, component2.transform.localToWorldMatrix); } component.sharedMesh.CombineMeshes(array, true, true); } }