using System.Collections; using System.Collections.Generic; using UnityEngine; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.IO; using LitJson; using System; /// /// 断线重连管理 /// public class ReconnectMgr : SingletonMono { [HideInInspector] public float recordDuration = -1; private float recordCountdown = -1; private TB_UserExamStat UserExamStat = new TB_UserExamStat(); private string localStatPath = ""; private string localStatFileName = "realtimeStat.json"; /// /// 初始化函数,记录时间间隔 /// public void Init( ) { localStatPath = Application.streamingAssetsPath + "/" + localStatFileName; //if (File.Exists( localStatPath ))//启动后检查有没有之前的遗留 //{ // File.Delete( localStatPath ); //} } ReconnectMgr()//构造函数 { Init( ); } /// /// 记录用户状态 /// public void RealtimeStatWriter() { //记录步骤相关各项信息 UserExamStat.schemeID = ProcessManager.Instance.schemeID; //记录得分情况 ScoreBase scoreBase = FindFirstObjectByType(); 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> 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 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(); 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(); 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); } /// /// 读取用户状态(先使用同步,后用异步) /// public bool RealtimeStatReader() { if (File.Exists(localStatPath)) { try { StreamReader sr = new StreamReader(localStatPath); string user_last_stat = sr.ReadToEnd(); sr.Close(); UserExamStat = JsonMapper.ToObject(user_last_stat); return true; } catch (System.Exception e) { Debug.LogError(e.ToString()); return false; } } else { return false; } } /// /// 恢复现场 /// public void RecoverScene() { //先恢复场景 ScenesManager.Instance.LoadSceneAsyn(UserExamStat.sceneName, () => { //右侧工具栏切换 GameManager.EventMgr.EventTrigger(Enum_EventType.SwitchScene, GameManager.RunModelMgr.SceneType); //恢复场景中各项装备 BaseToolOrDevice[] allThings = FindObjectsOfType(); 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 itemInPack = ToolAndmaterialMgr.Instance.CreateItemInfoByName(UserExamStat.allToolAndMaterial); foreach (ItemInfo item in itemInPack) { PacksackBagMgr.Instance.AddOneToolOrMater(item); } //恢复已穿戴的装备 List itemWear = ToolAndmaterialMgr.Instance.CreateItemInfoByName(UserExamStat.allWear); foreach (ItemInfo item in itemWear) { PacksackBagMgr.Instance.WearItemState(item, true); } //恢复场景内各个触发器状态 PermanentTriggerBase[] allPermanentTriggers = FindObjectsOfType(); List 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(Enum_EventType.SwitchSubProcess, UserExamStat.subProcessId); GameManager.EventMgr.EventTrigger(Enum_EventType.SwitchSubProcessStepTriggerID, ProcessManager.Instance.subProcessStepTriggerID);*/ } } }