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
- }
- }
- }
|