using System.Threading.Tasks; using UnityEngine; using WS; ///交互 public class InteractComponent : OperateComponent { ///音频实例 private VoiceEntity Voice; ///交互物体 private GameObject InteractObj; ///动画组件 private Animator anim; ///响应物体 private GameObject AnswerObj; ///响应物体动画组件 private Animator answerAnim; ///流程管理器 private ProcessManager processManager; public override void Init() { processManager = GameManager.Instance.ProcessManager; InteractObj = GameObject.Find(OperateData.InteractName); if (!string.IsNullOrEmpty(OperateData.AnimationName)) { anim = InteractObj.transform.GetComponent(); } if (!string.IsNullOrEmpty(OperateData.AnswerName)) { AnswerObj = GameObject.Find(OperateData.AnswerName); if (!string.IsNullOrEmpty(OperateData.AnswerAnimName)) { answerAnim = AnswerObj.transform.GetComponent(); } } } public override void StartOperate() { SetInteractObjStatus(true); HighlightComponent.Instance.SetOperateObjLayer(InteractObj.transform, 7); if ( !string.IsNullOrEmpty(OperateData.AnimationName) && !string.IsNullOrEmpty(OperateData.AnswerAnimName) ) { AddComponent(anim, answerAnim); } else { if (!string.IsNullOrEmpty(OperateData.AnimationName)) { AddComponent(anim); } if (!string.IsNullOrEmpty(OperateData.AnswerAnimName)) { AddComponent(answerAnim); } } 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.考核: break; } } public override void Update() { //if (VRInputComponent.Instance.OperateObject != null) //{ // if (VRInputComponent.Instance.OperateObject == InteractObj) // { // if (VRInputComponent.Instance.GetKeyDown(VRKey.扳机, VRInputComponent.Instance.GetSelectPointer.Hand)) // { // VoiceManager.Instance.Play(VoiceType.Effects, OperateData.AudioEffect); // HighlightComponent.Instance.SetOperateObjLayer(InteractObj.transform, 6); // AnimatorComponent component = GetComponent(); // if (!string.IsNullOrEmpty(OperateData.AnimationName) && !string.IsNullOrEmpty(OperateData.AnswerAnimName)) // { // component.PlayAnim(OperateData.AnimationName, OperateData.AnswerAnimName, OperateData.IsSimulAni, () => // { // SceneDataSaveComponent.Instance.AddSceneData(SceneComponent.Instance.ThisScene,OperateData.InteractName,OperateData.AnimationName); // SceneDataSaveComponent.Instance.AddSceneData(SceneComponent.Instance.ThisScene, OperateData.AnswerName, OperateData.AnswerAnimName); // IsComplete = true; // }); // } // else // { // if(!string.IsNullOrEmpty(OperateData.AnimationName)) // { // component.PlayAnim(OperateData.AnimationName, () => // { // SceneDataSaveComponent.Instance.AddSceneData(SceneComponent.Instance.ThisScene, OperateData.InteractName, OperateData.AnimationName); // IsComplete = true; // }); // } // else if (!string.IsNullOrEmpty(OperateData.AnswerAnimName)) // { // component.PlayAnim(OperateData.AnswerAnimName, () => // { // SceneDataSaveComponent.Instance.AddSceneData(SceneComponent.Instance.ThisScene, OperateData.AnswerName, OperateData.AnswerAnimName); // IsComplete = true; // }); // } // else // { // IsComplete = true; // } // } // SetInteractObjStatus(false); // } // } // else // { // if (VRInputComponent.Instance.GetKeyDown(VRKey.扳机, VRInputComponent.Instance.GetSelectPointer.Hand)) // { // processManager.GetVTaskRecord(processManager.GetCurrentModule().VTaskId).IsError = true; // } // } //} } /// /// 设置交互物体的交互和显示状态 /// /// 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 override void Prompt() { HighlightComponent.Instance.SetOperateObjLayer(InteractObj.transform, 7); } public override Task StartState() { //Log.LogDebug("切换到初始状态"); InteractObj = GameObject.Find(OperateData.InteractName); if (!string.IsNullOrEmpty(OperateData.AnswerName)) { AnswerObj = GameObject.Find(OperateData.AnswerName); } 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 ); } if (!string.IsNullOrEmpty(OperateData.AnswerAnimName)) { answerAnim = AnswerObj.transform.GetComponent(); answerAnim.Play(OperateData.AnswerAnimName, -1, 0f); answerAnim.speed = 0f; SceneDataSaveComponent.Instance.RemoveSceneData( SceneComponent.Instance.ThisScene, OperateData.AnswerName, OperateData.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 ); } if (!string.IsNullOrEmpty(OperateData.AnswerAnimName)) { answerAnim.Play(OperateData.AnswerAnimName, -1, 1); SceneDataSaveComponent.Instance.AddSceneData( SceneComponent.Instance.ThisScene, OperateData.AnswerName, OperateData.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 (GameManager.Instance.Data.Pattern == PatternType.引导) { SceneDataSaveComponent.Instance.RemoveSceneData( SceneComponent.Instance.ThisScene, OperateData.InteractName, OperateData.AnimationName ); } InteractObj = null; } } ///交互数据 public class InteractData { ///交互物体 public string InteractName; ///动画名称 public string AnimationName; ///响应物体 public string AnswerName; ///响应动画名称 public string AnswerAnimName; ///音频名称 public string AudioName; ///交互音效 public string AudioEffect; /// 是否为临时物体 public bool BeforeEnable; /// 是否有内部交互物体 public bool InteractInside; /// 同时播放动画 public bool IsSimulAni; }