forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			96 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System.Collections.Generic;
 | 
						|
using UnityEngine.InputSystem;
 | 
						|
 | 
						|
namespace UnityEngine.XR.Interaction.Toolkit.Samples.StarterAssets
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// Manages input fallback for <see cref="XRGazeInteractor"/> when eye tracking is not available.
 | 
						|
    /// </summary>
 | 
						|
    public class GazeInputManager : MonoBehaviour
 | 
						|
    {
 | 
						|
        // This is the name of the layout that is registered by EyeGazeInteraction in the OpenXR Plugin package
 | 
						|
        const string k_EyeGazeLayoutName = "EyeGaze";
 | 
						|
 | 
						|
        [SerializeField]
 | 
						|
        [Tooltip("Enable fallback to head tracking if eye tracking is unavailable.")]
 | 
						|
        bool m_FallbackIfEyeTrackingUnavailable = true;
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Enable fallback to head tracking if eye tracking is unavailable.
 | 
						|
        /// </summary>
 | 
						|
        public bool fallbackIfEyeTrackingUnavailable
 | 
						|
        {
 | 
						|
            get => m_FallbackIfEyeTrackingUnavailable;
 | 
						|
            set => m_FallbackIfEyeTrackingUnavailable = value;
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        bool m_EyeTrackingDeviceFound;
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// See <see cref="MonoBehaviour"/>.
 | 
						|
        /// </summary>
 | 
						|
        protected void Awake()
 | 
						|
        {
 | 
						|
            // Check if we have eye tracking support
 | 
						|
            var inputDeviceList = new List<InputDevice>();
 | 
						|
            InputDevices.GetDevicesWithCharacteristics(InputDeviceCharacteristics.EyeTracking, inputDeviceList);
 | 
						|
            if (inputDeviceList.Count > 0)
 | 
						|
            {
 | 
						|
                Debug.Log("Eye tracking device found!", this);
 | 
						|
                m_EyeTrackingDeviceFound = true;
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            foreach (var device in InputSystem.InputSystem.devices)
 | 
						|
            {
 | 
						|
                if (device.layout == k_EyeGazeLayoutName)
 | 
						|
                {
 | 
						|
                    Debug.Log("Eye gaze device found!", this);
 | 
						|
                    m_EyeTrackingDeviceFound = true;
 | 
						|
                    return;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            Debug.LogWarning($"Could not find a device that supports eye tracking on Awake. {this} has subscribed to device connected events and will activate the GameObject when an eye tracking device is connected.", this);
 | 
						|
 | 
						|
            InputDevices.deviceConnected += OnDeviceConnected;
 | 
						|
            InputSystem.InputSystem.onDeviceChange += OnDeviceChange;
 | 
						|
 | 
						|
            gameObject.SetActive(m_FallbackIfEyeTrackingUnavailable);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// See <see cref="MonoBehaviour"/>.
 | 
						|
        /// </summary>
 | 
						|
        protected void OnDestroy()
 | 
						|
        {
 | 
						|
            InputDevices.deviceConnected -= OnDeviceConnected;
 | 
						|
            InputSystem.InputSystem.onDeviceChange -= OnDeviceChange;
 | 
						|
        }
 | 
						|
 | 
						|
        void OnDeviceConnected(InputDevice inputDevice)
 | 
						|
        {
 | 
						|
            if (m_EyeTrackingDeviceFound || !inputDevice.characteristics.HasFlag(InputDeviceCharacteristics.EyeTracking))
 | 
						|
                return;
 | 
						|
 | 
						|
            Debug.Log("Eye tracking device found!", this);
 | 
						|
            m_EyeTrackingDeviceFound = true;
 | 
						|
            gameObject.SetActive(true);
 | 
						|
        }
 | 
						|
 | 
						|
        void OnDeviceChange(InputSystem.InputDevice device, InputDeviceChange change)
 | 
						|
        {
 | 
						|
            if (m_EyeTrackingDeviceFound || change != InputDeviceChange.Added)
 | 
						|
                return;
 | 
						|
 | 
						|
            if (device.layout == k_EyeGazeLayoutName)
 | 
						|
            {
 | 
						|
                Debug.Log("Eye gaze device found!", this);
 | 
						|
                m_EyeTrackingDeviceFound = true;
 | 
						|
                gameObject.SetActive(true);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |