232 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			232 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C#
		
	
	
	
| using System.Collections;
 | |
| using System.Collections.Generic;
 | |
| using UnityEngine;
 | |
| using System.Linq;
 | |
| using UnityEngine.Rendering;
 | |
| 
 | |
| 
 | |
| public class DayNight : MonoBehaviour
 | |
| {
 | |
|     //  In the 2 fields below, only the materials that will be alternated in the day/night exchange are registered
 | |
|     //  When adding your buildings(which will have their own materials), you can register the day and night versions of the materials here.
 | |
|     //  The index of the daytime version of the material must match the index of the nighttime version of the material
 | |
|     //  Example: When switching to night scene, materialDay[1] will be replaced by materialNight[1]
 | |
|     //  (Materials that will be used both night and day do not need to be here)
 | |
|     public Material[] materialDay;   // Add materials that are only used in the day scene, and are substituted in the night scene
 | |
|     public Material[] materialNight; // Add night scene materials that will replace day scene materials. (The sequence must be respected)
 | |
| 
 | |
| 
 | |
|     //Here are the skyboxes for day and night.
 | |
|     //You can replace with other skyboxes
 | |
|     public Material skyBoxDay;
 | |
|     public Material skyBoxNight;
 | |
| 
 | |
|     //Don't forget to add the Directional Light here
 | |
|     public Light directionalLight;
 | |
| 
 | |
|     [HideInInspector]
 | |
|     public bool isNight;
 | |
| 
 | |
|     [HideInInspector]
 | |
|     public bool isMoonLight;
 | |
| 
 | |
|     [HideInInspector]
 | |
|     public bool isSpotLights;
 | |
| 
 | |
|     [HideInInspector]
 | |
|     public bool night;
 | |
| 
 | |
|     [HideInInspector]
 | |
|     public bool moonLight;
 | |
| 
 | |
|     [HideInInspector]
 | |
|     public bool spotLights;
 | |
| 
 | |
|     [HideInInspector]
 | |
|     public float intenseMoonLight = 0.2f;
 | |
| 
 | |
|     [HideInInspector]
 | |
|     public float _intenseMoonLight;
 | |
| 
 | |
|     [HideInInspector]
 | |
|     public float intenseSunLight = 1f;
 | |
| 
 | |
|     [HideInInspector]
 | |
|     public float _intenseSunLight;
 | |
| 
 | |
|     [HideInInspector]
 | |
|     public Color skyColorDay = new Color(0.74f, 0.62f, 0.60f);
 | |
|     [HideInInspector]
 | |
|     public Color equatorColorDay = new Color(0.74f, 0.74f, 0.74f);
 | |
| 
 | |
| 
 | |
|     [HideInInspector]
 | |
|     public Color _skyColorDay;
 | |
|     [HideInInspector]
 | |
|     public Color _equatorColorDay;
 | |
| 
 | |
| 
 | |
|     [HideInInspector]
 | |
|     public Color skyColorNight = new Color(0.78f, 0.72f , 0.72f);
 | |
|     [HideInInspector]
 | |
|     public Color equatorColorNight = new Color(0.16f, 0.16f, 0.16f);
 | |
| 
 | |
|     [HideInInspector]
 | |
|     public Color _skyColorNight;
 | |
|     [HideInInspector]
 | |
|     public Color _equatorColorNight;
 | |
| 
 | |
|     [HideInInspector]
 | |
|     public Color sunLightColor;
 | |
|     [HideInInspector]
 | |
|     public Color _sunLightColor;
 | |
| 
 | |
|     [HideInInspector]
 | |
|     public Color moonLightColor;
 | |
|     [HideInInspector]
 | |
|     public Color _moonLightColor;
 | |
| 
 | |
| 
 | |
|     public void ChangeMaterial()
 | |
|     {
 | |
|        
 | |
|         //Switching the skyboxes according to day/ night
 | |
|         RenderSettings.skybox = (isNight) ? skyBoxNight : skyBoxDay;
 | |
| 
 | |
|         /*
 | |
|         Setting the ambient (gradient) light to fit day/night
 | |
|         These are properties of the "Lighting" window and Directional Light
 | |
|         */
 | |
|         UpdateColor();
 | |
| 
 | |
| 
 | |
|         /*
 | |
|           Substituting Night materials for Day materials (or vice versa) in all Mesh Renders within City-Maker
 | |
|           Only materials that have been added in "materialDay" and "materialNight" Array
 | |
|         */
 | |
| 
 | |
|         GameObject GmObj = GameObject.Find("City-Maker");
 | |
| 
 | |
|         if (GmObj == null) return;
 | |
| 
 | |
|         Renderer[] children = GmObj.GetComponentsInChildren<Renderer>();
 | |
| 
 | |
|         Material[] myMaterials;
 | |
| 
 | |
|         for (int i = 0; i < children.Length; i++)
 | |
|         {
 | |
|             myMaterials = children[i].GetComponent<Renderer>().sharedMaterials;
 | |
| 
 | |
|             for (int m = 0; m < myMaterials.Length; m++)
 | |
|             {
 | |
|                 for (int mt = 0; mt < materialDay.Length; mt++)
 | |
|                 if (isNight)
 | |
|                 {
 | |
|                     if(myMaterials[m] == materialDay[mt])
 | |
|                         myMaterials[m] = materialNight[mt];
 | |
| 
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     if (myMaterials[m] == materialNight[mt])
 | |
|                         myMaterials[m] = materialDay[mt];
 | |
|                 }
 | |
| 
 | |
| 
 | |
|                 children[i].GetComponent<MeshRenderer>().sharedMaterials = myMaterials;
 | |
|             }
 | |
| 
 | |
| 
 | |
|         }
 | |
| 
 | |
|         //Configuring the Directional Light as it is day or night (sun/moon)
 | |
|         SetDirectionalLight();
 | |
| 
 | |
|         //Toggles street lamp lights on/off
 | |
|         SetStreetLights();
 | |
| 
 | |
| 
 | |
|     }
 | |
| 
 | |
|     public void UpdateColor()
 | |
|     {
 | |
| 
 | |
|         /*
 | |
|         Setting the ambient (gradient) light to fit day/night
 | |
|         These are properties of the "Lighting" window and Directional Light
 | |
|         */
 | |
| 
 | |
| 
 | |
| 
 | |
|         if (isNight)
 | |
|         {
 | |
|             
 | |
|             //During the Night
 | |
| 
 | |
|             if (directionalLight)
 | |
|                 directionalLight.GetComponent<Light>().color = moonLightColor;
 | |
| 
 | |
|             RenderSettings.ambientMode = AmbientMode.Trilight;
 | |
| 
 | |
|             RenderSettings.ambientSkyColor = skyColorNight;  // Floor color/brightness (any face up) - no moonlight
 | |
| 
 | |
|             RenderSettings.ambientEquatorColor = equatorColorNight;  // Wall color/ luminosity(any side facing)
 | |
|             RenderSettings.ambientGroundColor = new Color(0.07f, 0.07f, 0.07f);  // Ceiling color/brightness (any face down)
 | |
|         }
 | |
|         else
 | |
|         {
 | |
| 
 | |
|             if (directionalLight)
 | |
|                 directionalLight.GetComponent<Light>().color = sunLightColor;
 | |
| 
 | |
|             //During the day
 | |
|             RenderSettings.ambientMode = AmbientMode.Trilight;
 | |
| 
 | |
| 
 | |
|             RenderSettings.ambientSkyColor = skyColorDay;     // Floor color/brightness (any face up) 
 | |
|             RenderSettings.ambientEquatorColor = equatorColorDay; // Wall color/ luminosity(any side facing)
 | |
|             RenderSettings.ambientGroundColor = new Color(0.4f, 0.4f, 0.4f); ;   // Ceiling color/brightness (any face down)
 | |
| 
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public void SetDirectionalLight()
 | |
|     {
 | |
|         if (directionalLight)
 | |
|         {
 | |
|             //Directional Light activated only during the day, or if it is night with moonlight
 | |
|             directionalLight.GetComponent<Light>().enabled = (!isNight || isMoonLight);
 | |
| 
 | |
|             //Directional Light intensity, depending on day or night
 | |
|             directionalLight.intensity = (isNight) ? intenseMoonLight / 100: intenseSunLight / 100;
 | |
| 
 | |
| 
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     //Toggles street lamp lights on/off
 | |
|     public void SetStreetLights()
 | |
|     {
 | |
|         GameObject[] tempArray = GameObject.FindObjectsOfType(typeof(GameObject)).Select(g => g as GameObject).Where(g => g.name == ("_LightV")).ToArray();
 | |
| 
 | |
|         foreach (GameObject lines in tempArray)
 | |
|         {
 | |
|             lines.GetComponent<MeshRenderer>().enabled = isNight;
 | |
|             if (lines.transform.GetChild(0))
 | |
|             {
 | |
|                 lines.transform.GetChild(0).GetComponent<Light>().enabled = (isSpotLights && isNight);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         tempArray = GameObject.FindObjectsOfType(typeof(GameObject)).Select(g => g as GameObject).Where(g => g.name == ("_Spot_Light")).ToArray();
 | |
| 
 | |
|         foreach (GameObject lines in tempArray)
 | |
|         {
 | |
|             lines.GetComponent<Light>().enabled = (isSpotLights && isNight);
 | |
|         }
 | |
| 
 | |
|     }
 | |
| 
 | |
| 
 | |
| }
 |