YanCheng_Metrology/Assets/Scripts/Project/Manager/ReconnectMgr.cs

170 lines
5.8 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.IO;
using LitJson;
using System;
/// <summary>
/// 断线重连管理
/// </summary>
public class ReconnectMgr : SingletonMono<ReconnectMgr>
{
[HideInInspector]
public float recordDuration = -1;
private float recordCountdown = -1;
private TB_UserExamStat UserExamStat = new TB_UserExamStat();
private string localStatPath = "";
private string localStatFileName = "realtimeStat.json";
/// <summary>
/// 初始化函数,记录时间间隔
/// </summary>
public void Init( )
{
localStatPath = Application.streamingAssetsPath + "/" + localStatFileName;
//if (File.Exists( localStatPath ))//启动后检查有没有之前的遗留
//{
// File.Delete( localStatPath );
//}
}
ReconnectMgr()//构造函数
{
Init( );
}
/// <summary>
/// 记录用户状态
/// </summary>
public void RealtimeStatWriter()
{
//记录步骤相关各项信息
/*UserExamStat.schemeID = ProcessManager.Instance.schemeID;
UserExamStat.processId = ProcessManager.Instance.processId;
UserExamStat.subProcessId = ProcessManager.Instance.subProcessId;
UserExamStat.subProcessStepId = ProcessManager.Instance.subProcessStepId;*/
//记录装备材料信息
UserExamStat.allToolAndMaterial.Clear();
UserExamStat.allWear.Clear();
Dictionary<string, List<ItemInfo>> toolAndMaterialDic = PacksackBagMgr.Instance.GetCurrentBagData();
foreach (var item in toolAndMaterialDic)
{
foreach (var itemInfo in item.Value)
{
UserExamStat.allToolAndMaterial.Add(((ItemInfo)itemInfo).toolName);
}
}
Dictionary<string, ItemInfo> wearDic = PacksackBagMgr.Instance.wearDic;
foreach (var item in wearDic)
{
UserExamStat.allWear.Add(((ItemInfo)item.Value).toolName);
}
//获取当前所加载场景的名字
UserExamStat.sceneName = UnityEngine.SceneManagement.SceneManager.GetActiveScene().name;
//获取场景内所有可以出发的物品
UserExamStat.currentSceneTools.Clear();
BaseToolOrDevice[] allThings = FindObjectsOfType<BaseToolOrDevice>();
foreach (BaseToolOrDevice item in allThings)
{
Debug.Log(item.itemInfo.toolName);
ReconnetItemInfo rec = new ReconnetItemInfo();
rec.toolId = item.itemInfo.toolId;
rec.toolName = item.itemInfo.toolName;
rec.triggerID = item.itemInfo.triggerID;
//rec.toolOrDeviceOrMaterial = item.itemInfo.toolOrDeviceOrMaterial;
rec.selfPosInToolRoom = item.itemInfo.selfPosInToolRoom;
UserExamStat.currentSceneTools.Add(rec);
}
//转换为JSON
string UserJson = JsonConvert.SerializeObject(UserExamStat, Formatting.Indented);
Debug.Log("用户当前状态" + UserJson);
File.WriteAllText(localStatPath, UserJson);
}
/// <summary>
/// 读取用户状态(先使用同步,后用异步)
/// </summary>
public bool RealtimeStatReader()
{
if (File.Exists(localStatPath))
{
try
{
StreamReader sr = new StreamReader(localStatPath);
string user_last_stat = sr.ReadToEnd();
sr.Close();
UserExamStat = JsonMapper.ToObject<TB_UserExamStat>(user_last_stat);
return true;
}
catch (System.Exception e)
{
Debug.LogError(e.ToString());
return false;
}
}
else {
return false;
}
}
/// <summary>
/// 恢复现场
/// </summary>
public void RecoverScene()
{
ScenesManager.Instance.LoadSceneAsyn(UserExamStat.sceneName, () => {
BaseToolOrDevice[] allThings = FindObjectsOfType<BaseToolOrDevice>();
foreach (BaseToolOrDevice item in allThings)
{
item.gameObject.SetActive(false);
foreach (ReconnetItemInfo rec in UserExamStat.currentSceneTools)
{
if (item.itemInfo.toolName.Equals(rec.toolName) && item.itemInfo.toolId == rec.toolId)
{
if (item.itemInfo.selfPosInToolRoom.Equals(rec.selfPosInToolRoom))
{
item.gameObject.SetActive(true);
}
}
}
}
});
}
// Start is called before the first frame update
//void Start()
//{
//}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.S))//测试用,按S读取状态保存
{
RealtimeStatWriter();
//Dictionary<string, List<ItemInfo>> tmpDic = PacksackBagMgr.Instance.GetCurrentBagData();
Debug.Log("当前场景:" + UserExamStat.sceneName);
}
else if(Input.GetKeyDown(KeyCode.R))
{
RealtimeStatReader();
RecoverScene();
/*ProcessManager.Instance.HandoverProcess(UserExamStat.processId, UserExamStat.subProcessId, UserExamStat.subProcessStepId);
StepStateControl.instance.InvokeInitStepState(GameManager.Instance.systemId, GameManager.ProcessMgr.d_Scheme.id, UserExamStat.subProcessId);
GameManager.EventMgr.EventTrigger<int>(Enum_EventType.SwitchSubProcess, UserExamStat.subProcessId);
GameManager.EventMgr.EventTrigger<string>(Enum_EventType.SwitchSubProcessStepTriggerID, ProcessManager.Instance.subProcessStepTriggerID);*/
}
}
}