Files
PrinceOfGlory/Assets/Scripts/XRCore/Scene/SceneFadeMgr.cs
kridoo 6e91a0c7f0 111
2025-09-15 17:32:08 +08:00

97 lines
3.0 KiB
C#

using System;
using System.Collections;
using BigSpace.XRCore.Base;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace BigSpace.XRCore.Scene
{
public class SceneFadeMgr : MonoSingleton<SceneFadeMgr>
{
public float fadeInTime = 1.5f; // 淡入时间
public float fadeOutTime = 1.5f; // 淡出时间
public Color fadeColor = Color.black; // 淡入淡出的颜色
private Canvas canvas;
private CanvasGroup canvasGroup;
private Action fadeCompleteCallback;
// 引用 SceneChangeAni 实例
private SceneChangeAni sceneChangeAni;
protected override void Awake()
{
base.Awake();
sceneChangeAni = FindObjectOfType<SceneChangeAni>(); // 查找场景中的 SceneChangeAni 组件
//InitializeCanvas();
}
private void InitializeCanvas()
{
canvas = new GameObject("FadeCanvas").AddComponent<Canvas>();
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
DontDestroyOnLoad(canvas.gameObject);
canvasGroup = canvas.gameObject.AddComponent<CanvasGroup>();
canvasGroup.alpha = 0; // 初始透明
canvasGroup.blocksRaycasts = true;
var image = canvas.gameObject.AddComponent<UnityEngine.UI.Image>();
image.color = fadeColor;
}
public IEnumerator FadeOut(Action onComplete)
{
fadeCompleteCallback = onComplete;
if (sceneChangeAni != null)
{
// 调用 SceneChangeAni 的 FadeOut 方法
sceneChangeAni.showFadeAni(false, onComplete);
}
yield return null;
//yield return StartCoroutine(Fade(0, 1, fadeOutTime));
}
public IEnumerator FadeIn(Action onComplete = null)
{
fadeCompleteCallback = onComplete;
if (sceneChangeAni != null)
{
// 调用 SceneChangeAni 的 FadeIn 方法
sceneChangeAni.showFadeAni(true, onComplete);
}
yield return null;
//yield return StartCoroutine(Fade(1, 0, fadeInTime));
}
private IEnumerator Fade(float startAlpha, float endAlpha, float duration)
{
float time = 0;
while (time < duration)
{
time += Time.deltaTime;
canvasGroup.alpha = Mathf.Lerp(startAlpha, endAlpha, time / duration);
yield return null;
}
canvasGroup.alpha = endAlpha;
fadeCompleteCallback?.Invoke();
fadeCompleteCallback = null;
}
public void LoadSceneWithFade(string sceneName)
{
FadeOut(() =>
{
SceneManager.LoadSceneAsync(sceneName).completed += (operation) =>
{
FadeIn();
};
});
}
}
}