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;
}
}
}