using System;
using Unity.Mathematics;
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit.Utilities.Tweenables.Primitives;
namespace Unity.VRTemplate
{
///
/// Helper script used to control the Teleport Anchor visuals animations.
///
public class AnchorVisuals : MonoBehaviour
{
[SerializeField, Tooltip("The animation for the vertical glow element on the platform.")]
Animation m_FadeAnimation;
[SerializeField, Tooltip("The arrow transform, at the center of the platform.")]
Transform m_Arrow;
[SerializeField, Tooltip("Height of the arrow transform when teleport ray hovers the teleport pad.")]
float m_TargetArrowHeight = 1.0f;
[SerializeField, Tooltip("Animation duration of the arrow transform to and from the target arrow height.")]
float m_ArrowAnimationDuration = 0.2f;
[SerializeField, Tooltip("Animation curve of hte arrow transform to and from the target arrow height.")]
AnimationCurve m_AnimationCurve;
Coroutine m_ArrowCoroutine;
Vector3TweenableVariable m_ArrowHeight;
Vector3 m_InitialArrowScale;
void Start()
{
if (m_FadeAnimation != null)
{
var fadeAnim = m_FadeAnimation;
var clipName = m_FadeAnimation.clip.name;
fadeAnim[clipName].normalizedTime = 1f;
}
m_ArrowHeight = new Vector3TweenableVariable();
m_ArrowHeight.animationCurve = m_AnimationCurve;
m_InitialArrowScale = m_Arrow.localScale;
}
void Update()
{
m_Arrow.localPosition = m_ArrowHeight.Value;
}
///
/// Performs animations when teleport interactor enters the teleport anchor selection.
///
public void OnAnchorEnter()
{
m_Arrow.localScale = m_InitialArrowScale;
if (m_FadeAnimation != null)
{
var fadeAnim = m_FadeAnimation;
var clipName = m_FadeAnimation.clip.name;
fadeAnim[clipName].normalizedTime = 0f;
fadeAnim[clipName].speed = 1f;
fadeAnim.Play();
}
if (m_ArrowCoroutine != null)
StopCoroutine(m_ArrowCoroutine);
var arrowPosition = m_Arrow.localPosition;
m_ArrowCoroutine = StartCoroutine(m_ArrowHeight.PlaySequence(arrowPosition, new float3(arrowPosition.x, m_TargetArrowHeight, arrowPosition.z), m_ArrowAnimationDuration));
}
///
/// Performs animations when teleport interactor exits the teleport anchor selection.
///
public void OnAnchorExit()
{
if (m_FadeAnimation != null)
{
// Set time to 1, at the end of the animation, play at 1.5x speed
var fadeAnim = m_FadeAnimation;
var clipName = m_FadeAnimation.clip.name;
fadeAnim[clipName].normalizedTime = 1f;
fadeAnim[clipName].speed = -1.5f;
fadeAnim.Play();
}
if (m_ArrowCoroutine != null)
StopCoroutine(m_ArrowCoroutine);
var arrowPosition = m_Arrow.localPosition;
m_ArrowCoroutine = StartCoroutine(m_ArrowHeight.PlaySequence(arrowPosition, new float3(arrowPosition.x, 0, arrowPosition.z), m_ArrowAnimationDuration));
}
///
/// Hides the arrow visual when teleporting
///
public void HideArrowOnTeleport()
{
m_Arrow.localScale = Vector3.zero;
}
}
}