| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417 | using System.Collections;using System.Collections.Generic;using UnityEngine;using System;namespace Enviro{    [Serializable]    public class EnviroWeather     {        public List<EnviroWeatherType> weatherTypes = new List<EnviroWeatherType>();        public float cloudsTransitionSpeed = 1f;        public float fogTransitionSpeed = 1f;        public float lightingTransitionSpeed = 1f;        public float effectsTransitionSpeed = 1f;        public float auroraTransitionSpeed = 1f;        public float environmentTransitionSpeed = 1f;        public float audioTransitionSpeed = 1f;    }      [Serializable]    [ExecuteInEditMode]    public class EnviroWeatherModule : EnviroModule    {          public Enviro.EnviroWeather Settings;        public EnviroWeatherModule preset;        public EnviroWeatherType targetWeatherType;        public EnviroZone currentZone;        private bool instantTransition = false;        public BoxCollider triggerCollider;        public Rigidbody triggerRB;        public override void Enable ()        {             if(targetWeatherType == null && Settings.weatherTypes.Count > 0)               targetWeatherType = Settings.weatherTypes[0];            Setup();        }         public override void Disable ()        {             Cleanup();        }        private void Setup()        {            if(EnviroManager.instance.gameObject.GetComponent<BoxCollider>() == null)               triggerCollider = EnviroManager.instance.gameObject.AddComponent<BoxCollider>();            else               triggerCollider = EnviroManager.instance.gameObject.GetComponent<BoxCollider>();                        triggerCollider.isTrigger = true;            triggerCollider.size = new Vector3(0.1f,0.1f,0.1f);            if(EnviroManager.instance.gameObject.GetComponent<Rigidbody>() == null)               triggerRB = EnviroManager.instance.gameObject.AddComponent<Rigidbody>();            else               triggerRB = EnviroManager.instance.gameObject.GetComponent<Rigidbody>();             triggerRB.isKinematic = true;        }          private void Cleanup()        {            if(triggerCollider != null)               DestroyImmediate(triggerCollider);            if(triggerRB != null)               DestroyImmediate(triggerRB);        }         /// Adds weather type to the list or creates a new one.        public void CreateNewWeatherType()        {            EnviroWeatherType type = EnviroWeatherTypeCreation.CreateMyAsset();            Settings.weatherTypes.Add(type);        }        /// Removes the weather type from the list.        public void RemoveWeatherType(EnviroWeatherType type)        {            Settings.weatherTypes.Remove(type);        }        //Cleans the list from null entries.        public void CleanupList()         {            for (int i = 0; i < Settings.weatherTypes.Count; i++)            {                if(Settings.weatherTypes[i] == null)                    Settings.weatherTypes.RemoveAt(i);            }         }          private IEnumerator InstantTransition()        {            yield return null;            instantTransition = false;        }        // Update Method        public override void UpdateModule ()        {             //Instant changes when not playing or instant change is triggered            if(!Application.isPlaying || instantTransition)            {                if(targetWeatherType != null)                {                    BlendVolumetricCloudsOverride(1f);                    BlendFlatCloudsOverride(1f);                      BlendLightingOverride(1f);                          BlendEffectsOverride(1f);                     BlendAuroraOverride(1f);                           BlendFogOverride(1f);                          BlendAudioOverride(1f);                    BlendEnvironmentOverride(1f);                    BlendLightningOverride(1f);                }                 if(instantTransition)                   instantTransition = false;            }            else            {                if(targetWeatherType != null)                {                    BlendVolumetricCloudsOverride(Settings.cloudsTransitionSpeed * Time.deltaTime);                    BlendFlatCloudsOverride(Settings.cloudsTransitionSpeed * Time.deltaTime);                    BlendLightingOverride(Settings.lightingTransitionSpeed * Time.deltaTime);                          BlendEffectsOverride(Settings.effectsTransitionSpeed * Time.deltaTime);                       BlendAuroraOverride(Settings.auroraTransitionSpeed * Time.deltaTime);                       BlendFogOverride(Settings.fogTransitionSpeed * Time.deltaTime);                          BlendAudioOverride(Settings.audioTransitionSpeed * Time.deltaTime);                    BlendEnvironmentOverride(Settings.environmentTransitionSpeed * Time.deltaTime);                    BlendLightningOverride(1f);                }            }        }        private void BlendLightingOverride(float blendTime)        {            EnviroLightingModule lighting = EnviroManager.instance.Lighting;                        if(lighting != null)             {                lighting.Settings.directLightIntensityModifier = Mathf.Lerp(lighting.Settings.directLightIntensityModifier, targetWeatherType.lightingOverride.directLightIntensityModifier,blendTime);                 lighting.Settings.ambientIntensityModifier = Mathf.Lerp(lighting.Settings.ambientIntensityModifier, targetWeatherType.lightingOverride.ambientIntensityModifier,blendTime);             }        }         private void BlendFogOverride(float blendTime)        {            EnviroFogModule fog = EnviroManager.instance.Fog;                        if(fog != null)            {                fog.Settings.fogDensity = Mathf.Lerp(fog.Settings.fogDensity, targetWeatherType.fogOverride.fogDensity,blendTime);                 fog.Settings.fogHeightFalloff = Mathf.Lerp(fog.Settings.fogHeightFalloff, targetWeatherType.fogOverride.fogHeightFalloff,blendTime);                fog.Settings.fogHeight = Mathf.Lerp(fog.Settings.fogHeight, targetWeatherType.fogOverride.fogHeight,blendTime);                fog.Settings.fogDensity2 = Mathf.Lerp(fog.Settings.fogDensity2, targetWeatherType.fogOverride.fogDensity2,blendTime);                 fog.Settings.fogHeightFalloff2 = Mathf.Lerp(fog.Settings.fogHeightFalloff2, targetWeatherType.fogOverride.fogHeightFalloff2,blendTime);                fog.Settings.fogHeight2 = Mathf.Lerp(fog.Settings.fogHeight2, targetWeatherType.fogOverride.fogHeight2,blendTime);                 fog.Settings.fogColorBlend = Mathf.Lerp(fog.Settings.fogColorBlend, targetWeatherType.fogOverride.fogColorBlend,blendTime);                fog.Settings.scattering = Mathf.Lerp(fog.Settings.scattering, targetWeatherType.fogOverride.scattering,blendTime);                fog.Settings.extinction = Mathf.Lerp(fog.Settings.extinction, targetWeatherType.fogOverride.extinction,blendTime);                fog.Settings.anistropy = Mathf.Lerp(fog.Settings.anistropy, targetWeatherType.fogOverride.anistropy,blendTime);                #if ENVIRO_HDRP                fog.Settings.fogAttenuationDistance = Mathf.Lerp(fog.Settings.fogAttenuationDistance, targetWeatherType.fogOverride.fogAttenuationDistance,blendTime);                 fog.Settings.baseHeight = Mathf.Lerp(fog.Settings.baseHeight, targetWeatherType.fogOverride.baseHeight,blendTime);                 fog.Settings.maxHeight = Mathf.Lerp(fog.Settings.maxHeight, targetWeatherType.fogOverride.maxHeight,blendTime);                                 fog.Settings.ambientDimmer = Mathf.Lerp(fog.Settings.ambientDimmer, targetWeatherType.fogOverride.ambientDimmer,blendTime);                fog.Settings.directLightMultiplier = Mathf.Lerp(fog.Settings.directLightMultiplier, targetWeatherType.fogOverride.directLightMultiplier,blendTime);                fog.Settings.directLightShadowdimmer = Mathf.Lerp(fog.Settings.ambientDimmer, targetWeatherType.fogOverride.directLightShadowdimmer,blendTime);                #endif            }        }        private void BlendEffectsOverride(float blendTime)        {            EnviroEffectsModule effects = EnviroManager.instance.Effects;                        if(effects != null)            {                effects.Settings.rain1Emission = Mathf.Lerp(effects.Settings.rain1Emission, targetWeatherType.effectsOverride.rain1Emission,blendTime);                 effects.Settings.rain2Emission = Mathf.Lerp(effects.Settings.rain2Emission, targetWeatherType.effectsOverride.rain2Emission,blendTime);                effects.Settings.snow1Emission = Mathf.Lerp(effects.Settings.snow1Emission, targetWeatherType.effectsOverride.snow1Emission,blendTime);                 effects.Settings.snow2Emission = Mathf.Lerp(effects.Settings.snow2Emission, targetWeatherType.effectsOverride.snow2Emission,blendTime);                 effects.Settings.custom1Emission = Mathf.Lerp(effects.Settings.custom1Emission, targetWeatherType.effectsOverride.custom1Emission,blendTime);                 effects.Settings.custom2Emission = Mathf.Lerp(effects.Settings.custom2Emission, targetWeatherType.effectsOverride.custom2Emission,blendTime);              }        }        private void BlendVolumetricCloudsOverride(float blendTime)        {            EnviroVolumetricCloudsModule clouds = EnviroManager.instance.VolumetricClouds;            if(clouds != null)            {                 clouds.settingsLayer1.coverage = Mathf.Lerp(clouds.settingsLayer1.coverage, targetWeatherType.cloudsOverride.coverageLayer1,blendTime);                clouds.settingsLayer1.dilateCoverage = Mathf.Lerp(clouds.settingsLayer1.dilateCoverage, targetWeatherType.cloudsOverride.dilateCoverageLayer1,blendTime);                clouds.settingsLayer1.dilateType = Mathf.Lerp(clouds.settingsLayer1.dilateType, targetWeatherType.cloudsOverride.dilateTypeLayer1,blendTime);                clouds.settingsLayer1.cloudsTypeModifier = Mathf.Lerp(clouds.settingsLayer1.cloudsTypeModifier, targetWeatherType.cloudsOverride.typeModifierLayer1,blendTime);                clouds.settingsLayer1.anvilBias = Mathf.Lerp(clouds.settingsLayer1.anvilBias, targetWeatherType.cloudsOverride.anvilBiasLayer1,blendTime);                                clouds.settingsLayer1.scatteringIntensity = Mathf.Lerp(clouds.settingsLayer1.scatteringIntensity, targetWeatherType.cloudsOverride.scatteringIntensityLayer1,blendTime);                clouds.settingsLayer1.multiScatteringA = Mathf.Lerp(clouds.settingsLayer1.multiScatteringA, targetWeatherType.cloudsOverride.multiScatteringALayer1,blendTime);                clouds.settingsLayer1.multiScatteringB = Mathf.Lerp(clouds.settingsLayer1.multiScatteringB, targetWeatherType.cloudsOverride.multiScatteringBLayer1,blendTime);                clouds.settingsLayer1.multiScatteringC = Mathf.Lerp(clouds.settingsLayer1.multiScatteringC, targetWeatherType.cloudsOverride.multiScatteringCLayer1,blendTime);                clouds.settingsLayer1.powderIntensity = Mathf.Lerp(clouds.settingsLayer1.powderIntensity, targetWeatherType.cloudsOverride.powderIntensityLayer1,blendTime);                clouds.settingsLayer1.silverLiningSpread = Mathf.Lerp(clouds.settingsLayer1.silverLiningSpread, targetWeatherType.cloudsOverride.silverLiningSpreadLayer1,blendTime);                clouds.settingsLayer1.lightAbsorbtion = Mathf.Lerp(clouds.settingsLayer1.lightAbsorbtion, targetWeatherType.cloudsOverride.ligthAbsorbtionLayer1,blendTime);                                clouds.settingsLayer1.density = Mathf.Lerp(clouds.settingsLayer1.density, targetWeatherType.cloudsOverride.densityLayer1,blendTime);                clouds.settingsLayer1.baseErosionIntensity = Mathf.Lerp(clouds.settingsLayer1.baseErosionIntensity, targetWeatherType.cloudsOverride.baseErosionIntensityLayer1,blendTime);                clouds.settingsLayer1.detailErosionIntensity = Mathf.Lerp(clouds.settingsLayer1.detailErosionIntensity, targetWeatherType.cloudsOverride.detailErosionIntensityLayer1,blendTime);                clouds.settingsLayer1.curlIntensity = Mathf.Lerp(clouds.settingsLayer1.curlIntensity, targetWeatherType.cloudsOverride.curlIntensityLayer1,blendTime);                 if(clouds.settingsGlobal.dualLayer)                {                    clouds.settingsLayer2.coverage = Mathf.Lerp(clouds.settingsLayer2.coverage, targetWeatherType.cloudsOverride.coverageLayer2,blendTime);                    clouds.settingsLayer2.dilateCoverage = Mathf.Lerp(clouds.settingsLayer2.dilateCoverage, targetWeatherType.cloudsOverride.dilateCoverageLayer2,blendTime);                    clouds.settingsLayer2.dilateType = Mathf.Lerp(clouds.settingsLayer2.dilateType, targetWeatherType.cloudsOverride.dilateTypeLayer2,blendTime);                    clouds.settingsLayer2.cloudsTypeModifier = Mathf.Lerp(clouds.settingsLayer2.cloudsTypeModifier, targetWeatherType.cloudsOverride.typeModifierLayer2,blendTime);                    clouds.settingsLayer2.anvilBias = Mathf.Lerp(clouds.settingsLayer2.anvilBias, targetWeatherType.cloudsOverride.anvilBiasLayer2,blendTime);                    clouds.settingsLayer2.scatteringIntensity = Mathf.Lerp(clouds.settingsLayer2.scatteringIntensity, targetWeatherType.cloudsOverride.scatteringIntensityLayer2,blendTime);                    clouds.settingsLayer2.multiScatteringA = Mathf.Lerp(clouds.settingsLayer2.multiScatteringA, targetWeatherType.cloudsOverride.multiScatteringALayer2,blendTime);                    clouds.settingsLayer2.multiScatteringB = Mathf.Lerp(clouds.settingsLayer2.multiScatteringB, targetWeatherType.cloudsOverride.multiScatteringBLayer2,blendTime);                    clouds.settingsLayer2.multiScatteringC = Mathf.Lerp(clouds.settingsLayer2.multiScatteringC, targetWeatherType.cloudsOverride.multiScatteringCLayer2,blendTime);                    clouds.settingsLayer2.powderIntensity = Mathf.Lerp(clouds.settingsLayer2.powderIntensity, targetWeatherType.cloudsOverride.powderIntensityLayer2,blendTime);                    clouds.settingsLayer2.silverLiningSpread = Mathf.Lerp(clouds.settingsLayer2.silverLiningSpread, targetWeatherType.cloudsOverride.silverLiningSpreadLayer2,blendTime);                    clouds.settingsLayer2.lightAbsorbtion = Mathf.Lerp(clouds.settingsLayer2.lightAbsorbtion, targetWeatherType.cloudsOverride.ligthAbsorbtionLayer2,blendTime);                                        clouds.settingsLayer2.density = Mathf.Lerp(clouds.settingsLayer2.density, targetWeatherType.cloudsOverride.densityLayer2,blendTime);                    clouds.settingsLayer2.baseErosionIntensity = Mathf.Lerp(clouds.settingsLayer2.baseErosionIntensity, targetWeatherType.cloudsOverride.baseErosionIntensityLayer2,blendTime);                    clouds.settingsLayer2.detailErosionIntensity = Mathf.Lerp(clouds.settingsLayer2.detailErosionIntensity, targetWeatherType.cloudsOverride.detailErosionIntensityLayer2,blendTime);                    clouds.settingsLayer2.curlIntensity = Mathf.Lerp(clouds.settingsLayer2.curlIntensity, targetWeatherType.cloudsOverride.curlIntensityLayer2,blendTime);                }             }        }        private void BlendFlatCloudsOverride(float blendTime)        {            EnviroFlatCloudsModule flatClouds = EnviroManager.instance.FlatClouds;                        if(flatClouds != null)            {                flatClouds.settings.cirrusCloudsAlpha = Mathf.Lerp(flatClouds.settings.cirrusCloudsAlpha, targetWeatherType.flatCloudsOverride.cirrusCloudsAlpha,blendTime);                flatClouds.settings.cirrusCloudsCoverage = Mathf.Lerp(flatClouds.settings.cirrusCloudsCoverage, targetWeatherType.flatCloudsOverride.cirrusCloudsCoverage,blendTime);                flatClouds.settings.cirrusCloudsColorPower = Mathf.Lerp(flatClouds.settings.cirrusCloudsColorPower, targetWeatherType.flatCloudsOverride.cirrusCloudsColorPower,blendTime);                flatClouds.settings.flatCloudsCoverage = Mathf.Lerp(flatClouds.settings.flatCloudsCoverage, targetWeatherType.flatCloudsOverride.flatCloudsCoverage,blendTime);                flatClouds.settings.flatCloudsDensity = Mathf.Lerp(flatClouds.settings.flatCloudsDensity, targetWeatherType.flatCloudsOverride.flatCloudsDensity,blendTime);                flatClouds.settings.flatCloudsLightIntensity = Mathf.Lerp(flatClouds.settings.flatCloudsLightIntensity, targetWeatherType.flatCloudsOverride.flatCloudsLightIntensity,blendTime);                flatClouds.settings.flatCloudsAmbientIntensity = Mathf.Lerp(flatClouds.settings.flatCloudsAmbientIntensity, targetWeatherType.flatCloudsOverride.flatCloudsAmbientIntensity,blendTime);                flatClouds.settings.flatCloudsAbsorbtion = Mathf.Lerp(flatClouds.settings.flatCloudsAbsorbtion, targetWeatherType.flatCloudsOverride.flatCloudsAbsorbtion,blendTime);                 }        }        private void BlendAuroraOverride(float blendTime)        {            EnviroAuroraModule aurora = EnviroManager.instance.Aurora;                        if(aurora != null)            {                aurora.Settings.auroraIntensityModifier = Mathf.Lerp(aurora.Settings.auroraIntensityModifier, targetWeatherType.auroraOverride.auroraIntensity,blendTime);             }        }        private void BlendEnvironmentOverride(float blendTime)        {            EnviroEnvironmentModule environment = EnviroManager.instance.Environment;                        if(environment != null)            {                environment.Settings.temperatureWeatherMod = Mathf.Lerp(environment.Settings.temperatureWeatherMod, targetWeatherType.environmentOverride.temperatureWeatherMod,blendTime);                environment.Settings.wetnessTarget = Mathf.Lerp(environment.Settings.wetnessTarget, targetWeatherType.environmentOverride.wetnessTarget,blendTime);                 environment.Settings.snowTarget = Mathf.Lerp(environment.Settings.snowTarget, targetWeatherType.environmentOverride.snowTarget,blendTime);             }        }        private void BlendAudioOverride(float blendTime)        {            EnviroAudioModule audio = EnviroManager.instance.Audio;                        if(audio != null)            {                for(int i = 0; i < audio.Settings.ambientClips.Count; i++)                {                    bool hasOverride = false;                    for(int a = 0; a < targetWeatherType.audioOverride.ambientOverride.Count; a++)                    {                        if(targetWeatherType.audioOverride.ambientOverride[a].name == audio.Settings.ambientClips[i].name)                        {                            audio.Settings.ambientClips[i].volume = Mathf.Lerp(audio.Settings.ambientClips[i].volume ,targetWeatherType.audioOverride.ambientOverride[a].volume,blendTime);                             hasOverride = true;                        }                    }                    if(!hasOverride)                        audio.Settings.ambientClips[i].volume = Mathf.Lerp(audio.Settings.ambientClips[i].volume ,0f,blendTime);                 }                for(int i = 0; i < audio.Settings.weatherClips.Count; i++)                {                    bool hasOverride = false;                    for(int a = 0; a < targetWeatherType.audioOverride.weatherOverride.Count; a++)                    {                        if(targetWeatherType.audioOverride.weatherOverride[a].name == audio.Settings.weatherClips[i].name)                        {                            audio.Settings.weatherClips[i].volume = Mathf.Lerp(audio.Settings.weatherClips[i].volume ,targetWeatherType.audioOverride.weatherOverride[a].volume,blendTime);                             hasOverride = true;                        }                    }                    if(!hasOverride)                        audio.Settings.weatherClips[i].volume = Mathf.Lerp(audio.Settings.weatherClips[i].volume ,0f,blendTime);                 }                      }        }        private void BlendLightningOverride(float blendTime)        {            EnviroLightningModule lightning = EnviroManager.instance.Lightning;                         if(lightning != null)            {                lightning.Settings.lightningStorm = targetWeatherType.lightningOverride.lightningStorm;                 lightning.Settings.randomLightingDelay = Mathf.Lerp(lightning.Settings.randomLightingDelay, targetWeatherType.lightningOverride.randomLightningDelay,blendTime);             }        }         //Changes the Weather to new type.        public void ChangeWeather(EnviroWeatherType type)        {            if(targetWeatherType != type)            {                EnviroManager.instance.NotifyWeatherChanged(type);            }            targetWeatherType = type;        }        public void ChangeWeather(string typeName)        {            for(int i = 0; i < Settings.weatherTypes.Count; i++)            {                if(Settings.weatherTypes[i].name == typeName)                {                    if(targetWeatherType != Settings.weatherTypes[i])                    {                        EnviroManager.instance.NotifyWeatherChanged(Settings.weatherTypes[i]);                    }                    targetWeatherType = Settings.weatherTypes[i];                }            }        }        public void ChangeWeatherInstant(EnviroWeatherType type)        {            if(targetWeatherType != type)            {                EnviroManager.instance.NotifyWeatherChanged(type);            }            targetWeatherType = type;            instantTransition = true;        }        //Save and Load        public void LoadModuleValues ()        {            if(preset != null)            {                Settings = JsonUtility.FromJson<Enviro.EnviroWeather>(JsonUtility.ToJson(preset.Settings));            }            else            {                Debug.Log("Please assign a saved module to load from!");            }        }        public void SaveModuleValues ()        {#if UNITY_EDITOR        EnviroWeatherModule t =  ScriptableObject.CreateInstance<EnviroWeatherModule>();        t.name = "Weather Module";        t.Settings = JsonUtility.FromJson<Enviro.EnviroWeather>(JsonUtility.ToJson(Settings));         string assetPathAndName = UnityEditor.AssetDatabase.GenerateUniqueAssetPath("Assets/Enviro 3" + "/New " + t.name + ".asset");        UnityEditor.AssetDatabase.CreateAsset(t, assetPathAndName);        UnityEditor.AssetDatabase.SaveAssets();        UnityEditor.AssetDatabase.Refresh();#endif        }        public void SaveModuleValues (EnviroWeatherModule module)        {            module.Settings = JsonUtility.FromJson<Enviro.EnviroWeather>(JsonUtility.ToJson(Settings));            #if UNITY_EDITOR            UnityEditor.EditorUtility.SetDirty(module);            UnityEditor.AssetDatabase.SaveAssets();            #endif        }    }}
 |