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