forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using UnityEngine;
 | 
						|
using UnityEngine.UI;
 | 
						|
using UnityEngine.EventSystems;
 | 
						|
using TMPro;
 | 
						|
 | 
						|
public class SliderDragHandler : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler
 | 
						|
{
 | 
						|
    public RectTransform sliderBackground; // Assign in Inspector
 | 
						|
    public float minValue = 2f;
 | 
						|
    public float maxValue = 5f;
 | 
						|
    public float slideareaOffsetMultiplier = 0.9f;
 | 
						|
    public TMP_Text warningText;
 | 
						|
    public float warningThreshholdValue = 0.65f;
 | 
						|
    public float CurrentValue { get; private set; }
 | 
						|
 | 
						|
    public ContinuoslocomotionConfigurator configurator;
 | 
						|
 | 
						|
    private RectTransform handleRect;
 | 
						|
    private Vector2 backgroundStart;
 | 
						|
    private float backgroundWidth;
 | 
						|
 | 
						|
    void Awake()
 | 
						|
    {
 | 
						|
        handleRect = GetComponent<RectTransform>();
 | 
						|
 | 
						|
        if (sliderBackground != null)
 | 
						|
        {
 | 
						|
            backgroundStart = sliderBackground.position;
 | 
						|
            backgroundWidth = sliderBackground.rect.width;
 | 
						|
        }
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
    public void OnBeginDrag(PointerEventData eventData)
 | 
						|
    {
 | 
						|
        UpdateSlider(eventData);
 | 
						|
    }
 | 
						|
 | 
						|
    public void OnDrag(PointerEventData eventData)
 | 
						|
    {
 | 
						|
        UpdateSlider(eventData);
 | 
						|
    }
 | 
						|
 | 
						|
    public void OnEndDrag(PointerEventData eventData)
 | 
						|
    {
 | 
						|
        UpdateSlider(eventData);
 | 
						|
        configurator.UpdateSpeed(CurrentValue);
 | 
						|
    }
 | 
						|
    private void UpdateSlider(PointerEventData eventData)
 | 
						|
    {
 | 
						|
        Vector2 localPoint;
 | 
						|
        RectTransformUtility.ScreenPointToLocalPointInRectangle(sliderBackground, eventData.position, eventData.pressEventCamera, out localPoint);
 | 
						|
 | 
						|
        float halfWidth = sliderBackground.rect.width * 0.5f;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
        // Only allow dragging within 90% of the slider width, centered
 | 
						|
        float limit = halfWidth * slideareaOffsetMultiplier;
 | 
						|
        float clampedX = Mathf.Clamp(localPoint.x, -limit, limit);
 | 
						|
 | 
						|
        Vector3 newPosition = new Vector3(clampedX, handleRect.localPosition.y, handleRect.localPosition.z);
 | 
						|
        handleRect.localPosition = newPosition;
 | 
						|
 | 
						|
        // Normalize within the limited 90% range
 | 
						|
        float normalized = (clampedX + limit) / (limit * 2f);
 | 
						|
        //Debug.Log(normalized);
 | 
						|
        CurrentValue = Mathf.Lerp(minValue, maxValue, normalized);
 | 
						|
 | 
						|
        // Displaying the warning.
 | 
						|
 | 
						|
        if (CurrentValue > (warningThreshholdValue*(maxValue - minValue) + minValue)) warningText.gameObject.SetActive(true);
 | 
						|
        
 | 
						|
        else warningText.gameObject.SetActive(false);
 | 
						|
 | 
						|
        //Debug.Log(warningThreshholdValue);
 | 
						|
 | 
						|
        
 | 
						|
    }
 | 
						|
 | 
						|
}
 |