using UnityEngine.Events;
|
using UnityEngine.XR.Interaction.Toolkit;
|
|
namespace UnityEngine.XR.Content.Interaction
|
{
|
/// <summary>
|
/// An interactable lever that snaps into an on or off position by a direct interactor
|
/// </summary>
|
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;
|
|
/// <summary>
|
/// The object that is visually grabbed and manipulated
|
/// </summary>
|
public Transform chair
|
{
|
get => m_Chair;
|
set => m_Chair = value;
|
}
|
|
|
|
|
/// <summary>
|
/// Angle of the lever in the 'on' position
|
/// </summary>
|
public float maxPoint
|
{
|
get => m_MaxPoint;
|
set => m_MaxPoint = value;
|
}
|
|
/// <summary>
|
/// Angle of the lever in the 'off' position
|
/// </summary>
|
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);
|
}
|
}
|
}
|