diff --git a/Assets/Scripts/ExcelData/DataContainer/TB_UserExamStat.cs b/Assets/Scripts/ExcelData/DataContainer/TB_UserExamStat.cs index 8de9982..090cc29 100644 --- a/Assets/Scripts/ExcelData/DataContainer/TB_UserExamStat.cs +++ b/Assets/Scripts/ExcelData/DataContainer/TB_UserExamStat.cs @@ -1,27 +1,78 @@ /// /// 保存用户考试状态 /// +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +//用于记录当前得分情况 +[Serializable] +public class ReconnectSubScoreInfo +{ + public int index = -1; + public int subProcessId; + public float currentScore = 0.0f; + public bool isDone; +} + +//用于记录现场中各项出发物品信息 +[Serializable] +public class ReconnectTriggerInfo +{ + public int triggerID; + public string triggerName; + public Vector3 selfPosInScene; + public Vector3 selfRotInScene; +} + + +//用于记录场景中物品的信息 +[Serializable] +public class ReconnectItemInfo +{ + public int toolId; + public int triggerID; + public string toolName; + //public E_ToolOrDeviceOrMaterials toolOrDeviceOrMaterial; + public Vector3 selfPosInToolRoom; +} public class TB_UserExamStat { - /// - ///当前方案ID - /// - public int schemeID = -1; + public int systemID = -1;//当前系统ID + public int schemeID = -1;//当前方案ID + /*public int processId = -1;// 当前流程Id + public int subProcessId = -1;//当前子流程Id + public int subProcessStepId = -1;//当前子流程步骤Id*/ /// - /// 当前流程Id + /// 当前得分情况 /// - public int processId = -1; + public float currentScore = 0; + public List allSubScore = new List(); /// - /// 当前子流程Id + /// 背包中所有的工具和材料 /// - public int subProcessId = -1; + public List allToolAndMaterial = new List(); /// - /// 当前子流程步骤Id + /// 所有已经穿戴的装备 /// - public int subProcessStepId = -1; + public List allWear = new List(); + /// + /// 场景名称 + /// + public string sceneName = ""; + + /// + /// 当前场景内的所有装备和材料 + /// + public List currentSceneTools = new List(); + + /// + /// 当前场景内的所有可触发物品 + /// + public List currentSceneTriggers = new List(); } diff --git a/Assets/Scripts/Project/Manager/GameManager.cs b/Assets/Scripts/Project/Manager/GameManager.cs index bc69488..09f37b5 100644 --- a/Assets/Scripts/Project/Manager/GameManager.cs +++ b/Assets/Scripts/Project/Manager/GameManager.cs @@ -126,7 +126,7 @@ public class GameManager : SingletonAutoMono RunModelMgr = RunModelMgr.Instance; ToolAndmaterialMgr = ToolAndmaterialMgr.Instance; PacksackBagMgr = PacksackBagMgr.Instance; - //ReconnectMgr = ReconnectMgr.Instance;//閲嶈繛绠$悊鍒濆鍖 + ReconnectMgr = ReconnectMgr.Instance;//閲嶈繛绠$悊鍒濆鍖 DataMgr.Init(); InitData(); diff --git a/Assets/Scripts/Project/Manager/ProcessManager.cs b/Assets/Scripts/Project/Manager/ProcessManager.cs index f13ec1c..af29268 100644 --- a/Assets/Scripts/Project/Manager/ProcessManager.cs +++ b/Assets/Scripts/Project/Manager/ProcessManager.cs @@ -80,8 +80,8 @@ public class ProcessManager : BaseManager { this.schemeID = id; this.mode = mode; - coroutine = GameManager.MonoMgr.StartCoroutine(CountDown(countDown)); - //coroutine = GameManager.MonoMgr.StartCoroutine(AutoSaveStat(countDown));//鑷姩淇濆瓨鐢ㄦ埛鐘舵佷俊鎭 + //coroutine = GameManager.MonoMgr.StartCoroutine(CountDown(countDown)); + coroutine = GameManager.MonoMgr.StartCoroutine(AutoSaveStat(countDown));//鑷姩淇濆瓨鐢ㄦ埛鐘舵佷俊鎭 d_Scheme = DataManager.Instance.GetSchemeData(id); ReportManager.Instance.creport = DataManager.Instance.GetSchemeReport(id); GameManager.ToolAndmaterialMgr.Init(d_Scheme.ToolOrMaterilOrDevice); diff --git a/Assets/Scripts/Project/Manager/ReconnectMgr.cs b/Assets/Scripts/Project/Manager/ReconnectMgr.cs index e18100f..24f4609 100644 --- a/Assets/Scripts/Project/Manager/ReconnectMgr.cs +++ b/Assets/Scripts/Project/Manager/ReconnectMgr.cs @@ -1,11 +1,11 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; - using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.IO; using LitJson; +using System; /// /// 断线重连管理 @@ -18,6 +18,7 @@ public class ReconnectMgr : SingletonMono private TB_UserExamStat UserExamStat = new TB_UserExamStat(); private string localStatPath = ""; private string localStatFileName = "realtimeStat.json"; + /// /// 初始化函数,记录时间间隔 /// @@ -42,13 +43,81 @@ public class ReconnectMgr : SingletonMono { //记录步骤相关各项信息 UserExamStat.schemeID = ProcessManager.Instance.schemeID; - UserExamStat.processId = ProcessManager.Instance.processId; + + //记录得分情况 + 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.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("用户当前状态" + UserJson); - + Debug.Log("自动保存成功"); File.WriteAllText(localStatPath, UserJson); } @@ -65,7 +134,6 @@ public class ReconnectMgr : SingletonMono string user_last_stat = sr.ReadToEnd(); sr.Close(); UserExamStat = JsonMapper.ToObject(user_last_stat); - Debug.Log("用户当前schemeID:" + UserExamStat.schemeID); return true; } catch (System.Exception e) @@ -79,28 +147,83 @@ public class ReconnectMgr : SingletonMono } } - // Start is called before the first frame update - //void Start() - //{ - - //} + /// + /// 恢复现场 + /// + 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.S))//测试用,按S读取状态保存 + if (Input.GetKeyDown(KeyCode.T))//测试用,按T读取状态保存 { RealtimeStatWriter(); + Debug.Log("当前场景:" + UserExamStat.sceneName); } - else if(Input.GetKeyDown(KeyCode.R)) + else if(Input.GetKeyDown(KeyCode.Y)) { RealtimeStatReader(); - - ProcessManager.Instance.HandoverProcess(UserExamStat.processId, UserExamStat.subProcessId, UserExamStat.subProcessStepId); + 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); - //Debug.LogError(ProcessManager.Instance.subProcessStepTriggerID); - GameManager.EventMgr.EventTrigger(Enum_EventType.SwitchSubProcessStepTriggerID, ProcessManager.Instance.subProcessStepTriggerID); + GameManager.EventMgr.EventTrigger(Enum_EventType.SwitchSubProcessStepTriggerID, ProcessManager.Instance.subProcessStepTriggerID);*/ } } }