FreeProcessManagement.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. using ChivaXR;
  2. using ChivaXR.Op;
  3. using QFramework;
  4. using System;
  5. using System.Collections;
  6. using System.Collections.Generic;
  7. using System.Diagnostics;
  8. using System.Linq;
  9. using System.Runtime.Remoting.Metadata.W3cXsd2001;
  10. using UnityEngine;
  11. /// <summary>
  12. /// 自由版流程控制
  13. /// </summary>
  14. public class FreeProcessManagement : MonoSingleton<FreeProcessManagement>
  15. {
  16. //自由操作清单
  17. public List<FreeProcessElement> freeProcessElements = new List<FreeProcessElement>();
  18. //当前场景中激活的操作
  19. public List<ProcessElement> activeProcessElements = new List<ProcessElement>();
  20. private List<OperationStepFreeCondition> tmpStepFreeConditionss = new List<OperationStepFreeCondition>();
  21. public Dictionary<OperationDataBase, string> dic_NoOperationData = new Dictionary<OperationDataBase, string>();
  22. public void InitFreeProcess(string courseName)
  23. {
  24. FreeStepListProxy m_FreeStepListProxy = DAL.Instance.Get<FreeStepListProxy>();
  25. tmpStepFreeConditionss = m_FreeStepListProxy.ReadStepMsgInfoFromTable(courseName);
  26. for (int i = 0; i < tmpStepFreeConditionss.Count; i++)
  27. {
  28. FreeProcessElement tmpProcessElement = new FreeProcessElement();
  29. tmpProcessElement.freeProcessElement = ProcessManagement.Instance.processes[i];
  30. foreach (var item in tmpStepFreeConditionss[i].preStepCondition.Split('/'))
  31. {
  32. if (string.IsNullOrEmpty(item)) { continue; }
  33. int id = int.Parse(item);
  34. if (id == 0) continue;
  35. tmpProcessElement.preconditions.Add(ProcessManagement.Instance.processes[id - 1]);
  36. };
  37. freeProcessElements.Add(tmpProcessElement);
  38. }
  39. }
  40. public void ActiveProcess()
  41. {
  42. foreach (var item in freeProcessElements)
  43. {
  44. item.Init();
  45. }
  46. }
  47. public void RecordProcessElementActiveState(ProcessElement processElement)
  48. {
  49. if (!activeProcessElements.Contains(processElement))
  50. {
  51. activeProcessElements.Add(processElement);
  52. UIKit.GetPanel<ArrowTipsPanel>().AddProcessElement(processElement, tmpStepFreeConditionss[processElement.stepID - 1].stepName);
  53. //检测非交互操作点如:语音播放等
  54. PB_OpData pbOpData = processElement.GetComponent<PB_OpData>();
  55. if (OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName) == null)
  56. {
  57. return;
  58. }
  59. OperationDataBase tmpOperationData = OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName);
  60. if ((tmpOperationData as OpTrigger_ToolPack == null) && !dic_NoOperationData.Keys.Contains(tmpOperationData))
  61. {
  62. dic_NoOperationData.Add(tmpOperationData, tmpStepFreeConditionss[processElement.stepID - 1].stepName);
  63. }
  64. }
  65. }
  66. public void RemoveProcessElementActiveState(ProcessElement processElement)
  67. {
  68. if (activeProcessElements.Contains(processElement))
  69. {
  70. activeProcessElements.Remove(processElement);
  71. UIKit.GetPanel<ArrowTipsPanel>().RemoveProcessElement(processElement);
  72. //检测非交互操作点如:语音播放等
  73. PB_OpData pbOpData = processElement.GetComponent<PB_OpData>();
  74. if (OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName) == null)
  75. {
  76. return;
  77. }
  78. OperationDataBase tmpOperationData = OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName);
  79. if ((tmpOperationData as OpTrigger_ToolPack == null) && dic_NoOperationData.Keys.Contains(tmpOperationData))
  80. {
  81. dic_NoOperationData.Remove(tmpOperationData);
  82. }
  83. }
  84. }
  85. public void LoadAudio(ProcessElement element)
  86. {
  87. StepListProxy m_StepListProxy = DAL.Instance.Get<StepListProxy>();
  88. if (String.IsNullOrEmpty(m_StepListProxy.GetOperationStepDataInfoById(element.stepID).audioClipName))
  89. {
  90. return;
  91. }
  92. StartCoroutine(AudioHelper.LoadAudioClip(OperateSetting.Instance.m_CourseName, m_StepListProxy.GetOperationStepDataInfoById(element.stepID).audioClipName, AudioType.MPEG, LoadAudioCallBack));
  93. }
  94. /// <summary>
  95. /// 加载音频回调
  96. /// </summary>
  97. /// <param name="clip"></param>
  98. private void LoadAudioCallBack(AudioClip clip)
  99. {
  100. SoundManager.Instance.PlayBg(clip);
  101. }
  102. public void StopAudio()
  103. {
  104. SoundManager.Instance.StopBg();
  105. }
  106. }
  107. public class FreeProcessElement
  108. {
  109. /// <summary>
  110. /// 前置流程条件
  111. /// </summary>
  112. public List<ProcessElement> preconditions = new List<ProcessElement>();
  113. public ProcessElement freeProcessElement;
  114. public void Init()
  115. {
  116. foreach (ProcessElement element in preconditions)
  117. {
  118. element.processElementExitHandle += PreConditionProcessFinished;
  119. }
  120. freeProcessElement.processElementExitHandle += FreeProcessElementFinished;
  121. if (preconditions.Count == 0)
  122. {
  123. FreeProcessManagement.Instance.RecordProcessElementActiveState(freeProcessElement);
  124. freeProcessElement.Enter();
  125. }
  126. }
  127. /// <summary>
  128. /// 前置流程完成检测
  129. /// </summary>
  130. /// <param name="element"></param>
  131. public void PreConditionProcessFinished(ProcessElement element)
  132. {
  133. bool allPreConditionFinished = true;
  134. foreach (var item in preconditions)
  135. {
  136. if (!item.finished)
  137. {
  138. allPreConditionFinished = false;
  139. }
  140. }
  141. if (allPreConditionFinished && !freeProcessElement.active && !freeProcessElement.finished)
  142. {
  143. freeProcessElement.Enter();
  144. FreeProcessManagement.Instance.RecordProcessElementActiveState(freeProcessElement);
  145. }
  146. }
  147. /// <summary>
  148. /// 当前自由流程完成
  149. /// </summary>
  150. /// <param name="element"></param>
  151. public void FreeProcessElementFinished(ProcessElement element)
  152. {
  153. if (freeProcessElement == element)
  154. {
  155. FreeProcessManagement.Instance.RemoveProcessElementActiveState(freeProcessElement);
  156. ToolLibraryForm.RefrushAllChoseTool();
  157. UIKit.GetPanel<PC_OperatePanel>().OperateStep.ShowFreeSecondStepItemByStepId(freeProcessElement.stepID);
  158. UIKit.GetPanel<LogSystemForm>().AddOpStepLog("操作步骤", freeProcessElement.stepID);
  159. if (OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeParctice)
  160. {
  161. FreeProcessManagement.Instance.LoadAudio(element);
  162. }
  163. if (OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeExam)
  164. {
  165. ExamManagerForPC.instance.FreeProcessElementFinished(freeProcessElement);
  166. }
  167. CheckFreeProcessMark(element);
  168. }
  169. }
  170. private static void CheckFreeProcessMark(ProcessElement element)
  171. {
  172. PB_OpData pbOpData = element.GetComponent<PB_OpData>();
  173. OperationDataBase operationDataBase = OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName);
  174. if (operationDataBase != null)
  175. {
  176. FreeProcessMark freeProcessMark = operationDataBase.GetComponent<FreeProcessMark>();
  177. if (freeProcessMark != null)
  178. {
  179. freeProcessMark.Exit();
  180. }
  181. }
  182. }
  183. }