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