DRHPS/code-csharp/en_US/UI_FADE.cs
2025-04-08 11:31:35 +08:00

121 lines
3.8 KiB
C#

using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class UI_FADE : MonoBehaviour
{
public Image FadeImage;
private static UI_FADE instance;
private Coroutine currentFadeCoroutine;
public bool isFading;
public static bool DarkworldMenu_PreviousState;
public static bool LightworldMenu_PreviousState;
public static UI_FADE Instance => instance;
private void Awake()
{
if (instance != null && instance != this)
{
Object.Destroy(base.gameObject);
}
else
{
instance = this;
}
}
private void Start()
{
FadeImage.color = new Color(0f, 0f, 0f, 1f);
SceneManager.sceneLoaded += OnSceneLoaded;
}
public void StartFadeIn(int GoToScene, float SpeedMultiplier, bool UnpauseOnEnd = false, NewMainMenuManager.MainMenuStates targetmenuState = NewMainMenuManager.MainMenuStates.None)
{
if (isFading)
{
StopCoroutine(currentFadeCoroutine);
}
DarkworldMenu_PreviousState = DarkworldMenu.Instance.CanOpenMenu;
LightworldMenu_PreviousState = LightworldMenu.Instance.CanOpenMenu;
DarkworldMenu.Instance.CanOpenMenu = false;
LightworldMenu.Instance.CanOpenMenu = false;
StopCoroutine(DelayRevertCMenus());
currentFadeCoroutine = StartCoroutine(FadeIn(GoToScene, SpeedMultiplier, targetmenuState, UnpauseOnEnd));
}
public void StartFadeOut(float SpeedMultiplier = 1f)
{
if (isFading)
{
StopCoroutine(currentFadeCoroutine);
}
currentFadeCoroutine = StartCoroutine(FadeOut(SpeedMultiplier));
}
private IEnumerator FadeIn(int GoToScene, float SpeedMultiplier, NewMainMenuManager.MainMenuStates targetmenuState, bool UnpauseOnEnd = false)
{
isFading = true;
ChatboxManager.Instance.EndText();
PlayerManager.Instance._PlayerState = PlayerManager.PlayerState.Cutscene;
while (FadeImage.color.a < 1f)
{
FadeImage.color = new Color(0f, 0f, 0f, FadeImage.color.a + 0.15f * SpeedMultiplier);
yield return new WaitForSecondsRealtime(0.01f);
}
yield return new WaitForSecondsRealtime(0.1f);
if (GoToScene > 0)
{
SceneManager.LoadScene(GoToScene);
}
ChatboxManager.Instance.EndText();
if (UnpauseOnEnd)
{
GonerMenu.Instance.UnpauseGame();
GonerMenu.Instance.ResetPlayer();
}
isFading = false;
if (targetmenuState != 0)
{
yield return null;
while (NewMainMenuManager.instance == null)
{
yield return null;
}
NewMainMenuManager.instance.SetMainMenuState(targetmenuState);
}
}
private IEnumerator FadeOut(float SpeedMultiplier = 1f)
{
isFading = true;
FadeImage.color = new Color(0f, 0f, 0f, 1f);
while (FadeImage.color.a > 0f)
{
FadeImage.color = new Color(0f, 0f, 0f, FadeImage.color.a - 0.15f * SpeedMultiplier);
yield return new WaitForSecondsRealtime(0.01f);
}
isFading = false;
}
private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
Debug.Log("Reverting CMenus to original states");
StartCoroutine(DelayRevertCMenus());
}
private IEnumerator DelayRevertCMenus()
{
yield return new WaitForSeconds(0.25f);
DarkworldMenu.Instance.CanOpenMenu = DarkworldMenu_PreviousState;
LightworldMenu.Instance.CanOpenMenu = LightworldMenu_PreviousState;
}
}