using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; namespace WS { public class InteractObjsComponent : OperateComponent { ///音频实例 private VoiceEntity Voice; ///音效实例 private VoiceEntity EffectVoice; ///交互的父物体 private GameObject InteractObjParent; ///可交互物体 private List InteractObjs = new List(); ///动画组件 private Animator anim; ///流程管理器 private ProcessManager processManager; ///动画组件 private AnimatorComponent animatorComponent; public override void Init() { processManager = GameManager.Instance.ProcessManager; InteractObjParent = GameObject.Find(OperateData.InteractName); if (!string.IsNullOrEmpty(OperateData.AnimationName)) { anim = InteractObjParent.transform.GetComponent(); } for (int i = 0; i < InteractObjParent.transform.childCount; i++) { InteractObjs.Add(InteractObjParent.transform.GetChild(i).gameObject); } } 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); } HighlightComponent.Instance.SetOperateObjLayer(InteractObjParent.transform, 7); switch (GameManager.Instance.Data.Pattern) { case PatternType.教学: Voice = VoiceManager.Instance.Play(VoiceType.Voice, OperateData.AudioName); HighlightComponent.Instance.SetOperateObjLayer(InteractObjParent.transform, 7); break; case PatternType.练习: Voice = VoiceManager.Instance.Play(VoiceType.Voice, OperateData.AudioName); break; case PatternType.考核: break; } } public override async void Update() { //if (VRInputComponent.Instance.OperateObject != null) //{ // GameObject Obj = InteractObjs.Find((x) => { return x == VRInputComponent.Instance.OperateObject; }); // if (VRInputComponent.Instance.OperateObject == Obj) // { // if (VRInputComponent.Instance.GetKeyDown(VRKey.扳机, VRInputComponent.Instance.GetSelectPointer.Hand)) // { // VoiceManager.Instance.Play(VoiceType.Effects, OperateData.AudioEffect); // HighlightComponent.Instance.SetOperateObjLayer(InteractObjParent.transform, 6); // AnimatorComponent component = GetComponent(); // await component.PlayAnimSerial(() => // { // IsComplete = true; // }); // SetInteractObjStatus(false); // } // } // else // { // if (VRInputComponent.Instance.GetKeyDown(VRKey.扳机, VRInputComponent.Instance.GetSelectPointer.Hand)) // { // processManager.GetVTaskRecord(processManager.GetCurrentModule().VTaskId).IsError = true; // } // } //} } public override void Prompt() { } public override Task StartState() { InteractObjParent = GameObject.Find(OperateData.InteractName); HighlightComponent.Instance.SetOperateObjLayer(InteractObjParent.transform, 6); if (!string.IsNullOrEmpty(OperateData.AnimationName)) { anim = InteractObjParent.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() { HighlightComponent.Instance.SetOperateObjLayer(InteractObjParent.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.RemoveSceneData( SceneComponent.Instance.ThisScene, OperateData.AnswerObjDataList[i].AnswerName, OperateData.AnswerObjDataList[i].AnswerAnimName ); } } SetInteractObjStatus(false); IsComplete = true; return Task.CompletedTask; } /// /// 设置交互物体的交互和显示状态 /// /// private void SetInteractObjStatus(bool enabled) { if (OperateData.BeforeEnable) { Renderer[] renderers = InteractObjParent.GetComponentsInChildren(); for (int i = 0; i < renderers.Length; i++) { renderers[i].enabled = enabled; } } if (OperateData.InteractInside) { Collider[] colliders = InteractObjParent.GetComponentsInChildren(); for (int i = 0; i < colliders.Length; i++) { colliders[i].enabled = enabled; } } } public override void Dispose() { base.Dispose(); if (Voice != null) { if (!Voice.IsDisposed) VoiceManager.Instance.Stop(Voice); Voice = null; } if (EffectVoice != null) { if (!EffectVoice.IsDisposed) VoiceManager.Instance.Stop(EffectVoice); EffectVoice = null; } InteractObjParent = null; } } public class InteractObjsData { ///交互物体 public string InteractName; ///动画名称 public string AnimationName; /// 是否为临时物体 public bool BeforeEnable; ///响应物体列表 public List AnswerObjDataList = new List(); ///音频名称 public string AudioName; ///交互音效 public string AudioEffect; /// 是否有内部交互物体 public bool InteractInside; /// 同时播放动画 public bool IsSimulAni; } }