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