using UnityEngine; using System.Collections; using DG.Tweening; using UnityEngine.UI; namespace AibisDream.UI { public class TimeTurner : MonoBehaviour { [Header("索引")] [SerializeField] private Animator targetAnimator; [SerializeField] private Animator originAnimator; [SerializeField] private CanvasGroup canvasGroup; [Header("参数")] [SerializeField] private float fadeTime = 2f; [SerializeField] private float holdTime = 1f; [SerializeField] private float inoutTime = 0.5f; private int _runVersion; public void ForceStop() { _runVersion++; ResetVisuals(); } public IEnumerator TurnTimeTo(string originState, string targetState) { var version = ++_runVersion; var originImage = originAnimator.GetComponent(); // 设置起始状态 targetAnimator.gameObject.SetActive(true); originAnimator.gameObject.SetActive(true); float originParam = StateToParam(originState); float targetParam = StateToParam(targetState); targetAnimator.SetFloat("TimeState", targetParam); originAnimator.SetFloat("TimeState", originParam); canvasGroup.alpha = 0; originImage.color = Color.white; // 淡入 yield return canvasGroup.DOFade(1, inoutTime).WaitForCompletion(); if (version != _runVersion) yield break; // 等待静止时间 yield return new WaitForSeconds(holdTime); if (version != _runVersion) yield break; // 淡出起始状态 yield return originImage.DOFade(0, fadeTime).WaitForCompletion(); if (version != _runVersion) yield break; // 等待静止时间 yield return new WaitForSeconds(holdTime); if (version != _runVersion) yield break; // 淡出 yield return canvasGroup.DOFade(0, inoutTime).WaitForCompletion(); if (version != _runVersion) yield break; ResetVisuals(); } private void ResetVisuals() { canvasGroup.DOKill(); originAnimator.GetComponent().DOKill(); canvasGroup.alpha = 0; originAnimator.GetComponent().color = Color.white; targetAnimator.gameObject.SetActive(false); originAnimator.gameObject.SetActive(false); } private float StateToParam(string stateName) { switch (stateName.ToLower()) { case "morning": return 0; case "day": return 0.33f; case "evening": return 0.66f; case "night": return 1; default: throw new System.Exception($"Invalid state name: {stateName}"); } } } }