using UnityEngine.XR.Interaction.Toolkit.Inputs.Readers; using UnityEngine.XR.Interaction.Toolkit.Interactors; namespace UnityEngine.XR.Interaction.Toolkit.AR.Inputs { /// /// Component that provides the select input for the ray interactor when using touchscreen with mobile AR. /// Intended to be used with an as its object reference /// to provide the select input. /// /// [AddComponentMenu("XR/Input/Screen Space Select Input", 11)] [HelpURL(XRHelpURLConstants.k_ScreenSpaceSelectInput)] [DefaultExecutionOrder(XRInteractionUpdateOrder.k_ScreenSpaceSelectInput)] public class ScreenSpaceSelectInput : MonoBehaviour, IXRInputButtonReader { [SerializeField] XRInputValueReader m_TapStartPositionInput = new XRInputValueReader("Tap Start Position"); /// /// Input to use for the screen tap start position. /// /// public XRInputValueReader tapStartPositionInput { get => m_TapStartPositionInput; set => XRInputReaderUtility.SetInputProperty(ref m_TapStartPositionInput, value, this); } [SerializeField] XRInputValueReader m_DragCurrentPositionInput = new XRInputValueReader("Drag Current Position"); /// /// Input to use for the screen drag current position. /// /// public XRInputValueReader dragCurrentPositionInput { get => m_DragCurrentPositionInput; set => XRInputReaderUtility.SetInputProperty(ref m_DragCurrentPositionInput, value, this); } [SerializeField] XRInputValueReader m_PinchGapDeltaInput = new XRInputValueReader("Pinch Gap Delta"); /// /// Input to use for the screen pinch gap delta relative to the previous frame. /// /// public XRInputValueReader pinchGapDeltaInput { get => m_PinchGapDeltaInput; set => XRInputReaderUtility.SetInputProperty(ref m_PinchGapDeltaInput, value, this); } [SerializeField] XRInputValueReader m_TwistDeltaRotationInput = new XRInputValueReader("Twist Delta Rotation"); /// /// Input to use for the screen twist delta relative to the previous frame. /// /// public XRInputValueReader twistDeltaRotationInput { get => m_TwistDeltaRotationInput; set => XRInputReaderUtility.SetInputProperty(ref m_TwistDeltaRotationInput, value, this); } bool m_IsPerformed; bool m_WasPerformedThisFrame; bool m_WasCompletedThisFrame; Vector2 m_TapStartPosition; /// /// See . /// protected void Update() { var prevPerformed = m_IsPerformed; var prevTapStartPosition = m_TapStartPosition; var tapPerformedThisFrame = m_TapStartPositionInput.TryReadValue(out m_TapStartPosition) && prevTapStartPosition != m_TapStartPosition; m_IsPerformed = m_PinchGapDeltaInput.TryReadValue(out _) || m_TwistDeltaRotationInput.TryReadValue(out _) || m_DragCurrentPositionInput.TryReadValue(out _) || tapPerformedThisFrame; 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() { return m_IsPerformed ? 1f : 0f; } /// public bool TryReadValue(out float value) { value = m_IsPerformed ? 1f : 0f; return m_IsPerformed; } } }