using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; /// /// 用于管理场景跳转的单例 /// public class TransitionManager : Singleton { public CanvasGroup fadeCanvasGroup; public float fadeDuration=0.3f; private bool isFade; public void Transition(string from, string to) { if (!isFade) StartCoroutine(TransitionToScene(from, to)); } private IEnumerator TransitionToScene(string from, string to) { yield return Fade(1); //等待场景卸载完成后继续 yield return SceneManager.UnloadSceneAsync(from); //等待场景加载完成后继续 yield return SceneManager.LoadSceneAsync(to, LoadSceneMode.Additive); //设置新场景为激活场景 Scene newScene = SceneManager.GetSceneByName(to); SceneManager.SetActiveScene(newScene); yield return Fade(0); } private IEnumerator Fade(float targetAlpha) { //where are you now! isFade = true; fadeCanvasGroup.blocksRaycasts = true; float speed = Mathf.Abs(fadeCanvasGroup.alpha - targetAlpha) / fadeDuration; while (!Mathf.Approximately(fadeCanvasGroup.alpha, targetAlpha)) { fadeCanvasGroup.alpha = Mathf.MoveTowards(fadeCanvasGroup.alpha, targetAlpha, speed * Time.deltaTime); yield return null; } fadeCanvasGroup.blocksRaycasts = false; isFade = false; } }