using Cysharp.Threading.Tasks; using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; using WS; ///交互 public class InteractAnimsComponent : OperateComponent { ///音频实例 private VoiceEntity Voice; ///正确音效 private string successVoiceName = "T"; ///错误音效 private string failVoiceName = "F"; ///正确音效实例 private VoiceEntity successVoice; ///错误音效实例 private VoiceEntity failVoice; ///交互物体 private GameObject InteractObj; ///动画组件 private Animator anim; ///流程管理器 private ProcessManager processManager; ///动画组件 private AnimatorComponent animatorComponent; ///正在播放交互动画 private bool onPlayeAnim = false; public override void Init() { processManager = GameManager.Instance.ProcessManager; InteractObj = GameObject.Find(OperateData.InteractName); if (!string.IsNullOrEmpty(OperateData.AnimationName)) { anim = InteractObj.transform.GetComponent(); } } public override void StartOperate() { SetInteractObjStatus(true); animatorComponent = AddComponent(); if (!string.IsNullOrEmpty(OperateData.AnimationName)) { animatorComponent.InitInteractAnim(OperateData.InteractName, OperateData.AnimationName); } if (OperateData.AnswerObjDataList.Count > 0) { animatorComponent.InitAnswerAnim(OperateData.AnswerObjDataList); } switch (GameManager.Instance.Data.Pattern) { case PatternType.教学: Voice = VoiceManager.Instance.Play(VoiceType.Voice, OperateData.AudioName); HighlightComponent.Instance.SetOperateObjLayer(InteractObj.transform, 7); break; case PatternType.练习: Voice = VoiceManager.Instance.Play(VoiceType.Voice, OperateData.AudioName); break; case PatternType.考核: Voice = VoiceManager.Instance.Play(VoiceType.Voice, OperateData.AudioName); break; } } public override async void Update() { //if (VRInputComponent.Instance.OperateObject != null) //{ // if (VRInputComponent.Instance.OperateObject == InteractObj) // { // if (VRInputComponent.Instance.GetKeyDown(VRKey.扳机, VRInputComponent.Instance.GetSelectPointer.Hand) && !onPlayeAnim) // { // VoiceManager.Instance.Play(VoiceType.Effects, OperateData.AudioEffect); // onPlayeAnim = true; // HighlightComponent.Instance.SetOperateObjLayer(InteractObj.transform, 6); // AnimatorComponent component = GetComponent(); // if(OperateData.IsSimulAni) // { // component.PlayAnimParallel(OnComplete); // } // else // { // await component.PlayAnimSerial(OnComplete); // } // SetInteractObjStatus(false); // } // } // else // { // if (VRInputComponent.Instance.GetKeyDown(VRKey.扳机, VRInputComponent.Instance.GetSelectPointer.Hand)) // { // if(!onPlayeAnim) // { // processManager.GetVTaskRecord(processManager.GetCurrentModule().VTaskId).IsError = true; // failVoice = VoiceManager.Instance.Play(VoiceType.Voice, failVoiceName); // await FacadeComponent.Instance.GetController().ResultHint(false); // } // else // { // FacadeComponent.Instance.GetController().WarningHint(); // } // } // } //} } /// /// 设置交互物体的交互和显示状态 /// /// private void SetInteractObjStatus(bool enabled) { if (OperateData.BeforeEnable) { Renderer[] renderers = InteractObj.GetComponentsInChildren(); for (int i = 0; i < renderers.Length; i++) { renderers[i].enabled = enabled; } InteractObj.GetComponent().enabled = enabled; } if (OperateData.InteractInside) { InteractObj.GetComponent().enabled = enabled; } } public async void OnComplete() { if ( GameManager.Instance.Data.Pattern != PatternType.教学 && GameManager.Instance.Data.Pattern != PatternType.引导 ) { VoiceManager.Instance.Play(VoiceType.Tips, successVoiceName); await FacadeComponent.Instance.GetController().ResultHint(true); } HighlightComponent.Instance.SetOperateObjLayer(InteractObj.transform, 6); IsComplete = true; } public override void Prompt() { HighlightComponent.Instance.SetOperateObjLayer(InteractObj.transform, 7); } public override Task StartState() { //Log.LogDebug("切换到初始状态"+GameManager.Instance.ProcessManager.GetCurrentModule().VTaskId); InteractObj = GameObject.Find(OperateData.InteractName); HighlightComponent.Instance.SetOperateObjLayer(InteractObj.transform, 6); if (!string.IsNullOrEmpty(OperateData.AnimationName)) { anim = InteractObj.transform.GetComponent(); anim.Play(OperateData.AnimationName, -1, 0f); anim.speed = 0f; SceneDataSaveComponent.Instance.RemoveSceneData( SceneComponent.Instance.ThisScene, OperateData.InteractName, OperateData.AnimationName ); } for (int i = 0; i < OperateData.AnswerObjDataList.Count; i++) { GameObject answerObj = GameObject.Find(OperateData.AnswerObjDataList[i].AnswerName); string animName = OperateData.AnswerObjDataList[i].AnswerAnimName; if (!string.IsNullOrEmpty(animName)) { Animator answerAnim = answerObj.transform.GetComponent(); answerAnim.Play(animName, -1, 0f); answerAnim.speed = 0f; SceneDataSaveComponent.Instance.RemoveSceneData( SceneComponent.Instance.ThisScene, OperateData.AnswerObjDataList[i].AnswerName, OperateData.AnswerObjDataList[i].AnswerAnimName ); } } SetInteractObjStatus(false); IsComplete = false; return Task.CompletedTask; } public override Task EndState() { //Log.LogDebug("切换到结束状态"); HighlightComponent.Instance.SetOperateObjLayer(InteractObj.transform, 6); if (!string.IsNullOrEmpty(OperateData.AnimationName)) { anim.Play(OperateData.AnimationName, -1, 1); SceneDataSaveComponent.Instance.AddSceneData( SceneComponent.Instance.ThisScene, OperateData.InteractName, OperateData.AnimationName ); } for (int i = 0; i < OperateData.AnswerObjDataList.Count; i++) { GameObject answerObj = GameObject.Find(OperateData.AnswerObjDataList[i].AnswerName); string animName = OperateData.AnswerObjDataList[i].AnswerAnimName; if (!string.IsNullOrEmpty(animName)) { Animator answerAnim = answerObj.transform.GetComponent(); answerAnim.Play(animName, -1, 1f); SceneDataSaveComponent.Instance.AddSceneData( SceneComponent.Instance.ThisScene, OperateData.AnswerObjDataList[i].AnswerName, OperateData.AnswerObjDataList[i].AnswerAnimName ); } } SetInteractObjStatus(false); IsComplete = true; return Task.CompletedTask; } public override void Dispose() { base.Dispose(); if (Voice != null) { if (!Voice.IsDisposed) VoiceManager.Instance.Stop(Voice); Voice = null; } if (failVoice != null) { if (!failVoice.IsDisposed) VoiceManager.Instance.Stop(failVoice); failVoice = null; } if (successVoice != null) { if (!successVoice.IsDisposed) VoiceManager.Instance.Stop(successVoice); successVoice = null; } if (GameManager.Instance.Data.Pattern == PatternType.引导) { SceneDataSaveComponent.Instance.RemoveSceneData( SceneComponent.Instance.ThisScene, OperateData.InteractName, OperateData.AnimationName ); } InteractObj = null; onPlayeAnim = false; } } ///交互数据 public class InteractAnimsData { ///交互物体 public string InteractName; ///动画名称 public string AnimationName; ///响应物体列表 public List AnswerObjDataList = new List(); ///音频名称 public string AudioName; ///交互音效 public string AudioEffect; /// 是否为临时物体 public bool BeforeEnable; /// 是否有内部交互物体 public bool InteractInside; /// 同时播放动画 public bool IsSimulAni; } public class AnswerObjData { ///响应物体 public string AnswerName = null; ///响应动画名称 public string AnswerAnimName = null; }