using System.Collections; using NUnit.Framework.Constraints; using UnityEngine; public class DayNightCycle : MonoBehaviour { public SpriteRenderer daySky, eveningSky, nightSky; public SpriteRenderer dayBackClouds, eveningBackClouds, nightBackClouds; public SpriteRenderer dayFrontClouds, eveningFrontClouds, nightFrontClouds; public float transitionDuration = 5f; // Duration of transition public float cycleDuration = 60f; // Time before transitioning to next phase private void Start() { // Set initial alpha (only day visible) SetAlpha(daySky, 1); SetAlpha(eveningSky, 0); SetAlpha(nightSky, 0); SetAlpha(dayBackClouds, 1); SetAlpha(eveningBackClouds, 0); SetAlpha(nightBackClouds, 0); SetAlpha(dayFrontClouds, 1); SetAlpha(eveningFrontClouds, 0); SetAlpha(nightFrontClouds, 0); // Start the cycle StartCoroutine(DayNightCycleRoutine()); } private IEnumerator DayNightCycleRoutine() { while (true) { yield return new WaitForSeconds(cycleDuration); yield return StartCoroutine(FadeTransition( new SpriteRenderer[] { daySky, dayBackClouds, dayFrontClouds }, new SpriteRenderer[] { eveningSky, eveningBackClouds, eveningFrontClouds }, transitionDuration)); yield return new WaitForSeconds(cycleDuration); yield return StartCoroutine(FadeTransition( new SpriteRenderer[] { eveningSky, eveningBackClouds, eveningFrontClouds }, new SpriteRenderer[] { nightSky, nightBackClouds, nightFrontClouds }, transitionDuration)); yield return new WaitForSeconds(cycleDuration); yield return StartCoroutine(FadeTransition( new SpriteRenderer[] { nightSky, nightBackClouds, nightFrontClouds }, new SpriteRenderer[] { daySky, dayBackClouds, dayFrontClouds }, transitionDuration)); } } private IEnumerator FadeTransition(SpriteRenderer[] from, SpriteRenderer[] to, float duration) { float elapsedTime = 0; while (elapsedTime < duration) { elapsedTime += Time.deltaTime; float alpha = elapsedTime / duration; // Apply fading to all elements simultaneously for (int i = 0; i < from.Length; i++) { SetAlpha(from[i], 1 - alpha); SetAlpha(to[i], alpha); } yield return null; } // Ensure final alpha values are set correctly for (int i = 0; i < from.Length; i++) { SetAlpha(from[i], 0); SetAlpha(to[i], 1); } } private void SetAlpha(SpriteRenderer sprite, float alpha) { if (sprite) { Color color = sprite.color; color.a = alpha; sprite.color = color; foreach (Transform child in sprite.transform) { if (child.TryGetComponent(out SpriteRenderer childSprite)) { childSprite.color = color; } } } } }