Files
PrinceOfGlory/Assets/Scripts/XRCore/RunningScene/RunningSceneMgr.cs
kridoo 6e91a0c7f0 111
2025-09-15 17:32:08 +08:00

176 lines
5.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections;
using UnityEngine;
using BigSpace.XRCore.Base;
using BigSpace.XRCore.Config;
using UnityEngine.SceneManagement;
using BigSpace.XRCore.Timeline;
using BigSpace.XRCore.Video;
using BigSpace.XRCore.Scene;
using BigSpace.XRCore.GameMode;
using BigSpace.XRCore.Event;
using BigSpace.Logic;
namespace BigSpace.XRCore.RunningScene
{
public class RunningSceneData
{
public int id;
public float time;
}
/// <summary>
/// 场景加载之后 负责场景的恢复timeline video的恢复 已经上传当前运行场景的信息
/// </summary>
public class RunningSceneMgr : MonoSingleton<RunningSceneMgr>
{
public readonly int WaitingSceneId = 99999; //组队房间
//public readonly int LoadingSceneId = 10000;
public RunningSceneData _runningSceneData = new RunningSceneData();
public TimeLineControll timelineCtr { get; set; }
public VideoPlayControll videoCtr { get; set; }
//有断线数据计时,要晚一点上传数据,加载场景和恢复场景数据需要时间
//public Progress RecoverData = null; //断线数据
public bool isOfflineReconnected = false; //是不是断线重连
private float elapsed = 0;
private bool isPause = true;
private float timerInterval = 6; //等待几秒后开启心跳并开始上传数据目的是等timeline和video加载好
private void Start()
{
SceneManager.sceneLoaded += OnSceneLoaded;
Application.quitting += OnApplicationQuit;
}
private void Update()
{
if (isPause) return;
elapsed += Time.deltaTime;
if (elapsed >= timerInterval)
{
isPause = true;
elapsed = 0;
//RecoverData = null;
isOfflineReconnected = false; //不能过早的清除,掉线后进来,检测地图时要用到
}
}
private void OnSceneLoaded(UnityEngine.SceneManagement.Scene arg0, LoadSceneMode arg1)
{
var scene = SceneManager.GetActiveScene();
InitSceneInfo(scene);
if (scene.name == "Loading") return;//断线进来有可能是这个场景名,不能弹出去 return; //||
//Debug.Log("加载完场景名:"+ scene.name);
StartCoroutine(HandleRunningScene(scene));
}
private void InitSceneInfo(UnityEngine.SceneManagement.Scene scene)
{
var sceneConfigs = ConfigMgr.Instance.GetConfigList<SceneDataConfig>();
SceneDataConfig currentSceneConfig = null;
foreach (var sc in sceneConfigs)
{
if (sc.SceneName == scene.name)
{
currentSceneConfig = sc;
break;
}
}
if (currentSceneConfig != null)
{
_runningSceneData.id = currentSceneConfig.id;
}
}
private IEnumerator HandleRunningScene(UnityEngine.SceneManagement.Scene scene)
{
yield return null;
//等待视频预加载完成
if (videoCtr != null)
{
yield return StartCoroutine(videoCtr.IsAllPrepared());
//yield return new WaitForSeconds(1f);//防止场景白一下
}
if (isOfflineReconnected)
{
RecoveryRunScene(); // 断线重连逻辑
}
else
{
StartCoroutine(DelayRunScene(GameModeMgr.Instance.IsOffline ? 0.1f : 1f)); //正常运行逻辑
}
//Debug.Log("变亮淡入===========================" + scene.name);
//ChangSceneSphereMgr.Instance.ShowChangeSecne(false); //旧UI相关
//yield return new WaitForSeconds(GameDataManage.Instance.inFadeTime); //旧UI相关
StartCoroutine(DelaySetIsCanMove(scene.name));
}
private IEnumerator DelayRunScene(float delay)
{
yield return new WaitForSeconds(delay);
NormalRunScene();
}
private IEnumerator DelaySetIsCanMove(string sceneName)
{
yield return new WaitForSeconds(1);
if (sceneName != "Waiting" && sceneName != "Loading")
{
GlobalEventMgr.Dispatch(GameEvent.EventSetHandMove, 2);
}
}
/// <summary>
/// 正常进入时,走正常进入场景的逻辑
/// </summary>
public void NormalRunScene()
{
if (timelineCtr != null) timelineCtr.NormalPlay();
if (videoCtr != null) videoCtr.NormalPlay();
}
/// <summary>
/// 断线重连或者重新进入时做恢复场景的逻辑因为要跳转到指定的场景timeline指定的位置video指定的位置
/// </summary>
public void RecoveryRunScene()
{
if (timelineCtr != null)
{
//timelineCtr.RecoveryPlay(RecoverData.Timeline);
Debug.Log("timelineCtr不为空..........................");
}
else
{
Debug.Log("timelineCtr是空..........................");
}
if (videoCtr != null)
{
//videoCtr.RecoveryPlay(RecoverData.Video);
Debug.Log("videoCtr不为空..........................");
}
else
{
Debug.Log("videoCtr是空..........................");
}
isPause = false; //计时等待清除离线数据
Debug.Log("离线数据恢复后心跳启动..........................");
//WebSocketAgent.Ins.SendHeartBeat(); //开启心跳
}
void OnApplicationQuit()
{
//if(RoomNetwork.Ins!=null)
// RoomNetwork.Ins.ExitApp();
}
}
}