Files

98 lines
3.0 KiB
C#

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<Image>();
// 设置起始状态
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<Image>().DOKill();
canvasGroup.alpha = 0;
originAnimator.GetComponent<Image>().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}");
}
}
}
}