using System; using System.Collections; using BigSpace.XRCore.Base; using UnityEngine; using UnityEngine.SceneManagement; namespace BigSpace.XRCore.Scene { public class SceneFadeMgr : MonoSingleton { 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 组件 //InitializeCanvas(); } private void InitializeCanvas() { canvas = new GameObject("FadeCanvas").AddComponent(); canvas.renderMode = RenderMode.ScreenSpaceOverlay; DontDestroyOnLoad(canvas.gameObject); canvasGroup = canvas.gameObject.AddComponent(); canvasGroup.alpha = 0; // 初始透明 canvasGroup.blocksRaycasts = true; var image = canvas.gameObject.AddComponent(); 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(); }; }); } } }