using System.Collections; using UnityEngine; using AtmosphericHeightFog; // Upewnij się, że przestrzeń nazw odpowiada Twojemu projektowi [RequireComponent(typeof(Collider))] public class FogIntensityZone : MonoBehaviour { [Header("Tryb działania")] [Tooltip("Jeśli zaznaczone – zmieniana będzie tylko intensywność foga. W przeciwnym razie zmieniane są również kolory, ustawienia odległości i intensywność światła kierunkowego.")] public bool onlyChangeIntensity = true; [Header("Ustawienia dla trybu 'Tylko intensywność'")] [Tooltip("Docelowa intensywność foga, gdy zmieniamy tylko intensywność.")] public float targetIntensity = 0.5f; [Header("Ustawienia dla trybu 'Pełna zmiana'")] [Tooltip("Docelowa intensywność foga przy pełnej zmianie ustawień.")] public float manualTargetIntensity = 0.5f; [Tooltip("Docelowy kolor startowy foga przy pełnej zmianie.")] [ColorUsage(true, true)] public Color manualTargetFogColorStart = new Color(0.5f, 0.75f, 1f, 1f); [Tooltip("Docelowy kolor końcowy foga przy pełnej zmianie.")] [ColorUsage(true, true)] public Color manualTargetFogColorEnd = new Color(0.75f, 1f, 1.25f, 1f); [Tooltip("Docelowa wartość blendowania kolorów (0 - 1).")] [Range(0f, 1f)] public float manualTargetFogColorDuo = 0f; [Tooltip("Docelowa wartość odległości startowej foga.")] public float manualTargetFogDistanceStart = -50f; [Tooltip("Docelowa wartość odległości końcowej foga.")] public float manualTargetFogDistanceEnd = 150f; [Tooltip("Docelowa wartość spadku odległości foga.")] public float manualTargetFogDistanceFalloff = 2f; [Tooltip("Docelowa intensywność światła kierunkowego przy pełnej zmianie.")] public float manualTargetDirectionalIntensity = 0.5f; [Header("Pozostałe ustawienia")] [Tooltip("Czas (w sekundach) przejścia między wartościami.")] public float transitionDuration = 1f; [Tooltip("Tag obiektu gracza.")] public string playerTag = "Player"; // Referencja do globalnego skryptu foga private HeightFogGlobal fogGlobal; // Domyślne wartości pobrane przy starcie private float defaultIntensity; private Color defaultFogColorStart; private Color defaultFogColorEnd; private float defaultFogColorDuo; private float defaultFogDistanceStart; private float defaultFogDistanceEnd; private float defaultFogDistanceFalloff; private float defaultDirectionalIntensity; // Przechowywana aktywna korutyna, by móc ją przerwać private Coroutine transitionCoroutine; void Start() { fogGlobal = FindObjectOfType(); if (fogGlobal == null) { Debug.LogError("Nie znaleziono HeightFogGlobal w scenie!"); return; } // Zapamiętujemy domyślne wartości pobrane z globalnego skryptu foga defaultIntensity = fogGlobal.fogIntensity; defaultFogColorStart = fogGlobal.fogColorStart; defaultFogColorEnd = fogGlobal.fogColorEnd; defaultFogColorDuo = fogGlobal.fogColorDuo; defaultFogDistanceStart = fogGlobal.fogDistanceStart; defaultFogDistanceEnd = fogGlobal.fogDistanceEnd; defaultFogDistanceFalloff = fogGlobal.fogDistanceFalloff; defaultDirectionalIntensity = fogGlobal.directionalIntensity; } private void OnTriggerEnter(Collider other) { if (!other.CompareTag(playerTag)) return; if (transitionCoroutine != null) StopCoroutine(transitionCoroutine); if (onlyChangeIntensity) { // Tylko intensywność – pozostałe właściwości pozostają na domyślnych wartościach. transitionCoroutine = StartCoroutine(TransitionProperties( fogGlobal.fogIntensity, targetIntensity, defaultFogColorStart, defaultFogColorStart, defaultFogColorEnd, defaultFogColorEnd, defaultFogColorDuo, defaultFogColorDuo, defaultFogDistanceStart, defaultFogDistanceStart, defaultFogDistanceEnd, defaultFogDistanceEnd, defaultFogDistanceFalloff, defaultFogDistanceFalloff, defaultDirectionalIntensity, defaultDirectionalIntensity, transitionDuration)); } else { // Pełna zmiana – przejście do ustawień podanych ręcznie. transitionCoroutine = StartCoroutine(TransitionProperties( fogGlobal.fogIntensity, manualTargetIntensity, fogGlobal.fogColorStart, manualTargetFogColorStart, fogGlobal.fogColorEnd, manualTargetFogColorEnd, fogGlobal.fogColorDuo, manualTargetFogColorDuo, fogGlobal.fogDistanceStart, manualTargetFogDistanceStart, fogGlobal.fogDistanceEnd, manualTargetFogDistanceEnd, fogGlobal.fogDistanceFalloff, manualTargetFogDistanceFalloff, fogGlobal.directionalIntensity, manualTargetDirectionalIntensity, transitionDuration)); } } private void OnTriggerExit(Collider other) { if (!other.CompareTag(playerTag)) return; if (transitionCoroutine != null) StopCoroutine(transitionCoroutine); // Przy wyjściu wracamy do domyślnych ustawień. transitionCoroutine = StartCoroutine(TransitionProperties( fogGlobal.fogIntensity, defaultIntensity, fogGlobal.fogColorStart, defaultFogColorStart, fogGlobal.fogColorEnd, defaultFogColorEnd, fogGlobal.fogColorDuo, defaultFogColorDuo, fogGlobal.fogDistanceStart, defaultFogDistanceStart, fogGlobal.fogDistanceEnd, defaultFogDistanceEnd, fogGlobal.fogDistanceFalloff, defaultFogDistanceFalloff, fogGlobal.directionalIntensity, defaultDirectionalIntensity, transitionDuration)); } IEnumerator TransitionProperties( float startIntensity, float targetIntensity, Color startFogColorStart, Color targetFogColorStart, Color startFogColorEnd, Color targetFogColorEnd, float startFogColorDuo, float targetFogColorDuo, float startFogDistanceStart, float targetFogDistanceStart, float startFogDistanceEnd, float targetFogDistanceEnd, float startFogDistanceFalloff, float targetFogDistanceFalloff, float startDirectionalIntensity, float targetDirectionalIntensity, float duration) { float elapsed = 0f; while (elapsed < duration) { elapsed += Time.deltaTime; float t = elapsed / duration; // Interpolacja intensywności foga fogGlobal.fogIntensity = Mathf.Lerp(startIntensity, targetIntensity, t); // Jeśli tryb pełny, interpolujemy także kolory, ustawienia odległości i intensywność światła kierunkowego if (!onlyChangeIntensity) { fogGlobal.fogColorStart = Color.Lerp(startFogColorStart, targetFogColorStart, t); fogGlobal.fogColorEnd = Color.Lerp(startFogColorEnd, targetFogColorEnd, t); fogGlobal.fogColorDuo = Mathf.Lerp(startFogColorDuo, targetFogColorDuo, t); fogGlobal.fogDistanceStart = Mathf.Lerp(startFogDistanceStart, targetFogDistanceStart, t); fogGlobal.fogDistanceEnd = Mathf.Lerp(startFogDistanceEnd, targetFogDistanceEnd, t); fogGlobal.fogDistanceFalloff = Mathf.Lerp(startFogDistanceFalloff, targetFogDistanceFalloff, t); fogGlobal.directionalIntensity = Mathf.Lerp(startDirectionalIntensity, targetDirectionalIntensity, t); } yield return null; } // Ustawienie ostatecznych wartości fogGlobal.fogIntensity = targetIntensity; if (!onlyChangeIntensity) { fogGlobal.fogColorStart = targetFogColorStart; fogGlobal.fogColorEnd = targetFogColorEnd; fogGlobal.fogColorDuo = targetFogColorDuo; fogGlobal.fogDistanceStart = targetFogDistanceStart; fogGlobal.fogDistanceEnd = targetFogDistanceEnd; fogGlobal.fogDistanceFalloff = targetFogDistanceFalloff; fogGlobal.directionalIntensity = targetDirectionalIntensity; } transitionCoroutine = null; } }