using UnityEngine; [ExecuteInEditMode] public class NM_Wind : MonoBehaviour { [Header("General Parameters")] [Tooltip("Wind Speed in Kilometers per hour")] public float WindSpeed = 30f; [Range(0f, 2f)] [Tooltip("Wind Turbulence in percentage of wind Speed")] public float Turbulence = 0.25f; [Header("Noise Parameters")] [Tooltip("Texture used for wind turbulence")] public Texture2D NoiseTexture; [Tooltip("Size of one world tiling patch of the Noise Texture, for bending trees")] public float FlexNoiseWorldSize = 175f; [Tooltip("Size of one world tiling patch of the Noise Texture, for leaf shivering")] public float ShiverNoiseWorldSize = 10f; [Header("Gust Parameters")] [Tooltip("Texture used for wind gusts")] public Texture2D GustMaskTexture; [Tooltip("Size of one world tiling patch of the Gust Texture, for leaf shivering")] public float GustWorldSize = 600f; [Tooltip("Wind Gust Speed in Kilometers per hour")] public float GustSpeed = 50f; [Tooltip("Wind Gust Influence on trees")] public float GustScale = 1f; [Header("Wind Sherical")] [Tooltip("Wind Gust Influence on trees")] public WindZone point1; public WindZone point2; public WindZone point3; public WindZone point4; private Vector4 pos1; private Vector4 pos2; private Vector4 pos3; private Vector4 pos4; private Vector4 radius; private void Start() { ApplySettings(); } private void Update() { ApplySettings(); } private void OnValidate() { ApplySettings(); } private void ApplySettings() { Shader.SetGlobalTexture("WIND_SETTINGS_TexNoise", NoiseTexture); Shader.SetGlobalTexture("WIND_SETTINGS_TexGust", GustMaskTexture); Shader.SetGlobalVector("WIND_SETTINGS_WorldDirectionAndSpeed", GetDirectionAndSpeed()); Shader.SetGlobalFloat("WIND_SETTINGS_FlexNoiseScale", 1f / Mathf.Max(0.01f, FlexNoiseWorldSize)); Shader.SetGlobalFloat("WIND_SETTINGS_ShiverNoiseScale", 1f / Mathf.Max(0.01f, ShiverNoiseWorldSize)); Shader.SetGlobalFloat("WIND_SETTINGS_Turbulence", WindSpeed * Turbulence); Shader.SetGlobalFloat("WIND_SETTINGS_GustSpeed", GustSpeed); Shader.SetGlobalFloat("WIND_SETTINGS_GustScale", GustScale); Shader.SetGlobalFloat("WIND_SETTINGS_GustWorldScale", 1f / Mathf.Max(0.01f, GustWorldSize)); if (point1 != null) { pos1 = new Vector4(point1.transform.position.x, point1.transform.position.y, point1.transform.position.z, point1.windMain * 0.2777f); radius[0] = point1.radius; } else { pos1 = new Vector4(0f, 0f, 0f, 0f); radius[0] = 0.1f; } if (point2 != null) { pos2 = new Vector4(point2.transform.position.x, point2.transform.position.y, point2.transform.position.z, point2.windMain * 0.2777f); radius[1] = point2.radius; } else { pos2 = new Vector4(0f, 0f, 0f, 0f); radius[1] = 0.1f; } if (point3 != null) { pos3 = new Vector4(point3.transform.position.x, point3.transform.position.y, point3.transform.position.z, point3.windMain * 0.2777f); radius[2] = point3.radius; } else { pos3 = new Vector4(0f, 0f, 0f, 0f); radius[2] = 0.1f; } if (point4 != null) { pos4 = new Vector4(point4.transform.position.x, point4.transform.position.y, point4.transform.position.z, point4.windMain * 0.2777f); radius[3] = point4.radius; } else { pos4 = new Vector4(0f, 0f, 0f, 0f); radius[3] = 0.1f; } Shader.SetGlobalMatrix("WIND_SETTINGS_Points", new Matrix4x4(pos1, pos2, pos3, pos4)); Shader.SetGlobalVector("WIND_SETTINGS_Points_Radius", radius); } private Vector4 GetDirectionAndSpeed() { Vector3 normalized = base.transform.forward.normalized; return new Vector4(normalized.x, normalized.y, normalized.z, WindSpeed * 0.2777f); } }