예제 #1
0
    static void AssignTerrainLODScripts()
    {
        Debug.Log("[AssignTerrainLODScripts] Start");

        GameObject[] allObjects = (GameObject[])Editor.FindObjectsOfType(typeof(GameObject));
        foreach (GameObject obj in allObjects)
        {
            if ((Renderer)obj.GetComponent(typeof(Renderer)) != null)
            {
                if ((obj.name.Contains("Low")) || (obj.name.Contains("Medium")) || (obj.name.Contains("High")))
                {
                    // Remove the script, we will reassign it in order to reset the script variables.
                    TerrainLOD   lod_script = obj.GetComponent(typeof(TerrainLOD)) as TerrainLOD;
                    MeshCollider mc         = obj.GetComponent(typeof(MeshCollider)) as MeshCollider;
                    while (lod_script)
                    {
                        Object.DestroyImmediate(lod_script);
                        lod_script = obj.GetComponent(typeof(TerrainLOD)) as TerrainLOD;
                    }
                    // удалим Mesh collider
                    while (mc)
                    {
                        Object.DestroyImmediate(mc);
                        mc = obj.GetComponent(typeof(MeshCollider)) as MeshCollider;
                    }
                    // hide LOD1 and LOD2 meshes (for editor purposes)
                    ((MeshRenderer)obj.GetComponent(typeof(MeshRenderer))).enabled = false;

                    if (obj.name.Contains("High"))
                    {
                        obj.AddComponent(typeof(TerrainLOD));
                        Debug.Log("[AssignTerrainLODScripts] Add LOD script to " + obj.name);
                        //Debug.Log ("Mesh name: " + m.name);
                        obj.AddComponent(typeof(MeshCollider));
                        // Enable Highest LOD mesh
                        ((MeshRenderer)obj.GetComponent(typeof(MeshRenderer))).enabled = true;
                    }

                    // нормируем имена компонентов
                    Renderer ren = (Renderer)obj.GetComponent(typeof(Renderer));
                    Debug.Log("Mat name: " + ren.sharedMaterial.name);
                    Debug.Log("Obj name: " + obj.name);
                    char[]   delim1  = { '(', ')' };
                    char[]   delim2  = { ' ' };
                    string[] number  = ren.sharedMaterial.name.Split(delim1);
                    string[] objname = obj.name.Split(delim2);
                    obj.name = objname[0] + ' ' + number[1];
                    Debug.Log("New Obj name: " + obj.name);
                }
            }
        }

        Debug.Log("[AssignTerrainLODScripts] End");
    }
예제 #2
0
    private void Start()
    {
        //Debug.Log("[TerrainLOD] Start");

        currentTimeToInterval = UpdateInterval;

        if (gameObject.name.Contains("High"))        // This is the high LOD node which will be mantained in scene and have
        // its LOD changed by meshes from the other LOD nodes.
        {
            // Determine the LOD meshes based on the name of the current terrain zone.
            // We assume that the terrain zones are named Low_node_X, Medium_node_X, High_node_X
            string terrain_zone_str = "High ";
            if (gameObject.name.Contains("High "))
            {
                terrain_zone_str = gameObject.name.Substring(5);
            }
            // else: terrain_zone_str is zero.

            uint terrain_zone_no = uint.Parse(terrain_zone_str);

            // High detail mesh renderer reference.
            LOD0 = (MeshRenderer)GetComponent(typeof(MeshRenderer));
            //if(LOD0)
            //Debug.Log("[TerrainLOD] Detail mesh: High " + terrain_zone_str);

            // Medium detail mesh.
            terrain_zone_str  = "Medium ";
            terrain_zone_str += terrain_zone_no;

            GameObject obj = GameObject.Find(terrain_zone_str);
            if (obj)
            {
                LOD1 = (MeshRenderer)obj.GetComponent(typeof(MeshRenderer));
                //if(LOD1)
                //Debug.Log("[TerrainLOD] Detail mesh: " + terrain_zone_str);
            }

            // Low detail mesh.
            terrain_zone_str  = "Low ";
            terrain_zone_str += terrain_zone_no;
            obj = GameObject.Find(terrain_zone_str);
            if (obj)
            {
                LOD2 = (MeshRenderer)obj.GetComponent(typeof(MeshRenderer));
                //if(LOD2)
                //	Debug.Log("[TerrainLOD] Detail mesh: " + terrain_zone_str);
            }
        }
        else         // This is a mesh from the other LODS, mark it as invisible.
        {
            gameObject.GetComponent <Renderer>().enabled     = false;
            gameObject.GetComponent <Renderer>().castShadows = false;
            //Debug.Log("[TerrainLOD] Invisible LOD mesh: " + gameObject.name);

            // Remove this script from the game object to avoid calling Update.
            TerrainLOD lod_script = gameObject.GetComponent(typeof(TerrainLOD)) as TerrainLOD;
            if (lod_script)
            {
                //Debug.Log("[TerrainLOD] Remove LOD script");
                Object.DestroyImmediate(lod_script);
            }
        }

        //Debug.Log("[TerrainLOD] End");
    }