176 lines
5.9 KiB
C#
176 lines
5.9 KiB
C#
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();
|
||
}
|
||
}
|
||
}
|
||
|