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