97 lines
3.0 KiB
C#
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();
|
|
};
|
|
});
|
|
}
|
|
}
|
|
}
|