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(); _rawImage = _fillRect.rectTransform.Find("RawImage").GetComponent(); 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; } }