/******************************************************************** 文件: SceneManager.cs 作者:梦语 邮箱:1982614048@qq.com 日期:2024/02/19 14:26:48 功能:场景管理 *********************************************************************/ using DG.Tweening; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.SceneManagement; using UnityTimer; namespace Ether { public class SceneSystemManager : SingletonAutoMono { private Dictionary allSceneAudio; private void PlaySceneAudio(string sceneName) { if (allSceneAudio == null) { allSceneAudio = new Dictionary(); if (FileTools.ReadFileForJson(PathTools.SceneAudioCfg, out List list)) { foreach (var data in list) { if (!allSceneAudio.ContainsKey(data.sceneName)) { allSceneAudio.Add(data.sceneName, data); } } } } if (AudioManager.Inst.IsPlayingBgAudio()) { DOTween.To(() => AudioManager.Inst.BackGroundVolume, (x) => { AudioManager.Inst.BackGroundVolume = x; }, 0, 1).OnComplete(() => { AudioManager.Inst.StopBgAudio(); if (allSceneAudio.TryGetValue(sceneName, out SceneSoundData soundData)) { if (soundData.soundDataList.Count > 0) { int playIndex = UnityEngine.Random.Range(0, soundData.soundDataList.Count - 1); SoundData playData = soundData.soundDataList[playIndex]; AudioManager.Inst.BackGroundVolume = playData.volum; AudioManager.Inst.PlayBgAudio(playData.name); } } }); } else { if (allSceneAudio.TryGetValue(sceneName, out SceneSoundData soundData)) { if (soundData.soundDataList.Count > 0) { int playIndex = UnityEngine.Random.Range(0, soundData.soundDataList.Count - 1); SoundData playData = soundData.soundDataList[playIndex]; AudioManager.Inst.BackGroundVolume = playData.volum; AudioManager.Inst.PlayBgAudio(playData.name); } } } } #region 同步加载场景 public void LoadScene(string sceneName, LoadSceneMode mode = LoadSceneMode.Single) { if (SceneManager.GetActiveScene().name == sceneName) { return; } PlaySceneAudio(sceneName); SceneManager.LoadScene(sceneName, mode); } public void LoadScene(int sceneBuildIndex, LoadSceneMode mode = LoadSceneMode.Single) { if (SceneManager.GetActiveScene().buildIndex == sceneBuildIndex) { return; } SceneManager.LoadScene(sceneBuildIndex, mode); } public Scene LoadScene(string sceneName, LoadSceneParameters loadSceneParameters) { if (SceneManager.GetActiveScene().name == sceneName) { return default; } PlaySceneAudio(sceneName); return SceneManager.LoadScene(sceneName, loadSceneParameters); } public Scene LoadScene(int sceneBuildIndex, LoadSceneParameters loadSceneParameters) { if (SceneManager.GetActiveScene().buildIndex == sceneBuildIndex) { return default; } return SceneManager.LoadScene(sceneBuildIndex, loadSceneParameters); } #endregion #region 异步加载场景 public void LoadSceneAsync(string sceneName, Action callBack = null, LoadSceneMode mode = LoadSceneMode.Single) { if (SceneManager.GetActiveScene().name == sceneName) { return; } MonoManager.Inst.StartCoroutine(DoLoadSceneAsync(sceneName, callBack, mode)); } public void LoadSceneAsync(int sceneIndex, Action callBack = null, LoadSceneMode mode = LoadSceneMode.Single) { if (SceneManager.GetActiveScene().buildIndex == sceneIndex) { return; } MonoManager.Inst.StartCoroutine(DoLoadSceneAsync(sceneIndex, callBack, mode)); } private IEnumerator DoLoadSceneAsync(int sceneIndex, Action loadingCallBack = null, LoadSceneMode mode = LoadSceneMode.Single) { AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(sceneIndex, mode); // 等待直到场景加载完成 while (!asyncLoad.isDone) { // 可以在这里添加加载进度条的更新逻辑 float progress = asyncLoad.progress; // 更新UI进度条 loadingCallBack?.Invoke(progress); // 等待下一帧 yield return null; } loadingCallBack?.Invoke(1); // 场景加载完成,自动跳转到新场景 SceneManager.SetActiveScene(SceneManager.GetSceneAt(sceneIndex)); EventCenter.BroadCast("LoadSceneSuccess"); } private IEnumerator DoLoadSceneAsync(string sceneName, Action loadingCallBack = null, LoadSceneMode mode = LoadSceneMode.Single) { AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(sceneName, mode); // 等待直到场景加载完成 while (!asyncLoad.isDone) { // 可以在这里添加加载进度条的更新逻辑 float progress = asyncLoad.progress; // 更新UI进度条 loadingCallBack?.Invoke(progress); // 等待下一帧 yield return null; } loadingCallBack?.Invoke(1); // 场景加载完成,自动跳转到新场景 SceneManager.SetActiveScene(SceneManager.GetSceneByName(sceneName)); PlaySceneAudio(sceneName); EventCenter.BroadCast("LoadSceneSuccess"); } #endregion } }