Пример #1
0
        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);
                }
            }
        }
Пример #2
0
        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));
        }