62 lines
1.8 KiB
C#
62 lines
1.8 KiB
C#
using UnityEngine;
|
|
using UnityEngine.XR.Interaction.Toolkit;
|
|
|
|
public class PullMeasurer : XRBaseInteractable
|
|
{
|
|
[SerializeField] private Transform start;
|
|
[SerializeField] private Transform end;
|
|
|
|
public float PullAmount { get; private set; } = 0.0f;
|
|
|
|
public Vector3 PullPosition => Vector3.Lerp(start.position, end.position, PullAmount);
|
|
|
|
protected override void OnSelectExited(SelectExitEventArgs args)
|
|
{
|
|
base.OnSelectExited(args);
|
|
PullAmount = 0;
|
|
}
|
|
|
|
public override void ProcessInteractable(XRInteractionUpdateOrder.UpdatePhase updatePhase)
|
|
{
|
|
base.ProcessInteractable(updatePhase);
|
|
|
|
if (isSelected)
|
|
{
|
|
// Update pull values while the measurer is grabbed
|
|
if (updatePhase == XRInteractionUpdateOrder.UpdatePhase.Dynamic)
|
|
UpdatePull();
|
|
}
|
|
}
|
|
|
|
private void UpdatePull()
|
|
{
|
|
// Use the interactor's position to calculate amount
|
|
Vector3 interactorPosition = firstInteractorSelecting.transform.position;
|
|
|
|
// Figure out the new pull value, and it's position in space
|
|
PullAmount = CalculatePull(interactorPosition);
|
|
}
|
|
|
|
private float CalculatePull(Vector3 pullPosition)
|
|
{
|
|
// Direction, and length
|
|
Vector3 pullDirection = pullPosition - start.position;
|
|
Vector3 targetDirection = end.position - start.position;
|
|
|
|
// Figure out out the pull direction
|
|
float maxLength = targetDirection.magnitude;
|
|
targetDirection.Normalize();
|
|
|
|
// What's the actual distance?
|
|
float pullValue = Vector3.Dot(pullDirection, targetDirection) / maxLength;
|
|
return Mathf.Clamp(pullValue, 0.0f, 1.0f);
|
|
}
|
|
|
|
private void OnDrawGizmos()
|
|
{
|
|
// Draw line from start to end point
|
|
if (start && end)
|
|
Gizmos.DrawLine(start.position, end.position);
|
|
}
|
|
}
|