forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			80 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using UnityEngine.Playables;
 | 
						|
using UnityEngine.XR.Interaction.Toolkit;
 | 
						|
 | 
						|
namespace UnityEngine.XR.Content.Interaction
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// Component that when paired with an interactable will drive an associated timeline with the activate button
 | 
						|
    /// Must be used with an action-based controller
 | 
						|
    /// </summary>
 | 
						|
    public class InteractionAnimator : MonoBehaviour
 | 
						|
    {
 | 
						|
        [SerializeField]
 | 
						|
        [Tooltip("The timeline to drive with the activation button.")]
 | 
						|
        PlayableDirector m_ToAnimate;
 | 
						|
 | 
						|
        bool m_Animating;
 | 
						|
        XRBaseController m_Controller;
 | 
						|
 | 
						|
        void Start()
 | 
						|
        {
 | 
						|
            // We want to hook up to the Select events so we can read data about the interacting controller
 | 
						|
            var interactable = GetComponent<IXRSelectInteractable>();
 | 
						|
            if (interactable == null || interactable as Object == null)
 | 
						|
            {
 | 
						|
                Debug.LogWarning($"No interactable on {name} - no animation will be played.", this);
 | 
						|
                enabled = false;
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            if (m_ToAnimate == null)
 | 
						|
            {
 | 
						|
                Debug.LogWarning($"No timeline configured on {name} - no animation will be played.", this);
 | 
						|
                enabled = false;
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            interactable.selectEntered.AddListener(OnSelect);
 | 
						|
            interactable.selectExited.AddListener(OnDeselect);
 | 
						|
        }
 | 
						|
 | 
						|
        void Update()
 | 
						|
        {
 | 
						|
            if (m_Animating && m_Controller != null)
 | 
						|
            {
 | 
						|
                var floatValue = m_Controller.activateInteractionState.value;
 | 
						|
                m_ToAnimate.time = floatValue;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        void OnSelect(SelectEnterEventArgs args)
 | 
						|
        {
 | 
						|
            // Get the controller from the interactor, and then the activation control from there
 | 
						|
            var controllerInteractor = args.interactorObject as XRBaseControllerInteractor;
 | 
						|
            if (controllerInteractor == null)
 | 
						|
            {
 | 
						|
                Debug.LogWarning($"Selected by {args.interactorObject.transform.name}, which is not an XRBaseControllerInteractor", this);
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            m_Controller = controllerInteractor.xrController;
 | 
						|
            if (m_Controller == null)
 | 
						|
            {
 | 
						|
                Debug.LogWarning($"Selected by {controllerInteractor.name}, which does not have a valid XRBaseController", this);
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            // Ready to animate
 | 
						|
            m_ToAnimate.Play();
 | 
						|
            m_Animating = true;
 | 
						|
        }
 | 
						|
 | 
						|
        void OnDeselect(SelectExitEventArgs args)
 | 
						|
        {
 | 
						|
            m_Animating = false;
 | 
						|
            m_ToAnimate.Stop();
 | 
						|
            m_Controller = null;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |