namespace ChivaXR.Op { using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using Sirenix.OdinInspector; using VRTK; using ChivaXR.VR; using ProcedureBYQ; using QFramework; [RequireComponent(typeof(ExamHandleManager))] public class ExamManagerForVR : MonoBehaviour { public static ExamManagerForVR instance; public ExamProxy examProxy; #region 场景配置模块 [BoxGroup("场景配置模块", CenterLabel = true, Order = 0), GUIColor(0, 1, 0, 0.6f)] [Button("1.获取流程信息")] public void GetEaxmProcessElements() { List processElements = ProcessManagement.Instance.processes; //临时转存,用户数据恢复 List tmpExamProcessElements = examProcessElements; //重建考试信息列表 examProcessElements = new List(); foreach (var item in processElements) { ExamProcessElement examProcessElement = tmpExamProcessElements.Find(t => t.elementDescript == item.processBase.GetPBDescribe()); if (examProcessElement != null) { examProcessElements.Add(examProcessElement); } else { StepListProxy tmpProxy = DAL.Instance.Get(); OperationStepDataInfo tmpInfo = tmpProxy.GetOpStepDataInfoById(item.stepID); examProcessElements.Add(new ExamProcessElement() { id = item.stepID, elementDescript = item.processBase.GetPBDescribe(), stepName = tmpInfo.stepName }); } } } [BoxGroup("场景配置模块", CenterLabel = true, Order = 0), GUIColor(0, 1, 0, 0.6f)] [Button("2.将所有的CurvedUI和箭头置为禁用(不影响编辑器跳步)")] public void GetCurvedUIAndDiasable() { //将环形UI置为禁用状态 List processElements = ProcessManagement.Instance.processes; foreach (var item in processElements) { ProcessState_CurvedUI curvedUI = item.gameObject.GetComponent(); if (curvedUI != null) { curvedUI.active = false; } } //将箭头提示置为禁用状态 JianTouManager.Instance.SetJianTouActive(false); } [BoxGroup("场景配置模块", CenterLabel = true, Order = 0), GUIColor(0, 1, 0, 0.6f)] [Button("3、初始化流程分数")] public void SetEaxmProcessScore() { if (examProcessElements.Count <= 0) { return; } foreach (var item in examProcessElements) { if (examProcessElements.Count <= 100) { item.scores = 1; } else { //item.scores = 100 / examProcessElements.Count; item.scores = 0.5f; } } RefreshScore(); } #endregion #region 配分模块 [BoxGroup("配分模块", CenterLabel = true, Order = 1)] /// /// 考试信息 /// [TableList(MaxScrollViewHeight = 20)] public List examProcessElements; private ProcessElement currentProcessElement; #endregion #region 成绩展示模块 [BoxGroup("配分模块", CenterLabel = true, Order = 1)] [LabelText("配置总分"), GUIColor(0, 1, 1, 1)] [Sirenix.OdinInspector.ReadOnly] public float totalScore; [BoxGroup("配分模块", CenterLabel = true, Order = 1)] [Button("刷新总设定分数")] public void RefreshScore() { totalScore = 0; foreach (var item in examProcessElements) { totalScore += item.scores; } } [BoxGroup("成绩展示模块", CenterLabel = true, Order = 3)] [LabelText("最终得分"), GUIColor(1, 0.92f, 0.016f, 1)] [Sirenix.OdinInspector.ReadOnly] public float score; [BoxGroup("成绩展示模块", CenterLabel = true, Order = 3)] [LabelText("成绩展示时相机位置"), GUIColor(1, 0.92f, 0.016f, 1)] public Vector3 CameraPosition = new Vector3(-0.5461204f, -0.5791085f, 0.8489573f); [BoxGroup("成绩展示模块", CenterLabel = true, Order = 3)] [LabelText("成绩展示时相机角度"), GUIColor(1, 0.92f, 0.016f, 1)] public Quaternion CameraRotation = new Quaternion(0, 180, 0, 0); [BoxGroup("成绩展示模块", CenterLabel = true, Order = 3)] [LabelText("成绩展示时禁用相机移动"), GUIColor(1, 0.92f, 0.016f, 1)] public bool DisableCamerMove = false; private bool mResultUpLoad = false; [BoxGroup("成绩展示模块", CenterLabel = true, Order = 3)] [Button("打开成绩面板(运行时生效)")] public void ExamFinish() { SetCamerRigPositionAndRotation(); ShowExamResultPanel(); SetCamerRigDisable(); UpLoadScore(); CountExamDuration(); } public void UpLoadScore() { examProxy.UpLoadExamResult(SettlementScore()); mResultUpLoad = true; } /// /// 展示考试信息 /// /// private ExamResultPanel ShowExamResultPanel() { ExamResultPanel tmpExamPanel = null; if (Application.isPlaying) { tmpExamPanel = FindObjectOfType(); if (tmpExamPanel == null) { var resLoader = ResLoader.Allocate(); GameObject tmpPrefab = resLoader.LoadSync("ExamResultCanvas"); if (tmpPrefab == null) { Debug.LogError("UI/ExamResultCanvas没有加载到!!!!"); } else { GameObject tmpObj = Instantiate(tmpPrefab, null); tmpObj.SetActive(true); tmpExamPanel = tmpObj.GetComponentInChildren(); } } } if (tmpExamPanel != null) tmpExamPanel.ShowScoreList(examProcessElements, SettlementScore(), m_RecordExamDuration); return tmpExamPanel; } /// /// 设置相机位置 /// private void SetCamerRigPositionAndRotation() { if (Application.isPlaying) { GameObject camerRig = GameObject.Find("[CameraRig]"); if (camerRig != null) { camerRig.transform.position = CameraPosition; camerRig.transform.rotation = CameraRotation; } } } /// /// 设置是否禁用相机移动 /// private void SetCamerRigDisable() { if (Application.isPlaying) { PlayMoveWayController playMoveWayController = FindObjectOfType(); if (playMoveWayController != null) { playMoveWayController.enabled = !DisableCamerMove; } } } #endregion /// /// 记录考试时长 /// private float m_RecordExamDuration; private void Awake() { instance = this; ProcessManagement.Instance.processElementActiveEvent += ProcessElementActive; ProcessManagement.Instance.processElementDisActiveEvent += ProcessElementDisActive; ProcessManagement.Instance.processFinishEvent += ExamFinish; examProxy = DAL.Instance.Get(); examProxy.StartExam(); } /// /// 步骤进入 /// /// private void ProcessElementActive(ProcessElement element) { currentProcessElement = element; } /// /// 步骤退出 /// /// private void ProcessElementDisActive(ProcessElement element) { JianTouManager.instance.SetJianTouActive(false); ExamProcessElement tmpElement = examProcessElements.Find(t => t.elementDescript == currentProcessElement.processBase.GetPBDescribe()); if (tmpElement.finish == false) { tmpElement.finish = true; tmpElement.result = true; } SettlementScore(); } public CVR_HintItem hintItem; /// /// 打开提示 /// public void OpenPrompt() { SetCuredUIState(true); JianTouManager.instance.SetJianTouActive(true); hintItem.OpenHighlighter(OutLineType.hint); SetCurrentExamElementResult(); } /// /// 设置正在考的步骤的状态 /// private void SetCurrentExamElementResult() { ExamProcessElement examElent = examProcessElements.Find(t => t.elementDescript == currentProcessElement.processBase.GetPBDescribe()); if (examElent != null) { examElent.finish = true; examElent.result = false; } } /// /// 设置环形UI状态 /// /// private void SetCuredUIState(bool state) { ProcessState_CurvedUI curveUI = currentProcessElement.GetComponent(); if (curveUI != null) { curveUI.active = state; curveUI.EnterState(true); } } /// /// 分数结算 /// private float SettlementScore() { score = 0; foreach (var item in examProcessElements) { if (item.finish == true && item.result == true) { score += item.scores; } } return score; } /// /// 统计考试时长 /// private void CountExamDuration() { // 记录结束时的时间 DateTime finishTime = DateTime.Now; m_RecordExamDuration = (float)(finishTime - examProxy.startTime).TotalMilliseconds; } private void OnDisable() { ProcessManagement.Instance.processElementActiveEvent -= ProcessElementActive; ProcessManagement.Instance.processElementActiveEvent -= ProcessElementDisActive; ProcessManagement.Instance.processFinishEvent -= ExamFinish; } private void OnDestroy() { if (!mResultUpLoad) { UpLoadScore(); } } } [Serializable] public class ExamProcessElement { [Sirenix.OdinInspector.ReadOnly] public int id; [Sirenix.OdinInspector.ReadOnly] public string elementDescript; [Sirenix.OdinInspector.ReadOnly] public bool finish = false; [Sirenix.OdinInspector.ReadOnly] public bool result; [GUIColor(0, 1, 0, 1)] public float scores; /// /// 错误原因 /// public string errorReason; /// /// 错误次数 /// public int faultCount; /// /// 错误截图 /// public List screenshotList = new List(); /// /// 操作时间 /// public DateTime operationTime; /// /// 步骤名称 /// public string stepName; /// /// 正在上传的任务 /// public List m_UpLoading = new List(); } }