1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.EventSystems;
- using UnityEngine.Serialization;
- using UnityEngine.UI;
- public class LerpSlider : UnityEngine.UI.Slider, IPointerDownHandler
- {
- private float lerpDuration = 0.08f; // 过渡时间
- private float targetValue;
- private bool isLerping;
- public bool UseLerping=true;
- public Action OnPointDown;
-
- protected override void Update()
- {
- base.Update();
- if(!UseLerping)
- return;
- if (isLerping)
- {
- // 平滑过渡到目标值
- value = Mathf.Lerp(value, targetValue, Time.deltaTime / lerpDuration);
- // 检查是否接近目标值,结束过渡
- if (Mathf.Abs(value - targetValue) < 0.01f)
- {
- value = targetValue;
- isLerping = false;
- }
- }
- }
- public void OnPointerDown(PointerEventData eventData)
- {
- OnPointDown?.Invoke();
- // 计算点击位置的值
- RectTransformUtility.ScreenPointToLocalPointInRectangle(
- GetComponent<RectTransform>(), eventData.position, eventData.pressEventCamera, out var localPoint);
- // 计算滑块的点击位置对应的值
- float normalizedValue = Mathf.InverseLerp(
- GetComponent<RectTransform>().rect.xMin,
- GetComponent<RectTransform>().rect.xMax,
- localPoint.x
- );
- targetValue = Mathf.Clamp01(normalizedValue); // 确保值在0到1之间
- UseLerping = true;
- isLerping = true;
- }
- }
|