92 lines
2.8 KiB
C#
92 lines
2.8 KiB
C#
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;
|
|
}
|
|
} |