using ChivaXR; using ChivaXR.Op; using QFramework; using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using UnityEngine; /// /// 自由版流程控制 /// public class FreeProcessManagement : MonoSingleton { //自由操作清单 public List freeProcessElements = new List(); //当前场景中激活的操作 public List activeProcessElements = new List(); private List tmpStepFreeConditionss = new List(); public Dictionary dic_NoOperationData = new Dictionary(); public void InitFreeProcess(string courseName) { FreeStepListProxy m_FreeStepListProxy = DAL.Instance.Get(); tmpStepFreeConditionss = m_FreeStepListProxy.ReadStepMsgInfoFromTable(courseName); for (int i = 0; i < tmpStepFreeConditionss.Count; i++) { FreeProcessElement tmpProcessElement = new FreeProcessElement(); tmpProcessElement.freeProcessElement = ProcessManagement.Instance.processes[i]; foreach (var item in tmpStepFreeConditionss[i].preStepCondition.Split('/')) { if (string.IsNullOrEmpty(item)) { continue; } int id = int.Parse(item); if (id == 0) continue; tmpProcessElement.preconditions.Add(ProcessManagement.Instance.processes[id - 1]); }; freeProcessElements.Add(tmpProcessElement); } } public void ActiveProcess() { foreach (var item in freeProcessElements) { item.Init(); } } public void RecordProcessElementActiveState(ProcessElement processElement) { if (!activeProcessElements.Contains(processElement)) { activeProcessElements.Add(processElement); UIKit.GetPanel().AddProcessElement(processElement, tmpStepFreeConditionss[processElement.stepID - 1].stepName); //检测非交互操作点如:语音播放等 PB_OpData pbOpData = processElement.GetComponent(); if (OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName) == null) { return; } OperationDataBase tmpOperationData = OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName); if ((tmpOperationData as OpTrigger_ToolPack == null) && !dic_NoOperationData.Keys.Contains(tmpOperationData)) { dic_NoOperationData.Add(tmpOperationData, tmpStepFreeConditionss[processElement.stepID - 1].stepName); } } } public void RemoveProcessElementActiveState(ProcessElement processElement) { if (activeProcessElements.Contains(processElement)) { activeProcessElements.Remove(processElement); UIKit.GetPanel().RemoveProcessElement(processElement); //检测非交互操作点如:语音播放等 PB_OpData pbOpData = processElement.GetComponent(); if (OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName) == null) { return; } OperationDataBase tmpOperationData = OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName); if ((tmpOperationData as OpTrigger_ToolPack == null) && dic_NoOperationData.Keys.Contains(tmpOperationData)) { dic_NoOperationData.Remove(tmpOperationData); } } } } public class FreeProcessElement { /// /// 前置流程条件 /// public List preconditions = new List(); public ProcessElement freeProcessElement; public void Init() { foreach (ProcessElement element in preconditions) { element.processElementExitHandle += PreConditionProcessFinished; } freeProcessElement.processElementExitHandle += FreeProcessElementFinished; if (preconditions.Count == 0) { FreeProcessManagement.Instance.RecordProcessElementActiveState(freeProcessElement); freeProcessElement.Enter(); } } /// /// 前置流程完成检测 /// /// public void PreConditionProcessFinished(ProcessElement element) { bool allPreConditionFinished = true; foreach (var item in preconditions) { if (!item.finished) { allPreConditionFinished = false; } } if (allPreConditionFinished && !freeProcessElement.active && !freeProcessElement.finished) { freeProcessElement.Enter(); FreeProcessManagement.Instance.RecordProcessElementActiveState(freeProcessElement); } } /// /// 当前自由流程完成 /// /// public void FreeProcessElementFinished(ProcessElement element) { if (freeProcessElement == element) { FreeProcessManagement.Instance.RemoveProcessElementActiveState(freeProcessElement); ToolLibraryForm.RefrushAllChoseTool(); } } }