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 string 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> /// 切换 -1-错误操作,0-结束,1-流程,2-子流程,3-子流程步骤 /// </summary> /// <returns></returns> public int 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); //Debug.Log("进入下一步子流程步骤"); return 3; } 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); //Debug.Log("进入下一步子流程"); return 2; } 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); Debug.Log($"<color=red>进入下一步流程</color>"); return 1; } else { Debug.Log($"<color=red>完成所有</color>"); //HQB 20240828完成后展示学习完成Tips GameManager.UIMgr.ShowPanel<UI_TipsForPracticePanel>(E_UI_Layer.System); return 0; } } } } else { Debug.Log($"<color=red>按照流程走</color>"); StepErrorTips(); return -1; } } //public int currentSubProcessIDTemp = 0; /// <summary> /// 0 正常,1 不在当前步骤触发ID,2 当前步骤没有触发ID了 /// </summary> /// <param name="triggerName"></param> /// <returns></returns> public int IsRightSubProcessStepsTriggerID(string triggerName, bool isRemove) { if (GameManager.RunModelMgr.ModeType != E_ModeType.Study) return 0; if (d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.precondition == GameManager.RunModelMgr.SceneType.ToString()) { if (d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.triggersName.Count > 0) { string currentSubProcessStepTriggerID = d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.triggersName[0]; if (triggerName == currentSubProcessStepTriggerID) { if (isRemove) { d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.triggersName.RemoveAt(0); } if (d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.triggersName.Count == 0) { if (triggerName != "工具间按钮" && triggerName != "现场按钮" && triggerName != "收回工具") { //if (CheckSubProcessSteps(subProcessStepId) == 3) //{ //} //else //{ GameManager.UIMgr.ShowPanel<UI_MessagePanel>(E_UI_Layer.System, (p) => { p.Init("提示", "当前步骤已完成,即将进入下一步", E_MessageType.Normal, () => { CheckSubProcessSteps(subProcessStepId); CurrentSubProcessStepTriggerNames(); }); }); //} } else { CheckSubProcessSteps(subProcessStepId); } } CurrentSubProcessStepTriggerNames(); return 0; } else { StepErrorTips(); return 1; } } else { Debug.Log($"<color=red>没有提示</color>"); return 2; } } else { StepErrorTips(); return -1; } } /// <summary> /// 切换流程之后, 当前子流程步骤triggerName不等于0的时候操作 /// </summary> private void CurrentSubProcessStepTriggerNames() { if (d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.triggersName.Count != 0) { string triggerNameTemp = d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.triggersName[0]; string splitResult = ""; if (triggerNameTemp.Contains("+")) { splitResult = triggerNameTemp.Split('+')[1]; } else { splitResult = triggerNameTemp; } subProcessStepTriggerID = splitResult; GameManager.EventMgr.EventTrigger<string>(Enum_EventType.SwitchSubProcessStepTriggerID, splitResult); } } /// <summary> /// 操作错子流程步骤的triggerName的错误提示 /// </summary> private void StepErrorTips() { if (GameManager.UIMgr.GetPanel<UI_MiddleTipPanel>()) { GameManager.UIMgr.GetPanel<UI_MiddleTipPanel>().Init($"错误,{d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.tipTitle}"); } else { GameManager.UIMgr.ShowPanel<UI_MiddleTipPanel>(E_UI_Layer.System, (p) => { p.Init($"错误,{d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.tipTitle}"); }); } } /// <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; } }