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"); }
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"); }