InteractObjsComponent.cs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. using System.Collections.Generic;
  2. using System.Threading.Tasks;
  3. using UnityEngine;
  4. namespace WS
  5. {
  6. public class InteractObjsComponent : OperateComponent<InteractObjsData>
  7. {
  8. ///<summary>音频实例</summary>
  9. private VoiceEntity Voice;
  10. ///<summary>音效实例</summary>
  11. private VoiceEntity EffectVoice;
  12. ///<summary>交互的父物体</summary>
  13. private GameObject InteractObjParent;
  14. ///<summary>可交互物体</summary>
  15. private List<GameObject> InteractObjs = new List<GameObject>();
  16. ///<summary>动画组件</summary>
  17. private Animator anim;
  18. ///<summary>流程管理器</summary>
  19. private ProcessManager processManager;
  20. ///<summary>动画组件</summary>
  21. private AnimatorComponent animatorComponent;
  22. public override void Init()
  23. {
  24. processManager = GameManager.Instance.ProcessManager;
  25. InteractObjParent = GameObject.Find(OperateData.InteractName);
  26. if (!string.IsNullOrEmpty(OperateData.AnimationName))
  27. {
  28. anim = InteractObjParent.transform.GetComponent<Animator>();
  29. }
  30. for (int i = 0; i < InteractObjParent.transform.childCount; i++)
  31. {
  32. InteractObjs.Add(InteractObjParent.transform.GetChild(i).gameObject);
  33. }
  34. }
  35. public override void StartOperate()
  36. {
  37. SetInteractObjStatus(true);
  38. animatorComponent = AddComponent<AnimatorComponent>();
  39. if (!string.IsNullOrEmpty(OperateData.AnimationName))
  40. {
  41. animatorComponent.InitInteractAnim(
  42. OperateData.InteractName,
  43. OperateData.AnimationName
  44. );
  45. }
  46. if (OperateData.AnswerObjDataList.Count > 0)
  47. {
  48. animatorComponent.InitAnswerAnim(OperateData.AnswerObjDataList);
  49. }
  50. HighlightComponent.Instance.SetOperateObjLayer(InteractObjParent.transform, 7);
  51. switch (GameManager.Instance.Data.Pattern)
  52. {
  53. case PatternType.教学:
  54. Voice = VoiceManager.Instance.Play(VoiceType.Voice, OperateData.AudioName);
  55. HighlightComponent.Instance.SetOperateObjLayer(InteractObjParent.transform, 7);
  56. break;
  57. case PatternType.练习:
  58. Voice = VoiceManager.Instance.Play(VoiceType.Voice, OperateData.AudioName);
  59. break;
  60. case PatternType.考核:
  61. break;
  62. }
  63. }
  64. public override async void Update()
  65. {
  66. //if (VRInputComponent.Instance.OperateObject != null)
  67. //{
  68. // GameObject Obj = InteractObjs.Find((x) => { return x == VRInputComponent.Instance.OperateObject; });
  69. // if (VRInputComponent.Instance.OperateObject == Obj)
  70. // {
  71. // if (VRInputComponent.Instance.GetKeyDown(VRKey.扳机, VRInputComponent.Instance.GetSelectPointer.Hand))
  72. // {
  73. // VoiceManager.Instance.Play(VoiceType.Effects, OperateData.AudioEffect);
  74. // HighlightComponent.Instance.SetOperateObjLayer(InteractObjParent.transform, 6);
  75. // AnimatorComponent component = GetComponent<AnimatorComponent>();
  76. // await component.PlayAnimSerial(() =>
  77. // {
  78. // IsComplete = true;
  79. // });
  80. // SetInteractObjStatus(false);
  81. // }
  82. // }
  83. // else
  84. // {
  85. // if (VRInputComponent.Instance.GetKeyDown(VRKey.扳机, VRInputComponent.Instance.GetSelectPointer.Hand))
  86. // {
  87. // processManager.GetVTaskRecord(processManager.GetCurrentModule().VTaskId).IsError = true;
  88. // }
  89. // }
  90. //}
  91. }
  92. public override void Prompt() { }
  93. public override Task StartState()
  94. {
  95. InteractObjParent = GameObject.Find(OperateData.InteractName);
  96. HighlightComponent.Instance.SetOperateObjLayer(InteractObjParent.transform, 6);
  97. if (!string.IsNullOrEmpty(OperateData.AnimationName))
  98. {
  99. anim = InteractObjParent.transform.GetComponent<Animator>();
  100. anim.Play(OperateData.AnimationName, -1, 0f);
  101. anim.speed = 0f;
  102. SceneDataSaveComponent.Instance.RemoveSceneData(
  103. SceneComponent.Instance.ThisScene,
  104. OperateData.InteractName,
  105. OperateData.AnimationName
  106. );
  107. }
  108. for (int i = 0; i < OperateData.AnswerObjDataList.Count; i++)
  109. {
  110. GameObject answerObj = GameObject.Find(OperateData.AnswerObjDataList[i].AnswerName);
  111. string animName = OperateData.AnswerObjDataList[i].AnswerAnimName;
  112. if (!string.IsNullOrEmpty(animName))
  113. {
  114. Animator answerAnim = answerObj.transform.GetComponent<Animator>();
  115. answerAnim.Play(animName, -1, 0f);
  116. answerAnim.speed = 0f;
  117. SceneDataSaveComponent.Instance.RemoveSceneData(
  118. SceneComponent.Instance.ThisScene,
  119. OperateData.AnswerObjDataList[i].AnswerName,
  120. OperateData.AnswerObjDataList[i].AnswerAnimName
  121. );
  122. }
  123. }
  124. SetInteractObjStatus(false);
  125. IsComplete = false;
  126. return Task.CompletedTask;
  127. }
  128. public override Task EndState()
  129. {
  130. HighlightComponent.Instance.SetOperateObjLayer(InteractObjParent.transform, 6);
  131. if (!string.IsNullOrEmpty(OperateData.AnimationName))
  132. {
  133. anim.Play(OperateData.AnimationName, -1, 1);
  134. SceneDataSaveComponent.Instance.AddSceneData(
  135. SceneComponent.Instance.ThisScene,
  136. OperateData.InteractName,
  137. OperateData.AnimationName
  138. );
  139. }
  140. for (int i = 0; i < OperateData.AnswerObjDataList.Count; i++)
  141. {
  142. GameObject answerObj = GameObject.Find(OperateData.AnswerObjDataList[i].AnswerName);
  143. string animName = OperateData.AnswerObjDataList[i].AnswerAnimName;
  144. if (!string.IsNullOrEmpty(animName))
  145. {
  146. Animator answerAnim = answerObj.transform.GetComponent<Animator>();
  147. answerAnim.Play(animName, -1, 1f);
  148. SceneDataSaveComponent.Instance.RemoveSceneData(
  149. SceneComponent.Instance.ThisScene,
  150. OperateData.AnswerObjDataList[i].AnswerName,
  151. OperateData.AnswerObjDataList[i].AnswerAnimName
  152. );
  153. }
  154. }
  155. SetInteractObjStatus(false);
  156. IsComplete = true;
  157. return Task.CompletedTask;
  158. }
  159. /// <summary>
  160. /// 设置交互物体的交互和显示状态
  161. /// </summary>
  162. /// <param name="enabled"></param>
  163. private void SetInteractObjStatus(bool enabled)
  164. {
  165. if (OperateData.BeforeEnable)
  166. {
  167. Renderer[] renderers = InteractObjParent.GetComponentsInChildren<Renderer>();
  168. for (int i = 0; i < renderers.Length; i++)
  169. {
  170. renderers[i].enabled = enabled;
  171. }
  172. }
  173. if (OperateData.InteractInside)
  174. {
  175. Collider[] colliders = InteractObjParent.GetComponentsInChildren<Collider>();
  176. for (int i = 0; i < colliders.Length; i++)
  177. {
  178. colliders[i].enabled = enabled;
  179. }
  180. }
  181. }
  182. public override void Dispose()
  183. {
  184. base.Dispose();
  185. if (Voice != null)
  186. {
  187. if (!Voice.IsDisposed)
  188. VoiceManager.Instance.Stop(Voice);
  189. Voice = null;
  190. }
  191. if (EffectVoice != null)
  192. {
  193. if (!EffectVoice.IsDisposed)
  194. VoiceManager.Instance.Stop(EffectVoice);
  195. EffectVoice = null;
  196. }
  197. InteractObjParent = null;
  198. }
  199. }
  200. public class InteractObjsData
  201. {
  202. ///<summary>交互物体</summary>
  203. public string InteractName;
  204. ///<summary>动画名称</summary>
  205. public string AnimationName;
  206. ///<summary> 是否为临时物体 </summary>
  207. public bool BeforeEnable;
  208. ///<summary>响应物体列表</summary>
  209. public List<AnswerObjData> AnswerObjDataList = new List<AnswerObjData>();
  210. ///<summary>音频名称</summary>
  211. public string AudioName;
  212. ///<summary>交互音效</summary>
  213. public string AudioEffect;
  214. ///<summary> 是否有内部交互物体 </summary>
  215. public bool InteractInside;
  216. ///<summary> 同时播放动画 </summary>
  217. public bool IsSimulAni;
  218. }
  219. }