forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			124 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System.Collections.Generic;
 | 
						|
#if XR_HANDS
 | 
						|
using UnityEngine.XR.Hands;
 | 
						|
#endif
 | 
						|
 | 
						|
namespace UnityEngine.XR.Interaction.Toolkit.Samples.Hands
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// Manages swapping between hands and controllers at runtime based on whether hands are tracked.
 | 
						|
    /// </summary>
 | 
						|
    public class HandsAndControllersManager : MonoBehaviour
 | 
						|
    {
 | 
						|
        [SerializeField]
 | 
						|
        [Tooltip("GameObject to toggle on when the left hand is tracked and off when it is not tracked.")]
 | 
						|
        GameObject m_LeftHand;
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        [Tooltip("GameObject to toggle on when the right hand is tracked and off when it is not tracked.")]
 | 
						|
        GameObject m_RightHand;
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        [Tooltip("GameObject to toggle off when the left hand is tracked and on when it is not tracked.")]
 | 
						|
        GameObject m_LeftController;
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        [Tooltip("GameObject to toggle off when the right hand is tracked and on when it is not tracked.")]
 | 
						|
        GameObject m_RightController;
 | 
						|
 | 
						|
#if XR_HANDS
 | 
						|
        XRHandSubsystem m_Subsystem;
 | 
						|
 | 
						|
        static readonly List<XRHandSubsystem> s_Subsystems = new List<XRHandSubsystem>();
 | 
						|
#endif
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// See <see cref="MonoBehaviour"/>.
 | 
						|
        /// </summary>
 | 
						|
        protected void OnEnable()
 | 
						|
        {
 | 
						|
#if XR_HANDS
 | 
						|
            SubsystemManager.GetSubsystems(s_Subsystems);
 | 
						|
            if (s_Subsystems.Count == 0)
 | 
						|
            {
 | 
						|
                Debug.LogWarning("Hand Tracking Subsystem not found, can't subscribe to hand tracking status. Enable that feature in the OpenXR project settings and ensure OpenXR is enabled as the plug-in provider.", this);
 | 
						|
                ToggleLeftHand(false);
 | 
						|
                ToggleRightHand(false);
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            m_Subsystem = s_Subsystems[0];
 | 
						|
            m_Subsystem.trackingAcquired += OnHandTrackingAcquired;
 | 
						|
            m_Subsystem.trackingLost += OnHandTrackingLost;
 | 
						|
 | 
						|
            var leftHand = m_Subsystem.leftHand;
 | 
						|
            ToggleHand(leftHand.handedness, leftHand.isTracked);
 | 
						|
            
 | 
						|
            var rightHand = m_Subsystem.rightHand;
 | 
						|
            ToggleHand(rightHand.handedness, rightHand.isTracked);
 | 
						|
#else
 | 
						|
            Debug.LogError("Script requires XR Hands (com.unity.xr.hands) package. Install using Window > Package Manager or click Fix on the related issue in Edit > Project Settings > XR Plug-in Management > Project Validation.", this);
 | 
						|
            ToggleLeftHand(false);
 | 
						|
            ToggleRightHand(false);
 | 
						|
#endif
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// See <see cref="MonoBehaviour"/>.
 | 
						|
        /// </summary>
 | 
						|
        protected void OnDisable()
 | 
						|
        {
 | 
						|
#if XR_HANDS
 | 
						|
            if (m_Subsystem == null)
 | 
						|
                return;
 | 
						|
 | 
						|
            m_Subsystem.trackingAcquired -= OnHandTrackingAcquired;
 | 
						|
            m_Subsystem.trackingLost -= OnHandTrackingLost;
 | 
						|
            m_Subsystem = null;
 | 
						|
#endif
 | 
						|
        }
 | 
						|
 | 
						|
        void ToggleLeftHand(bool handOn)
 | 
						|
        {
 | 
						|
            if (m_LeftHand != null)
 | 
						|
                m_LeftHand.SetActive(handOn);
 | 
						|
 | 
						|
            if (m_LeftController != null)
 | 
						|
                m_LeftController.SetActive(!handOn);
 | 
						|
        }
 | 
						|
 | 
						|
        void ToggleRightHand(bool handOn)
 | 
						|
        {
 | 
						|
            if (m_RightHand != null)
 | 
						|
                m_RightHand.SetActive(handOn);
 | 
						|
 | 
						|
            if (m_RightController != null)
 | 
						|
                m_RightController.SetActive(!handOn);
 | 
						|
        }
 | 
						|
 | 
						|
#if XR_HANDS
 | 
						|
        void OnHandTrackingAcquired(XRHand hand)
 | 
						|
        {
 | 
						|
            ToggleHand(hand.handedness, true);
 | 
						|
        }
 | 
						|
 | 
						|
        void OnHandTrackingLost(XRHand hand)
 | 
						|
        {
 | 
						|
            ToggleHand(hand.handedness, false);
 | 
						|
        }
 | 
						|
 | 
						|
        void ToggleHand(Handedness handedness, bool handOn)
 | 
						|
        {
 | 
						|
            switch (handedness)
 | 
						|
            {
 | 
						|
                case Handedness.Left:
 | 
						|
                    ToggleLeftHand(handOn);
 | 
						|
                    break;
 | 
						|
                case Handedness.Right:
 | 
						|
                    ToggleRightHand(handOn);
 | 
						|
                    break;
 | 
						|
            }
 | 
						|
        }
 | 
						|
#endif
 | 
						|
    }
 | 
						|
} |