230 lines
8.6 KiB
C#
230 lines
8.6 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;
|
|
|
|
//记录得分情况
|
|
ScoreBase scoreBase = FindFirstObjectByType<ScoreBase>();
|
|
UserExamStat.systemID = scoreBase.systemId;
|
|
UserExamStat.allSubScore.Clear();
|
|
if ( scoreBase != null )
|
|
{
|
|
foreach (var item in scoreBase.GetStepScore())
|
|
{
|
|
ReconnectSubScoreInfo sub = new ReconnectSubScoreInfo();
|
|
sub.index = item.Key;
|
|
sub.subProcessId = item.Value.subProcessId;
|
|
sub.currentScore = item.Value.currentScore;
|
|
sub.isDone = item.Value.isDone;
|
|
UserExamStat.allSubScore.Add( sub );
|
|
};
|
|
}
|
|
/*UserExamStat.processId = ProcessManager.Instance.processId;
|
|
UserExamStat.subProcessId = ProcessManager.Instance.subProcessId;
|
|
UserExamStat.subProcessStepId = ProcessManager.Instance.subProcessStepId;*/
|
|
|
|
//记录装备材料信息
|
|
UserExamStat.allToolAndMaterial.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);
|
|
}
|
|
|
|
}
|
|
|
|
//记录已穿戴设备
|
|
UserExamStat.allWear.Clear();
|
|
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);
|
|
ReconnectItemInfo rec = new ReconnectItemInfo();
|
|
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);
|
|
}
|
|
|
|
//获取场景内(现场)所有可以出发的装置
|
|
UserExamStat.currentSceneTriggers.Clear();
|
|
PermanentTriggerBase[] allPermanentTriggers = FindObjectsOfType<PermanentTriggerBase>();
|
|
foreach (PermanentTriggerBase item in allPermanentTriggers)
|
|
{
|
|
ReconnectTriggerInfo ret = new ReconnectTriggerInfo();
|
|
ret.triggerName = item.triggerName;
|
|
ret.triggerID = item.triggerID;
|
|
ret.selfPosInScene = item.transform.localPosition;
|
|
ret.selfRotInScene = item.transform.localEulerAngles;
|
|
UserExamStat.currentSceneTriggers.Add(ret);
|
|
}
|
|
|
|
//转换为JSON
|
|
string UserJson = JsonConvert.SerializeObject(UserExamStat, Formatting.Indented);
|
|
Debug.Log("自动保存成功");
|
|
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, () => {
|
|
//右侧工具栏切换
|
|
GameManager.EventMgr.EventTrigger(Enum_EventType.SwitchScene, GameManager.RunModelMgr.SceneType);
|
|
//恢复场景中各项装备
|
|
BaseToolOrDevice[] allThings = FindObjectsOfType<BaseToolOrDevice>();
|
|
foreach (BaseToolOrDevice item in allThings)
|
|
{
|
|
item.gameObject.SetActive(false);//先全部隐藏
|
|
foreach (ReconnectItemInfo 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);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//恢复背包中的装备
|
|
List<ItemInfo> itemInPack = ToolAndmaterialMgr.Instance.CreateItemInfoByName(UserExamStat.allToolAndMaterial);
|
|
foreach (ItemInfo item in itemInPack)
|
|
{
|
|
PacksackBagMgr.Instance.AddOneToolOrMater(item);
|
|
}
|
|
|
|
//恢复已穿戴的装备
|
|
List<ItemInfo> itemWear = ToolAndmaterialMgr.Instance.CreateItemInfoByName(UserExamStat.allWear);
|
|
foreach (ItemInfo item in itemWear)
|
|
{
|
|
PacksackBagMgr.Instance.WearItemState(item, true);
|
|
}
|
|
|
|
//恢复场景内各个触发器状态
|
|
PermanentTriggerBase[] allPermanentTriggers = FindObjectsOfType<PermanentTriggerBase>();
|
|
List<ReconnectTriggerInfo> allReconTrigs = UserExamStat.currentSceneTriggers;
|
|
foreach (PermanentTriggerBase item in allPermanentTriggers)
|
|
{
|
|
item.gameObject.SetActive(false);
|
|
foreach (ReconnectTriggerInfo ret in allReconTrigs)
|
|
{
|
|
if (item.triggerName == ret.triggerName)
|
|
{
|
|
item.gameObject.SetActive(true);
|
|
item.transform.localPosition = ret.selfPosInScene;
|
|
item.transform.localEulerAngles = ret.selfRotInScene;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
// Update is called once per frame
|
|
void Update()
|
|
{
|
|
if (Input.GetKeyDown(KeyCode.T))//测试用,按T读取状态保存
|
|
{
|
|
RealtimeStatWriter();
|
|
Debug.Log("当前场景:" + UserExamStat.sceneName);
|
|
}
|
|
else if(Input.GetKeyDown(KeyCode.Y))
|
|
{
|
|
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);*/
|
|
}
|
|
}
|
|
}
|