using UnityEngine; using UnityEngine.EventSystems; public class UGUISlideBar : MonoBehaviour, IPointerDownHandler, IPointerUpHandler { [SerializeField] private RectTransform FillRT; [SerializeField] private TMPro.TextMeshProUGUI PercentTMP; [SerializeField] private bool InitOnPointerUp = false; private RectTransform rt; private float MaxWidth; private Camera uiCamera; private bool checkable = false; public System.Action OnValueChanged; public bool Controlable { get; set; } = true; /// Normalized Value. 0 ~ 1 public float Value { get { float result = Mathf.Clamp(FillRT.sizeDelta.x / MaxWidth, 0f, 1f); return result; } set { FillRT.sizeDelta = new Vector2(Mathf.Clamp(value * MaxWidth, 0, MaxWidth), FillRT.sizeDelta.y); if (PercentTMP != null) PercentTMP.text = (FillRT.sizeDelta.x / MaxWidth * 100f).ToString("N1") + "%"; OnValueChanged?.Invoke(); } } private void Awake() { rt = this.GetComponent(); MaxWidth = rt.rect.width; uiCamera = this.transform.root.Find("PopupCanvas").GetComponent().worldCamera; } private void OnEnable() { Value = 0; } private void OnDisable() { checkable = false; } private void Update() { if (!checkable || !Controlable) return; #if UNITY_EDITOR if (uiCamera != null && Input.GetMouseButton(0)) #elif UNITY_ANDROID if (uiCamera != null && Input.touchCount > 0) #endif { Vector2 local; #if UNITY_EDITOR if (RectTransformUtility.ScreenPointToLocalPointInRectangle(FillRT, Input.mousePosition, uiCamera, out local)) #elif UNITY_ANDROID if (RectTransformUtility.ScreenPointToLocalPointInRectangle(FillRT, Input.GetTouch(0).position, uiCamera, out local)) #endif { FillRT.sizeDelta = new Vector2(Mathf.Clamp(local.x, 0, MaxWidth), FillRT.sizeDelta.y); OnValueChanged?.Invoke(); if (PercentTMP != null) PercentTMP.text = (FillRT.sizeDelta.x / MaxWidth * 100f).ToString("N1") + "%"; } } } public void OnPointerDown(PointerEventData eventData) { if (Controlable) checkable = true; } public void OnPointerUp(PointerEventData eventData) { if (Controlable) checkable = false; if (InitOnPointerUp) Value = 0f; } }