HandHintManager.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. using ChivaXR.Op;
  4. using ChivaXR.VR;
  5. using ChivaXR;
  6. using VRTK;
  7. using System;
  8. using UnityEngine.SceneManagement;
  9. using QFramework;
  10. public class HandHintManager : MonoBehaviour
  11. {
  12. public List<OperationDataBase> list;
  13. public List<VRTK_InteractableObject> toolList;
  14. public Transform hand;
  15. public List<GameObject> opHintGos = new List<GameObject>();
  16. public VRTK_ControllerEvents leftController;
  17. public VRTK_ControllerEvents rightController;
  18. private InteractableHandHint handHint;
  19. private int stepID;
  20. /// <summary>
  21. /// 记录构建场景信息
  22. /// </summary>
  23. private Dictionary<int, string> m_RecordBuildSceneInfo = new Dictionary<int, string>();
  24. void Start()
  25. {
  26. handHint = GetComponent<InteractableHandHint>();
  27. ProcessManagement.Instance.EnterProcessEvent += EnterProcessEvent;
  28. ProcessManagement.Instance.processElementDisActiveEvent += PrcessElementDisActiveEvent;
  29. }
  30. private void PrcessElementDisActiveEvent(ProcessElement processElement)
  31. {
  32. if (processElement == ProcessManagement.Instance.processes[ProcessManagement.Instance.processes.Count - 1])
  33. {
  34. if (ProcessManagement.Instance.processes.Count - 1 == stepID)
  35. {
  36. LearningUIController.Instance.SetText("点击扳机返回主常见功能");
  37. if (leftController == null && rightController == null) return;
  38. leftController.TriggerPressed += TriggerPress;
  39. rightController.TriggerPressed += TriggerPress;
  40. }
  41. }
  42. }
  43. private void OnDestory()
  44. {
  45. leftController.TriggerPressed -= TriggerPress;
  46. rightController.TriggerPressed -= TriggerPress;
  47. }
  48. private void TriggerPress(object sender, ControllerInteractionEventArgs e)
  49. {
  50. }
  51. private string GetBuildSceneName()
  52. {
  53. string sceneName = string.Empty;
  54. var m_BuildSettingsNumber = SceneManager.sceneCountInBuildSettings;
  55. for (int i = 0; i < m_BuildSettingsNumber; i++)
  56. {
  57. if (!m_RecordBuildSceneInfo.ContainsKey(i))
  58. {
  59. string buildPath = SceneUtility.GetScenePathByBuildIndex(i);
  60. if (!string.IsNullOrEmpty(buildPath))
  61. {
  62. //只获取场景名称
  63. string temp = buildPath.Split('/')[buildPath.Split('/').Length - 1].Split('.')[0];
  64. m_RecordBuildSceneInfo.Add(i, temp);
  65. }
  66. }
  67. }
  68. foreach (var item in m_RecordBuildSceneInfo.Values)
  69. {
  70. string[] temps = item.Split('_');
  71. if (temps[temps.Length - 1].Equals("Practice"))
  72. {
  73. sceneName = item;
  74. }
  75. }
  76. return sceneName;
  77. }
  78. private void EnterProcessEvent(int stepID)
  79. {
  80. this.stepID = stepID;
  81. EnterProcess();
  82. }
  83. private void EnterProcess()
  84. {
  85. var triggerElement = list[stepID].GetComponent<OpTrigger_VRToolTriggerElement>();
  86. var objElement = list[stepID].GetComponent<OpTrigger_VRObjTriggerElement>();
  87. for (int i = 0; i < toolList.Count; i++)
  88. {
  89. if (triggerElement)//扳机触发
  90. {
  91. LearningUIController.Instance.SetText(triggerElement.operationDescription);
  92. if (toolList[i].GetComponent<CVR_ToolTypeFlags>().CVR_ToolType == triggerElement.triggerElements[0].toolType)
  93. {
  94. handHint.InitInteractable(toolList[i], triggerElement.triggerElements[0].transform);
  95. }
  96. }
  97. else if (objElement)//直接触发
  98. {
  99. handHint.InitInteractable(objElement.triggerObjs[0].GetComponent<CVR_InteractableVRTK>(), objElement.triggerObjs[0].transform, false);
  100. LearningUIController.Instance.SetText(objElement.operationDescription);
  101. }
  102. }
  103. }
  104. /// <summary>
  105. /// 工具提示图标
  106. /// </summary>
  107. public void HandHintState(bool state, Vector3 pos)
  108. {
  109. //hand.gameObject.SetActive(state);
  110. //hand.position = new Vector3(pos.x, pos.y + 0.05f, pos.z - 0.05f);
  111. }
  112. /// <summary>
  113. /// 操作物提示图标
  114. /// </summary>
  115. public void OperationHintState(Transform go, bool state)
  116. {
  117. if (go.Find("GameObject"))
  118. {
  119. var temp = go.Find("GameObject").gameObject;
  120. temp.SetActive(state);
  121. }
  122. }
  123. }
  124. public enum OpHintType
  125. {
  126. mabu,
  127. jiaodai,
  128. jiareqi
  129. }