using System; namespace UnityEngine.AzureSky { [AddComponentMenu("Azure[Sky] Dynamic Skybox/Azure Weather Zone")] public sealed class AzureWeatherZone : MonoBehaviour { /// The weather preset for this local weather zone. public AzureWeatherPreset weatherPreset { get => m_weatherPreset; set => m_weatherPreset = value; } [SerializeField] private AzureWeatherPreset m_weatherPreset; /// The collider used as volume by this local weather zone. public Collider colliderVolume { get => m_colliderVolume; set => m_colliderVolume = value; } [SerializeField] private Collider m_colliderVolume; /// How smooth is the weather change when entering a local weather zone. public float blendDistance { get => m_blendDistance; set => m_blendDistance = value; } [SerializeField] private float m_blendDistance = 0f; private void Awake() { if (!m_colliderVolume) m_colliderVolume = GetComponent(); } #if UNITY_EDITOR /// The color used to draw the volume gizmo. private Color m_gizmosColor1 = new Color(0, 1, 0, 0.25f); /// Draws the zone collider gizmos. Based on Unity's PostProcessVolume.cs. private void OnDrawGizmos() { if (!m_colliderVolume) m_colliderVolume = GetComponent(); if (m_colliderVolume == null) return; if (m_colliderVolume.enabled) { Vector3 scale = transform.lossyScale; Vector3 invScale = new Vector3(1f / scale.x, 1f / scale.y, 1f / scale.z); Gizmos.matrix = Matrix4x4.TRS(transform.position, transform.rotation, scale); Type type = m_colliderVolume.GetType(); if (type == typeof(BoxCollider)) { BoxCollider c = (BoxCollider)m_colliderVolume; Gizmos.color = m_gizmosColor1; Gizmos.DrawCube(c.center, c.size); Gizmos.color = Color.green; Gizmos.DrawWireCube(c.center, c.size + invScale * m_blendDistance * 4f); } else if (type == typeof(SphereCollider)) { SphereCollider c = (SphereCollider)m_colliderVolume; Gizmos.color = m_gizmosColor1; Gizmos.DrawSphere(c.center, c.radius); Gizmos.color = Color.green; Gizmos.DrawWireSphere(c.center, c.radius + invScale.x * m_blendDistance * 2f); } else if (type == typeof(MeshCollider)) { MeshCollider c = (MeshCollider)m_colliderVolume; // Only convex mesh collider are allowed if (!c.convex) c.convex = true; // Mesh pivot should be centered or this won't work Gizmos.color = m_gizmosColor1; Gizmos.DrawMesh(c.sharedMesh); Gizmos.color = Color.green; Gizmos.DrawWireMesh(c.sharedMesh, Vector3.zero, Quaternion.identity, Vector3.one + invScale * m_blendDistance * 4f); } } } #endif } }