InteractAnimsComponent.cs 10 KB

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