InteractComponent.cs 9.8 KB

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