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