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;
}