Files
PrinceOfGlory/Assets/Scripts/XRCore/Scene/SceneMgr.cs
kridoo 6019406bc8 1
2025-11-19 23:51:17 +08:00

90 lines
3.1 KiB
C#

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;
using Unity.XR.PXR;
public class SceneMgr : MonoSingleton<SceneMgr>
{
private Coroutine _currentCoroutine; // 当前正在进行的场景切换协程
private ISceneDataProvider _sceneDataProvider; // 场景数据提供者
private string _sceneName;
public int nowSceneId = 0; //当前正式的场景(不包括中间过度场景)
public bool isCanMove = true;//是否可以用手柄走动
public bool isTrigger = false;
public bool handisactive = false;
/// <summary>
/// 初始化场景管理器
/// </summary>
/// <param name="sceneDataProvider">场景数据提供接口</param>
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;
}
}