using UnityEngine.Events; using UnityEngine.XR.Interaction.Toolkit; namespace UnityEngine.XR.Content.Interaction { /// /// An interactable lever that snaps into an on or off position by a direct interactor /// public class XRChair : XRBaseInteractable { const float k_LeverDeadZone = 0.1f; // Prevents rapid switching between on and off states when right in the middle [SerializeField] [Tooltip("The object that is visually grabbed and manipulated")] Transform m_Chair = null; [SerializeField] float m_Sensitivity = 1f; [SerializeField] float m_MaxPoint = 90.0f; [SerializeField] float m_MinPoint = -90.0f; IXRSelectInteractor m_Interactor; /// /// The object that is visually grabbed and manipulated /// public Transform chair { get => m_Chair; set => m_Chair = value; } /// /// Angle of the lever in the 'on' position /// public float maxPoint { get => m_MaxPoint; set => m_MaxPoint = value; } /// /// Angle of the lever in the 'off' position /// public float minPoint { get => m_MinPoint; set => m_MinPoint = value; } void Start() { } protected override void OnEnable() { base.OnEnable(); selectEntered.AddListener(StartGrab); selectExited.AddListener(EndGrab); } protected override void OnDisable() { selectEntered.RemoveListener(StartGrab); selectExited.RemoveListener(EndGrab); base.OnDisable(); } void StartGrab(SelectEnterEventArgs args) { m_Interactor = args.interactorObject; } void EndGrab(SelectExitEventArgs args) { m_Interactor = null; } public override void ProcessInteractable(XRInteractionUpdateOrder.UpdatePhase updatePhase) { base.ProcessInteractable(updatePhase); if (updatePhase == XRInteractionUpdateOrder.UpdatePhase.Dynamic) { if (isSelected) { UpdateValue(); } } } Vector3 GetLookDirection() { Vector3 direction = m_Interactor.GetAttachTransform(this).position - m_Chair.position; direction = transform.InverseTransformDirection(direction); direction.z = 0; return direction.normalized; } void UpdateValue() { var lookDirection = GetLookDirection(); Debug.Log("lookDirection : " + lookDirection); float value = lookDirection.x * m_Sensitivity; SetChairPosition(value); } void SetChairPosition(float value) { if (m_Chair == null) return; var originalPos = m_Chair.transform.localPosition; originalPos.x += value; Debug.Log("chair x point : " + originalPos.x); originalPos.x = Mathf.Clamp(originalPos.x, minPoint,maxPoint); m_Chair.transform.localPosition = originalPos; } void OnDrawGizmosSelected() { //var angleStartPoint = transform.position; //if (m_Chair != null) // angleStartPoint = m_Chair.position; //const float k_AngleLength = 0.25f; //var angleMaxPoint = angleStartPoint + transform.TransformDirection(Quaternion.Euler(m_MaxPoint, 0.0f, 0.0f) * Vector3.up) * k_AngleLength; //var angleMinPoint = angleStartPoint + transform.TransformDirection(Quaternion.Euler(m_MinPoint, 0.0f, 0.0f) * Vector3.up) * k_AngleLength; //Gizmos.color = Color.green; //Gizmos.DrawLine(angleStartPoint, angleMaxPoint); //Gizmos.color = Color.red; //Gizmos.DrawLine(angleStartPoint, angleMinPoint); } void OnValidate() { //SetChairPosition(m_Value ? m_MaxPoint : m_MinPoint); } } }