Files
beyond/Assets/Scripts/Cutscene/FadeCanvasGroup.cs
2024-11-20 15:21:28 +01:00

294 lines
7.7 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using PixelCrushers;
using Sirenix.OdinInspector;
using UnityEngine;
//using UnityEngine.UI;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
namespace Beyond
{
[RequireComponent(typeof(CanvasGroup))]
public class FadeCanvasGroup : Saver
{
private static FadeCanvasGroup _instance;
public UnityEvent OnLoadingFadeOutEnd;
public UnityEvent OnFadeInEnd;
public UnityEvent OnFadeOutEnd;
private bool isFadingBeforLoading;
public static FadeCanvasGroup Instance
{
get
{
//CreateInstance();
return _instance;
}
}
public CanvasGroup canvasGroup;
private AnimationCurve curve;
private float fadeTime = 1f;
private float time;
private float fadeDelay = .2f;
public enum State
{ IDLE, FADE_IN, FADE_OUT_IN, FADE_DELAY, FADE_OUT };
private State state = State.IDLE;
private Coroutine m_delayedFade;
public static void CreateInstance()
{
if (_instance == null)
{
_ = Instantiate(Resources.Load("CANVAS OVERLAY", typeof(GameObject))) as GameObject;
}
}
private void Awake()
{
if (_instance == null)
{
_instance = this;
/*
if (gameObject.transform.parent)
{
DontDestroyOnLoad(gameObject.transform.parent.gameObject);
}
else
{
DontDestroyOnLoad(gameObject);
}
*/
}
else if (_instance != this)
{
Debug.LogError("Multiple Fade canvases!, Destroying...");
Destroy(this);
}
var canvas = GetComponent<Canvas>();
if (canvas)
{
canvas.sortingOrder = 1000;
}
canvasGroup = GetComponent<CanvasGroup>();
canvasGroup.alpha = 1f;
canvasGroup.interactable = false;
canvasGroup.blocksRaycasts = false;
//BeforeLoadingFade();
}
private void OnEnable()
{
SceneManager.sceneLoaded += OnSceneLoaded;
}
private void OnSceneLoaded(Scene arg0, LoadSceneMode arg1)
{
//fadeTime = 2f;
//SetState(State.FADE_IN);
DelayedFadeIn(2f, 2f);
}
public void BeforeLoadingFade()
{
fadeTime = 1f;
isFadingBeforLoading = true;
SetState(State.FADE_OUT);
}
private void OnDisable()
{
SceneManager.sceneLoaded -= OnSceneLoaded;
}
public override string RecordData()
{
return "";
}
public override void ApplyData(string s)
{
//FadeIn(1f);
}
public void DelayedFadeIn(float time, float delay)
{
m_delayedFade = StartCoroutine(DelayedFade(State.FADE_IN, time, delay));
}
private IEnumerator DelayedFade(State s, float time, float delay)
{
yield return new WaitForSecondsRealtime(delay);
fadeTime = time;
SetState(s);
}
public void SetState(State s)
{
if (m_delayedFade != null)
{
//return;
StopCoroutine(m_delayedFade);
m_delayedFade = null;
}
switch (s)
{
case State.IDLE:
if (isFadingBeforLoading)
{
isFadingBeforLoading = false;
OnLoadingFadeOutEnd?.Invoke();
}
break;
case State.FADE_IN:
if (state == State.FADE_DELAY || state == State.FADE_OUT_IN)
{
DelayedFadeIn(fadeTime, fadeDelay);
canvasGroup.alpha = 1f;
state = State.IDLE;
time = 0f;
return;
}
break;
case State.FADE_OUT:
break;
case State.FADE_OUT_IN:
break;
}
state = s;
time = 0f;
}
public void Update()
{
float a = 0f;
switch (state)
{
case State.IDLE:
break;
case State.FADE_IN:
if (time > fadeTime)
{
a = 0;
SetState(State.IDLE);
OnFadeInEnd?.Invoke();
}
else
{
a = 1f - time / fadeTime;
}
canvasGroup.alpha = a;
break;
case State.FADE_OUT:
if (time > fadeTime)
{
a = 1f;
SetState(State.IDLE);
OnFadeOutEnd?.Invoke();
}
else
{
a = time / fadeTime;
}
canvasGroup.alpha = a;
break;
case State.FADE_OUT_IN:
/*
if (time > fadeTime)
{
a = 0f;
SetState(State.IDLE);
}
else
{
float t = time / fadeTime;
if (t < 0.5)
{
a = t * 2f;
}
else
{
a = 2f - 2f*t;
}
}
*/
if (time > fadeTime)
{
a = 1f;
SetState(State.FADE_DELAY);
OnFadeOutEnd?.Invoke();
}
else
{
a = time / fadeTime;
}
canvasGroup.alpha = a;
break;
case State.FADE_DELAY:
if (time > fadeDelay)
{
SetState(State.FADE_IN);
}
break;
}
time += Time.deltaTime;
}
[Button]
public void FadeIn(float fadeTime)
{
this.fadeTime = fadeTime;
SetState(State.FADE_IN);
}
[Button]
public void FadeOut(float fadeTime)
{
this.fadeTime = fadeTime;
SetState(State.FADE_OUT);
}
public void FadeButtonClick()
{
Debug.Log("FadeButton click");
}
/*
private void OnValidate()
{
var canvas = GetComponent<Canvas>();
if (canvas)
{
canvas.sortingOrder = 1000;
}
canvasGroup = GetComponent<CanvasGroup>();
canvasGroup.alpha = 0f;
canvasGroup.interactable = false;
canvasGroup.blocksRaycasts = false;
}
*/
[Button]
public void FadeOutIn(float t)
{
fadeTime = t;
SetState(State.FADE_OUT_IN);
}
}
}