using UnityEngine.XR.Interaction.Toolkit.Utilities; namespace UnityEngine.XR.Interaction.Toolkit.Inputs.Readers { /// /// An adapter component that provides a and value from a device /// from the XR input subsystem as defined by its characteristics and feature usage string. /// Intended to be used with an as its object reference. /// [AddComponentMenu("XR/Input/XR Input Device Button Reader", 11)] [HelpURL(XRHelpURLConstants.k_XRInputDeviceButtonReader)] [DefaultExecutionOrder(XRInteractionUpdateOrder.k_XRInputDeviceButtonReader)] public sealed class XRInputDeviceButtonReader : MonoBehaviour, IXRInputButtonReader { [SerializeField] [Tooltip("The value that is read to determine whether the button is down.")] XRInputDeviceBoolValueReader m_BoolValueReader; /// /// The value that is read to determine whether the button is down. /// public XRInputDeviceBoolValueReader boolValueReader { get => m_BoolValueReader; set => m_BoolValueReader = value; } [SerializeField] [Tooltip("The value that is read to determine the scalar value that varies from 0 to 1.")] XRInputDeviceFloatValueReader m_FloatValueReader; /// /// The value that is read to determine the scalar value that varies from 0 to 1. /// public XRInputDeviceFloatValueReader floatValueReader { get => m_FloatValueReader; set => m_FloatValueReader = value; } bool m_IsPerformed; bool m_WasPerformedThisFrame; bool m_WasCompletedThisFrame; readonly UnityObjectReferenceCache m_BoolValueReaderCache = new UnityObjectReferenceCache(); readonly UnityObjectReferenceCache m_FloatValueReaderCache = new UnityObjectReferenceCache(); /// /// See . /// void Awake() { if (m_BoolValueReader == null) Debug.LogError("No bool value reader set for XRInputDeviceButtonReader.", this); if (m_FloatValueReader == null) Debug.LogError("No float value reader set for XRInputDeviceButtonReader.", this); } /// /// See . /// void Update() { var prevPerformed = m_IsPerformed; m_IsPerformed = TryGetBoolValueReader(out var reference) && reference.ReadValue(); m_WasPerformedThisFrame = !prevPerformed && m_IsPerformed; m_WasCompletedThisFrame = prevPerformed && !m_IsPerformed; } /// public bool ReadIsPerformed() { return m_IsPerformed; } /// public bool ReadWasPerformedThisFrame() { return m_WasPerformedThisFrame; } /// public bool ReadWasCompletedThisFrame() { return m_WasCompletedThisFrame; } /// public float ReadValue() { if (TryGetFloatValueReader(out var reference)) return reference.ReadValue(); return default; } /// public bool TryReadValue(out float value) { if (TryGetFloatValueReader(out var reference)) return reference.TryReadValue(out value); value = default; return false; } bool TryGetBoolValueReader(out XRInputDeviceBoolValueReader reference) => m_BoolValueReaderCache.TryGet(m_BoolValueReader, out reference); bool TryGetFloatValueReader(out XRInputDeviceFloatValueReader reference) => m_FloatValueReaderCache.TryGet(m_FloatValueReader, out reference); } }