private void PurgeStaticallyBatchedRenderers(GameObject go) { StaticBatchRenderer renderer = go.GetComponent <StaticBatchRenderer>(); if (renderer != null) { MeshRenderer[] renderers = renderer.GetComponentsInChildren <MeshRenderer>(); for (int i = 0; i < renderers.Length; i++) { GameObject rendererGo = renderers[i].gameObject; rendererGo.RemoveComponent(renderers[i]); MeshFilter filter = rendererGo.GetComponent <MeshFilter>(); if (filter != null) { rendererGo.RemoveComponent(filter); } PurgeGo(rendererGo); } } }
private void CreateStaticBatchRenderers(ContentProcessorContext context, Dictionary <int, UnityObject> idMap) { Dictionary <string, StaticBatchRenderer> staticRenderers = new Dictionary <string, StaticBatchRenderer>(); foreach (Renderer r in scene.components.Where(c => (c is Renderer)).ToArray()) { if (r.gameObject == null) { Debug.LogError("The gameObject of " + r + " has vanished?!"); continue; } if (!r.gameObject.isStatic) { continue; } string key = GetMaterialKey(r.sharedMaterials); if (!staticRenderers.ContainsKey(key)) { GameObject sbGo = new GameObject("Static - " + key); while (idMap.ContainsKey(sbGo.GetInstanceID())) { sbGo.SetNewId(null); } StaticBatchRenderer sbr = sbGo.AddComponent <StaticBatchRenderer>(); while (idMap.ContainsKey(sbr.GetInstanceID())) { sbr.SetNewId(null); } staticRenderers[key] = sbr; staticRenderers[key].useLightMap = (scene.lightmapSettings != null); staticRenderers[key].lightmapIndex = r.lightmapIndex; staticRenderers[key].sharedMaterials = (Material[])r.sharedMaterials.Clone(); } MeshFilter mf = r.gameObject.GetComponent <MeshFilter>(); if (mf == null) { throw new Exception("The statically marked renderer at " + r.gameObject + " does not have a meshfilter."); } if (mf.meshToRender == null) { throw new Exception("The static meshfilter at " + r.gameObject + " does not have a mesh."); } int id = mf.meshToRender.GetInstanceID(); Mesh[] meshes = context.BuildAndLoadAsset <Mesh[], Mesh[]>(new ExternalReference <Mesh[]>(mf.meshToRender.asset + ".xml"), null, null, "XmlImporter"); if (meshes == null) { throw new Exception("The mesh with Id " + id + " was not found in assets. Gotten from " + mf); } Mesh mesh = meshes.First(m => m.GetInstanceID() == id); if (mesh == null) { throw new Exception("The mesh with Id " + id + " was not found in assets. Gotten from " + mf); } if (staticRenderers[key].AddMesh(mesh, r)) { r.isPartOfStaticBatch = true; mf.mesh = null; } } foreach (KeyValuePair <string, StaticBatchRenderer> sbr in staticRenderers) { sbr.Value.PrepareQuadTree(); } scene.gameObjects.AddRange(staticRenderers.Values.Select(sbr => sbr.gameObject)); }