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