using System.Collections; using UnityEngine; using BigSpace.XRCore.Base; using UnityEngine.SceneManagement; using BigSpace.XRCore.Scene; using System; using BigSpace.XRCore.Event; using BigSpace.Logic; public class SceneMgr : MonoSingleton { private Coroutine _currentCoroutine; // 当前正在进行的场景切换协程 private ISceneDataProvider _sceneDataProvider; // 场景数据提供者 private string _sceneName; public int nowSceneId = 0; //当前正式的场景(不包括中间过度场景) public bool isCanMove = true;//是否可以用手柄走动 public bool isTrigger = false; /// /// 初始化场景管理器 /// /// 场景数据提供接口 public void Initialize(ISceneDataProvider sceneDataProvider) { _sceneDataProvider = sceneDataProvider; } // Start is called before the first frame update void Start() { SceneManager.sceneLoaded += OnSceneLoaded; } private void OnSceneLoaded(Scene arg0, LoadSceneMode arg1) { if (_sceneName == arg0.name) { //Debug.Log("======================清了内存"); Resources.UnloadUnusedAssets(); GC.Collect(); } } public void LoadScene(int sceneId) { if (_currentCoroutine != null) { Debug.LogWarning("A scene transition is already in progress."); return; } // 获取场景数据 var loadingData = _sceneDataProvider.GetLoadingSceneData(sceneId); if (_sceneName != null && _sceneName == loadingData.SceneName) //同一个场景就不跳转 return; _sceneName = loadingData.SceneName; isTrigger = false; Debug.Log("开始跳转场景"+ _sceneName); GlobalEventMgr.Dispatch(GameEvent.EventSetHandMove, 1); _currentCoroutine = PersistenceCoroutineMgr.Instance.StartCoroutine(HandleSceneTransition(loadingData)); } public IEnumerator HandleSceneTransition(SceneData loadingData) { // 淡出 GlobalEventMgr.Dispatch(GameEvent.EventChangeScence); ChangSceneSphereMgr.Instance.ShowChangeSecne(true); yield return new WaitForSeconds(GameDataManage.Instance.outFadeTime); //Debug.Log("ok淡出===========================" + loadingData.id + "||" + loadingData.LoadingSceneName + "||" + loadingData.SceneName); if (!string.IsNullOrEmpty(loadingData.LoadingSceneName)) { yield return SceneManager.LoadSceneAsync(loadingData.LoadingSceneName); //旧UI相关 //if (loadingData.SceneName != "Waiting" && loadingData.SceneName != "Scene_07") //关于等待出场景文字 //{ // //Debug.Log("跳谁:" + loadingData.id + "||" + loadingData.SceneName); // GlobalEventMgr.Dispatch(GameEvent.EventShowUI, loadingData.id % 10000); // yield return new WaitForSeconds(4f); //} } //Debug.Log("开始跳目标场景.................."+ loadingData.SceneName); yield return SceneManager.LoadSceneAsync(loadingData.SceneName); _currentCoroutine = null; } }