|
|
@@ -1,264 +1,268 @@
|
|
|
-using ChivaXR;
|
|
|
-using Sirenix.OdinInspector;
|
|
|
-using System.Collections;
|
|
|
-using System.Collections.Generic;
|
|
|
-using UnityEngine;
|
|
|
-using ChivaXR.Op;
|
|
|
-using System.Linq;
|
|
|
-using UnityEngine.Events;
|
|
|
-using QFramework;
|
|
|
-
|
|
|
-public class OperationListener : MonoBehaviour
|
|
|
-{
|
|
|
- public List<OpDataInfo> opDataInfos = new List<OpDataInfo>();
|
|
|
-
|
|
|
- public void Awake()
|
|
|
- {
|
|
|
- foreach (var item in opDataInfos)
|
|
|
- {
|
|
|
- ///无步骤控制
|
|
|
- item.OpDataActive(0);
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-[System.Serializable]
|
|
|
-public class OpDataInfo
|
|
|
-{
|
|
|
- [HideInInspector]
|
|
|
- public string operationDataName;
|
|
|
-
|
|
|
- [HideInInspector]
|
|
|
- public int ActiveStepID;
|
|
|
- [ShowInInspector]
|
|
|
- [PropertyOrder(-1)]
|
|
|
- [ValueDropdown("GetAllOperationDataNames", IsUniqueList = true)]
|
|
|
- public string OperationDataName
|
|
|
- {
|
|
|
- get { return operationDataName; }
|
|
|
- set
|
|
|
- {
|
|
|
- if (operationDataName != value)
|
|
|
- {
|
|
|
- operationDataName = value;
|
|
|
- OnOperationDataNameChanged();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- [HorizontalGroup("ValueCondition")]
|
|
|
- [LabelText("监听条件")]
|
|
|
- public ValueCondition condition = ValueCondition.equal;
|
|
|
-
|
|
|
- public OperationDataType operationDataType;
|
|
|
-
|
|
|
- [HideLabel]
|
|
|
- [HorizontalGroup("ValueCondition")]
|
|
|
- public float targetValue = 1;
|
|
|
-
|
|
|
- [HideLabel]
|
|
|
- [ShowIf("RangeCondition")]
|
|
|
- [HorizontalGroup("ValueCondition")]
|
|
|
- public float maxValue;
|
|
|
-
|
|
|
- public CVR_OpDataInfoEventHandle OperationDataFinished;
|
|
|
-
|
|
|
- [HideInInspector]
|
|
|
- public bool isOpFinished = false;
|
|
|
- [HideInInspector]
|
|
|
- public bool isQuestionFinished = false;
|
|
|
- [HideInInspector]
|
|
|
- public QuestionInfo m_QuesionInfo;
|
|
|
-
|
|
|
- public bool RangeCondition()
|
|
|
- {
|
|
|
- return condition == ValueCondition.range;
|
|
|
- }
|
|
|
-
|
|
|
- public void OnOperationDataNameChanged()
|
|
|
- {
|
|
|
- OperationDataBase item = OperationManager.Instance.GetOpData(operationDataName);
|
|
|
- if (item)
|
|
|
- {
|
|
|
- operationDataType = item.OperationType;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private static IEnumerable GetAllOperationDataNames()
|
|
|
- {
|
|
|
- return OperationManager.Instance.operationDataContainers.Select(s => new ValueDropdownItem(s.OpDataName, s.OpDataName));
|
|
|
- }
|
|
|
-
|
|
|
- [LabelText("执行动画")]
|
|
|
- [ValueDropdown("GetAllAnimationNames", IsUniqueList = true)]
|
|
|
- public string aniDataName;
|
|
|
-
|
|
|
- private static IEnumerable GetAllAnimationNames()
|
|
|
- {
|
|
|
- return AnimationManager.Instance.animationDatas.Select(s => new ValueDropdownItem(s.AniDataName, s.AniDataName));
|
|
|
- }
|
|
|
-
|
|
|
- public void OpDataActive(int activeStepID)
|
|
|
- {
|
|
|
- ActiveStepID = activeStepID;
|
|
|
- InitQuestion();
|
|
|
- OpDataInfoManager.Instance.RegisterOpSystem(this);
|
|
|
-
|
|
|
- OperationDataBase itemOpData = OperationManager.Instance.GetOpData(OperationDataName);
|
|
|
-
|
|
|
- if (!itemOpData)
|
|
|
- {
|
|
|
- Debug.LogError("无该操作名称:" + operationDataName);
|
|
|
- }
|
|
|
- Debug.Log("激活操作点:" + operationDataName);
|
|
|
- itemOpData.OperationStatus = OperationDataStatus.Listening;
|
|
|
- itemOpData.OperationValueChanged += Trigger;
|
|
|
- }
|
|
|
-
|
|
|
- public void OpDataDisActive()
|
|
|
- {
|
|
|
- OperationDataBase itemOpData = OperationManager.Instance.GetOpData(OperationDataName);
|
|
|
-
|
|
|
- if (!itemOpData)
|
|
|
- {
|
|
|
- Debug.LogError("无该操作名称");
|
|
|
- }
|
|
|
- itemOpData.OperationStatus = OperationDataStatus.InActive;
|
|
|
- itemOpData.OperationValueChanged -= Trigger;
|
|
|
- }
|
|
|
-
|
|
|
- public void Trigger(object sender, OperationEventArgs e)
|
|
|
- {
|
|
|
- bool finished = false;
|
|
|
- switch (condition)
|
|
|
- {
|
|
|
- case ValueCondition.bigger:
|
|
|
- finished = (e.opData.OpValue > targetValue);
|
|
|
- break;
|
|
|
- case ValueCondition.equal:
|
|
|
- finished = (targetValue == e.opData.OpValue);
|
|
|
- break;
|
|
|
- case ValueCondition.less:
|
|
|
- finished = (e.opData.OpValue < targetValue);
|
|
|
- break;
|
|
|
- case ValueCondition.unequal:
|
|
|
- finished = (targetValue != e.opData.OpValue);
|
|
|
- break;
|
|
|
- case ValueCondition.range:
|
|
|
- finished = (e.opData.OpValue >= targetValue && e.opData.OpValue <= maxValue);
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- if (finished)
|
|
|
- {
|
|
|
- //操作时停止语音播放
|
|
|
- SoundManager.Instance.StopBg();
|
|
|
- OpenQuestion();
|
|
|
- }
|
|
|
-
|
|
|
- if (isQuestionFinished)
|
|
|
- {
|
|
|
- PlayAnimation();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private void PlayAnimation()
|
|
|
- {
|
|
|
- if (!string.IsNullOrEmpty(aniDataName))
|
|
|
- {
|
|
|
- AnimationManager.Instance.PlayAniData(aniDataName, OnOpListenerFinished);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- OperationDataFinished?.Invoke(this, new ChivaVR_OpDataInfoEventArgs() { opDataInfo = this });
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// 动画播放完成
|
|
|
- /// </summary>
|
|
|
- public void OnOpListenerFinished()
|
|
|
- {
|
|
|
- OperationDataBase itemOpData = GetCurrentOpData();
|
|
|
- itemOpData.OperationStatus = OperationDataStatus.InActive;
|
|
|
- itemOpData.OperationValueChanged -= Trigger;
|
|
|
- OperationDataFinished?.Invoke(this, new ChivaVR_OpDataInfoEventArgs() { opDataInfo = this });
|
|
|
- }
|
|
|
-
|
|
|
- public void InitQuestion()
|
|
|
- {
|
|
|
- if (ActiveStepID == 0) return;
|
|
|
- isQuestionFinished = false;
|
|
|
- m_QuesionInfo = OperateSetting.Instance.GetQuestionInfo(ActiveStepID);
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
- /// 打开题库
|
|
|
- /// </summary>
|
|
|
- public void OpenQuestion()
|
|
|
- {
|
|
|
- if (m_QuesionInfo == null) isQuestionFinished = true;
|
|
|
- else
|
|
|
- {
|
|
|
- if (m_QuesionInfo.QuestionType == "图文")
|
|
|
- {
|
|
|
- UIKit.OpenPanel<ImageAndTextNamePanel>(new ImageAndTextNamePanelData() { questionInfo = m_QuesionInfo, answerCallBack = AnswerCallBack });
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- UIKit.OpenPanel<QuestionPanel>(new QuestionPanelData() { questionInfo = m_QuesionInfo, answerCallBack = AnswerCallBack });
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- /// <summary>
|
|
|
- /// 关闭题库
|
|
|
- /// </summary>
|
|
|
- public void CloseQuestion()
|
|
|
- {
|
|
|
- if (UIKit.GetPanel<ImageAndTextNamePanel>()) UIKit.ClosePanel<ImageAndTextNamePanel>();
|
|
|
-
|
|
|
- if (UIKit.GetPanel<QuestionPanel>()) UIKit.ClosePanel<QuestionPanel>();
|
|
|
- }
|
|
|
- public void AnswerCallBack(int stepID,bool result)
|
|
|
- {
|
|
|
- if (OperateSetting.Instance.m_CurrentOperationMode == OperationMode.Exam
|
|
|
- || OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeExam)
|
|
|
- {
|
|
|
- if (!result)
|
|
|
- {
|
|
|
- ExamManagerForPC.instance.RecordFault(stepID, ErrorReason.AnswerWrong);
|
|
|
- }
|
|
|
- }
|
|
|
- isQuestionFinished = true;
|
|
|
-
|
|
|
- PlayAnimation();
|
|
|
- }
|
|
|
-
|
|
|
- public OperationDataBase GetCurrentOpData()
|
|
|
- {
|
|
|
- return OperationManager.Instance.GetOpData(OperationDataName);
|
|
|
- }
|
|
|
- public AniData GetCurrentAniData()
|
|
|
- {
|
|
|
- return AnimationManager.Instance.GetAniData(aniDataName);
|
|
|
- }
|
|
|
- public void OpenHit()
|
|
|
- {
|
|
|
- OperationDataBase itemOpData = OperationManager.Instance.GetOpData(OperationDataName);
|
|
|
- if (itemOpData != null) itemOpData.OpenHint();
|
|
|
- }
|
|
|
-
|
|
|
- public void CloseHit()
|
|
|
- {
|
|
|
- OperationDataBase itemOpData = OperationManager.Instance.GetOpData(OperationDataName);
|
|
|
- if (itemOpData != null) itemOpData.CloseHint();
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-public enum ValueCondition
|
|
|
-{
|
|
|
- bigger,
|
|
|
- equal,
|
|
|
- less,
|
|
|
- unequal,
|
|
|
- range
|
|
|
+using ChivaXR;
|
|
|
+using Sirenix.OdinInspector;
|
|
|
+using System.Collections;
|
|
|
+using System.Collections.Generic;
|
|
|
+using UnityEngine;
|
|
|
+using ChivaXR.Op;
|
|
|
+using System.Linq;
|
|
|
+using UnityEngine.Events;
|
|
|
+using QFramework;
|
|
|
+
|
|
|
+public class OperationListener : MonoBehaviour
|
|
|
+{
|
|
|
+ public List<OpDataInfo> opDataInfos = new List<OpDataInfo>();
|
|
|
+
|
|
|
+ public void Awake()
|
|
|
+ {
|
|
|
+ foreach (var item in opDataInfos)
|
|
|
+ {
|
|
|
+ ///无步骤控制
|
|
|
+ item.OpDataActive(0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+[System.Serializable]
|
|
|
+public class OpDataInfo
|
|
|
+{
|
|
|
+ [HideInInspector]
|
|
|
+ public string operationDataName;
|
|
|
+
|
|
|
+ [HideInInspector]
|
|
|
+ public int ActiveStepID;
|
|
|
+ [ShowInInspector]
|
|
|
+ [PropertyOrder(-1)]
|
|
|
+ [ValueDropdown("GetAllOperationDataNames", IsUniqueList = true)]
|
|
|
+ public string OperationDataName
|
|
|
+ {
|
|
|
+ get { return operationDataName; }
|
|
|
+ set
|
|
|
+ {
|
|
|
+ if (operationDataName != value)
|
|
|
+ {
|
|
|
+ operationDataName = value;
|
|
|
+ OnOperationDataNameChanged();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ [HorizontalGroup("ValueCondition")]
|
|
|
+ [LabelText("监听条件")]
|
|
|
+ public ValueCondition condition = ValueCondition.equal;
|
|
|
+
|
|
|
+ public OperationDataType operationDataType;
|
|
|
+
|
|
|
+ [HideLabel]
|
|
|
+ [HorizontalGroup("ValueCondition")]
|
|
|
+ public float targetValue = 1;
|
|
|
+
|
|
|
+ [HideLabel]
|
|
|
+ [ShowIf("RangeCondition")]
|
|
|
+ [HorizontalGroup("ValueCondition")]
|
|
|
+ public float maxValue;
|
|
|
+
|
|
|
+ public CVR_OpDataInfoEventHandle OperationDataFinished;
|
|
|
+
|
|
|
+ [HideInInspector]
|
|
|
+ public bool isOpFinished = false;
|
|
|
+ [HideInInspector]
|
|
|
+ public bool isQuestionFinished = false;
|
|
|
+ [HideInInspector]
|
|
|
+ public QuestionInfo m_QuesionInfo;
|
|
|
+
|
|
|
+ public bool RangeCondition()
|
|
|
+ {
|
|
|
+ return condition == ValueCondition.range;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void OnOperationDataNameChanged()
|
|
|
+ {
|
|
|
+ OperationDataBase item = OperationManager.Instance.GetOpData(operationDataName);
|
|
|
+ if (item)
|
|
|
+ {
|
|
|
+ operationDataType = item.OperationType;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static IEnumerable GetAllOperationDataNames()
|
|
|
+ {
|
|
|
+ return OperationManager.Instance.operationDataContainers.Select(s => new ValueDropdownItem(s.OpDataName, s.OpDataName));
|
|
|
+ }
|
|
|
+
|
|
|
+ [LabelText("执行动画")]
|
|
|
+ [ValueDropdown("GetAllAnimationNames", IsUniqueList = true)]
|
|
|
+ public string aniDataName;
|
|
|
+
|
|
|
+ private static IEnumerable GetAllAnimationNames()
|
|
|
+ {
|
|
|
+ return AnimationManager.Instance.animationDatas.Select(s => new ValueDropdownItem(s.AniDataName, s.AniDataName));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void OpDataActive(int activeStepID)
|
|
|
+ {
|
|
|
+ ActiveStepID = activeStepID;
|
|
|
+ InitQuestion();
|
|
|
+ OpDataInfoManager.Instance.RegisterOpSystem(this);
|
|
|
+
|
|
|
+ OperationDataBase itemOpData = OperationManager.Instance.GetOpData(OperationDataName);
|
|
|
+
|
|
|
+ if (!itemOpData)
|
|
|
+ {
|
|
|
+ Debug.LogError("无该操作名称:" + operationDataName);
|
|
|
+ }
|
|
|
+ Debug.Log("激活操作点:" + operationDataName);
|
|
|
+ itemOpData.OperationStatus = OperationDataStatus.Listening;
|
|
|
+ itemOpData.OperationValueChanged += Trigger;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void OpDataDisActive()
|
|
|
+ {
|
|
|
+ OperationDataBase itemOpData = OperationManager.Instance.GetOpData(OperationDataName);
|
|
|
+
|
|
|
+ if (!itemOpData)
|
|
|
+ {
|
|
|
+ Debug.LogError("无该操作名称");
|
|
|
+ }
|
|
|
+ itemOpData.OperationStatus = OperationDataStatus.InActive;
|
|
|
+ itemOpData.OperationValueChanged -= Trigger;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void Trigger(object sender, OperationEventArgs e)
|
|
|
+ {
|
|
|
+ bool finished = false;
|
|
|
+ switch (condition)
|
|
|
+ {
|
|
|
+ case ValueCondition.bigger:
|
|
|
+ finished = (e.opData.OpValue > targetValue);
|
|
|
+ break;
|
|
|
+ case ValueCondition.equal:
|
|
|
+ finished = (targetValue == e.opData.OpValue);
|
|
|
+ break;
|
|
|
+ case ValueCondition.less:
|
|
|
+ finished = (e.opData.OpValue < targetValue);
|
|
|
+ break;
|
|
|
+ case ValueCondition.unequal:
|
|
|
+ finished = (targetValue != e.opData.OpValue);
|
|
|
+ break;
|
|
|
+ case ValueCondition.range:
|
|
|
+ finished = (e.opData.OpValue >= targetValue && e.opData.OpValue <= maxValue);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (finished)
|
|
|
+ {
|
|
|
+ //操作时停止语音播放
|
|
|
+ SoundManager.Instance.StopBg();
|
|
|
+
|
|
|
+ if (OperateSetting.Instance.m_CurrentOperationMode != OperationMode.Learn)
|
|
|
+ {
|
|
|
+ OpenQuestion();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isQuestionFinished || OperateSetting.Instance.m_CurrentOperationMode == OperationMode.Learn)
|
|
|
+ {
|
|
|
+ PlayAnimation();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void PlayAnimation()
|
|
|
+ {
|
|
|
+ if (!string.IsNullOrEmpty(aniDataName))
|
|
|
+ {
|
|
|
+ AnimationManager.Instance.PlayAniData(aniDataName, OnOpListenerFinished);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ OperationDataFinished?.Invoke(this, new ChivaVR_OpDataInfoEventArgs() { opDataInfo = this });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 动画播放完成
|
|
|
+ /// </summary>
|
|
|
+ public void OnOpListenerFinished()
|
|
|
+ {
|
|
|
+ OperationDataBase itemOpData = GetCurrentOpData();
|
|
|
+ itemOpData.OperationStatus = OperationDataStatus.InActive;
|
|
|
+ itemOpData.OperationValueChanged -= Trigger;
|
|
|
+ OperationDataFinished?.Invoke(this, new ChivaVR_OpDataInfoEventArgs() { opDataInfo = this });
|
|
|
+ }
|
|
|
+
|
|
|
+ public void InitQuestion()
|
|
|
+ {
|
|
|
+ if (ActiveStepID == 0) return;
|
|
|
+ isQuestionFinished = false;
|
|
|
+ m_QuesionInfo = OperateSetting.Instance.GetQuestionInfo(ActiveStepID);
|
|
|
+ }
|
|
|
+ /// <summary>
|
|
|
+ /// 打开题库
|
|
|
+ /// </summary>
|
|
|
+ public void OpenQuestion()
|
|
|
+ {
|
|
|
+ if (m_QuesionInfo == null) isQuestionFinished = true;
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (m_QuesionInfo.QuestionType == "图文")
|
|
|
+ {
|
|
|
+ UIKit.OpenPanel<ImageAndTextNamePanel>(new ImageAndTextNamePanelData() { questionInfo = m_QuesionInfo, answerCallBack = AnswerCallBack });
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ UIKit.OpenPanel<QuestionPanel>(new QuestionPanelData() { questionInfo = m_QuesionInfo, answerCallBack = AnswerCallBack });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /// <summary>
|
|
|
+ /// 关闭题库
|
|
|
+ /// </summary>
|
|
|
+ public void CloseQuestion()
|
|
|
+ {
|
|
|
+ if (UIKit.GetPanel<ImageAndTextNamePanel>()) UIKit.ClosePanel<ImageAndTextNamePanel>();
|
|
|
+
|
|
|
+ if (UIKit.GetPanel<QuestionPanel>()) UIKit.ClosePanel<QuestionPanel>();
|
|
|
+ }
|
|
|
+ public void AnswerCallBack(int stepID, bool result)
|
|
|
+ {
|
|
|
+ if (OperateSetting.Instance.m_CurrentOperationMode == OperationMode.Exam
|
|
|
+ || OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeExam)
|
|
|
+ {
|
|
|
+ if (!result)
|
|
|
+ {
|
|
|
+ ExamManagerForPC.instance.RecordFault(stepID, ErrorReason.AnswerWrong);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ isQuestionFinished = true;
|
|
|
+
|
|
|
+ PlayAnimation();
|
|
|
+ }
|
|
|
+
|
|
|
+ public OperationDataBase GetCurrentOpData()
|
|
|
+ {
|
|
|
+ return OperationManager.Instance.GetOpData(OperationDataName);
|
|
|
+ }
|
|
|
+ public AniData GetCurrentAniData()
|
|
|
+ {
|
|
|
+ return AnimationManager.Instance.GetAniData(aniDataName);
|
|
|
+ }
|
|
|
+ public void OpenHit()
|
|
|
+ {
|
|
|
+ OperationDataBase itemOpData = OperationManager.Instance.GetOpData(OperationDataName);
|
|
|
+ if (itemOpData != null) itemOpData.OpenHint();
|
|
|
+ }
|
|
|
+
|
|
|
+ public void CloseHit()
|
|
|
+ {
|
|
|
+ OperationDataBase itemOpData = OperationManager.Instance.GetOpData(OperationDataName);
|
|
|
+ if (itemOpData != null) itemOpData.CloseHint();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+public enum ValueCondition
|
|
|
+{
|
|
|
+ bigger,
|
|
|
+ equal,
|
|
|
+ less,
|
|
|
+ unequal,
|
|
|
+ range
|
|
|
}
|