Files
JJBB/Assets/Project/Script/GUI/Board/SceneSwitchScreen.cs

92 lines
2.8 KiB
C#
Raw Normal View History

2024-08-23 15:49:34 +08:00
using Games.Events;
using UnityEngine;
using UnityEngine.UI;
public class SceneSwitchScreen : MonoBehaviour
{
public static SceneSwitchScreen instance { get; private set; }
public float enterTime = 0.5f;
public float keepTime = 0.5f;
public float exitTime = 0.5f;
private float _startTime = -1f;
private bool _sendEvent;
private RectTransform _root;
private Graphic _fillRect;
private RawImage _rawImage;
private float _ratio = 2f;
private void Awake()
{
instance = this;
_root = (RectTransform) transform;
_fillRect = transform.Find("FillImage").GetComponent<Graphic>();
_rawImage = _fillRect.rectTransform.Find("RawImage").GetComponent<RawImage>();
EndAnimation();
}
private void Update()
{
if (_startTime > 0f)
{
var delta = Time.realtimeSinceStartup - _startTime;
if (delta > enterTime + keepTime + exitTime)
EndAnimation();
else if (delta > enterTime + keepTime)
SetRatio(1f + (delta - enterTime - keepTime) / exitTime);
else if (delta > enterTime)
SetRatio(1f);
else
SetRatio(delta / enterTime);
if (_sendEvent && delta > enterTime)
{
_sendEvent = false;
EventDispatcher.Instance.Dispatch(Games.Events.EventId.CameraSpaceBlurMax);
}
}
else
EndAnimation();
}
public float StartAnimation()
{
var rect = _root.rect;
enabled = true;
_fillRect.gameObject.SetActive(true);
_fillRect.rectTransform.sizeDelta = new Vector2(rect.width, rect.height);
var height = (float)_rawImage.texture.height / _rawImage.texture.width * _fillRect.rectTransform.sizeDelta.x;
_rawImage.rectTransform.sizeDelta = new Vector2(_fillRect.rectTransform.sizeDelta.x, height);
_startTime = Time.realtimeSinceStartup;
_sendEvent = true;
SetRatio(0f);
return enterTime + keepTime + exitTime;
}
public void EndAnimation()
{
enabled = false;
_startTime = -1f;
_sendEvent = false;
_fillRect.gameObject.SetActive(false);
}
public void SetRatio(float ratio)
{
if (_ratio != ratio)
{
_ratio = ratio;
var distance = (1f - Mathf.Max(1f, _ratio)) * _fillRect.rectTransform.sizeDelta.x;
var alpha = Mathf.Min(1f, _ratio);
_fillRect.rectTransform.anchoredPosition = new Vector2(distance, 0f);
_fillRect.color = new Color(0f, 0f, 0f, alpha);
_rawImage.color = new Color(1f, 1f, 1f, alpha);
}
}
private void OnDestroy()
{
if (instance == this)
instance = null;
}
}