using System.Collections; using System.Collections.Generic; using System.Net.NetworkInformation; using UnityEngine; public class ProcessManager : BaseManager<ProcessManager> { /// <summary> /// 构造函数 /// </summary> private ProcessManager() { } /// <summary> /// 模式 /// </summary> public E_ModeType mode; /// <summary> /// 用户数据 /// </summary> public UserData userData = new UserData(); /// <summary> /// 当前的项目/方案 /// </summary> public D_Scheme d_Scheme; /// <summary> ///当前方案ID /// </summary> public int schemeID = -1; /// <summary> /// 当前流程Id /// </summary> public int processId = -1; /// <summary> /// 当前子流程Id /// </summary> public int subProcessId = -1; /// <summary> /// 当前子流程步骤Id /// </summary> public int subProcessStepId = -1; public int subProcessStepTriggerID = -1; /// <summary> /// 倒计时,剩余时长 /// </summary> public int countDown = 0; /// <summary> /// 实训/考试时长 /// </summary> private int time; /// <summary> /// 记录倒计时的协程 /// </summary> private Coroutine coroutine; /// <summary> /// 初始化 /// 根据方案id 生成流程数据 /// </summary> /// <param name="id">方案id</param> public void Init(int id, E_ModeType mode, int countDown = 600) //TODO 考试断线重连应该考虑初始化问题 { this.schemeID = id; this.mode = mode; coroutine = GameManager.MonoMgr.StartCoroutine(CountDown(countDown)); d_Scheme = DataManager.Instance.GetSchemeData(id); ReportManager.Instance.creport = DataManager.Instance.GetSchemeReport(id); GameManager.ToolAndmaterialMgr.Init(d_Scheme.ToolOrMaterilOrDevice); d_Scheme.Init(); Debug.Log("流程初始化完成"); } /// <summary> /// 切换流程 /// </summary> public void HandoverProcess(int processId, int subProcessId = 0, int subProcessStepId = 0) { if (processId == -1 || subProcessId == -1 || subProcessStepId == -1) return; d_Scheme.HandoverProcess(processId, subProcessId, subProcessStepId); } /// <summary> /// 切换流程 /// </summary> public void HandoverSubProcess(int subProcessId, int subProcessStepId = 0) { if (processId == -1 || subProcessId == -1 || subProcessStepId == -1) return; d_Scheme.HandoverProcess(processId, subProcessId, subProcessStepId); } /// <summary> /// 切换流程 /// </summary> public void HandoverSubProcessStep(int subProcessStepId) { if (processId == -1 || subProcessId == -1 || subProcessStepId == -1) return; d_Scheme.HandoverProcess(processId, subProcessId, subProcessStepId); } /// <summary> /// 切换 /// </summary> /// <returns></returns> public bool CheckSubProcessSteps(int subProcessStepID) { if (d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStepId.Equals(subProcessStepID)) { int spStepID = subProcessStepId + 1; int spStepcount = d_Scheme.CurrentProcess.CurrentSubProcess.subProcessStepes.Count; if (spStepID <= d_Scheme.CurrentProcess.CurrentSubProcess.subProcessStepes[spStepcount - 1].id) { HandoverSubProcessStep(spStepID); GameManager.UIMgr.ShowPanel<UI_TopTipPanel>(E_UI_Layer.System, (panel) => { panel.Init($"{d_Scheme.CurrentProcess.processName}:<color=blue>{d_Scheme.CurrentProcess.CurrentSubProcess.subProcessName}</color>", $"{d_Scheme.CurrentProcess.CurrentSubProcess.tips}"); }); Debug.Log("进入下一步子流程步骤"); return true; } else { int spCount = d_Scheme.CurrentProcess.subProcesses.Count; int spID = subProcessId + 1; if (spID <= d_Scheme.CurrentProcess.subProcesses[spCount - 1].id) { HandoverSubProcess(spID, 0); GameManager.EventMgr.EventTrigger<int>(Enum_EventType.SwitchSubProcess, d_Scheme.CurrentProcess.CurrentSubProcessId); GameManager.UIMgr.ShowPanel<UI_TopTipPanel>(E_UI_Layer.System, (panel) => { panel.Init($"{d_Scheme.CurrentProcess.processName}:<color=blue>{d_Scheme.CurrentProcess.CurrentSubProcess.subProcessName}</color>", $"{d_Scheme.CurrentProcess.CurrentSubProcess.tips}"); }); Debug.Log("进入下一步子流程"); return true; } else { int pCount = d_Scheme.processes.Count; int pID = processId + 1; if (pID <= d_Scheme.processes[pCount - 1].id) { HandoverProcess(pID, 0, 0); GameManager.EventMgr.EventTrigger<int>(Enum_EventType.SwitchSubProcessStep, d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStepId); GameManager.EventMgr.EventTrigger<int>(Enum_EventType.SwitchSubProcess, d_Scheme.CurrentProcess.CurrentSubProcessId); GameManager.UIMgr.ShowPanel<UI_TopTipPanel>(E_UI_Layer.System, (panel) => { panel.Init($"{d_Scheme.CurrentProcess.processName}:<color=blue>{d_Scheme.CurrentProcess.CurrentSubProcess.subProcessName}</color>", $"{d_Scheme.CurrentProcess.CurrentSubProcess.tips}"); }); Debug.Log("进入下一步流程"); return true; } else { Debug.Log("完成所有"); return false; } } } } else { Debug.Log("按照流程走"); GameManager.UIMgr.ShowPanel<UI_MiddleTipPanel>(E_UI_Layer.Mid, (panel) => { panel.Init($"错误,{d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.tipTitle}"); }); return false; } } /// <summary> /// 0 正常,1 不在当前步骤触发ID,2 当前步骤没有触发ID了 /// </summary> /// <param name="triggerID"></param> /// <returns></returns> public int IsRightSubProcessStepsTriggerID(int triggerID, bool isRemove) { if (d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.precondition == GameManager.RunModelMgr.SceneType.ToString()) { if (d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.triggersId.Count > 0) { int currentSubProcessStepTriggerID = d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.triggersId[0]; if (triggerID == currentSubProcessStepTriggerID) { if (isRemove) d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.triggersId.RemoveAt(0); if (d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.triggersId.Count == 0) { CheckSubProcessSteps(GameManager.ProcessMgr.subProcessStepId); Debug.Log($"<color=red>triggersId空了</color>"); } GameManager.EventMgr.EventTrigger<int>(Enum_EventType.SwitchSubProcessStepTriggerID, d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.triggersId[0]); return 0; } else { GameManager.UIMgr.ShowPanel<UI_MiddleTipPanel>(E_UI_Layer.System, (p) => { p.Init($"错误,{d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.tipTitle}"); }); return 1; } } else { Debug.Log($"<color=red>没有提示</color>"); return 2; } } else { GameManager.UIMgr.ShowPanel<UI_MiddleTipPanel>(E_UI_Layer.System, (p) => { p.Init($"错误,请前往{d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.SceneName()}"); }); return -1; } } /// <summary> /// 倒计时 /// </summary> /// <param name="time">倒计时多久</param> /// <returns></returns> private IEnumerator CountDown(int time) { this.time = time; countDown = time; WaitForSeconds waitForSeconds = new WaitForSeconds(1); while (countDown > 0) { yield return waitForSeconds; countDown--; } } /// <summary> /// 结束 /// </summary> public void End() { schemeID = -1; mode = E_ModeType.None; if (coroutine != null) GameManager.MonoMgr.StopCoroutine(coroutine); d_Scheme = null; } }