using System; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; namespace Superlazy.UI { public class SLUILongPressed : SLUIComponent, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler, IScrollHandler, IInitializePotentialDragHandler, IBeginDragHandler, IEndDragHandler, IDragHandler { public float firstTriggerSecond = 0.3f; public float triggerDuration = 0.15f; public string triggerBind = "LongPressDuration"; public string triggerCommand; public bool triggerImmediate = false; public string triggerSound = "UI/SE_UI_click"; private bool pressed = false; private GameObject longPressObject; private Slider slider; private float sliderValue = 0; private DateTime nextTriggerTime = DateTime.MinValue; private DateTime firstTriggerTime = DateTime.MinValue; private DateTime zeroValueTime = DateTime.MinValue; protected override void Validate() { } protected override void Init() { } protected override void Enable() { if (longPressObject == null) { longPressObject = SLResources.CreatePrefabInstance("UIComponents/LongPress", gameObject.transform); } slider = longPressObject.GetComponent(); longPressObject.SetActive(true); } protected override void Disable() { ReleasePressed(); longPressObject.SetActive(false); } public void Update() { if (bindParent.Active == false) return; longPressObject.SetActive(slider.value > 0); if (pressed == false) { if (sliderValue > 0) { sliderValue = (float)(zeroValueTime - DateTime.UtcNow).TotalSeconds / firstTriggerSecond; } slider.value = sliderValue == 0 ? 0 : sliderValue / firstTriggerSecond; return; } sliderValue = (firstTriggerSecond - (float)(nextTriggerTime - DateTime.UtcNow).TotalSeconds); slider.value = sliderValue / firstTriggerSecond; if ((DateTime.UtcNow - nextTriggerTime).TotalSeconds > 0) { if (triggerCommand != string.Empty) { Trigger(); } if (triggerDuration == 0) { ReleasePressed(); } else { nextTriggerTime = DateTime.UtcNow.AddSeconds(triggerDuration); } } } public void OnPointerDown(PointerEventData eventData) { if (SLUIDragButton.globalDragging) return; if (bindParent.Active == false) return; pressed = true; firstTriggerTime = DateTime.UtcNow; if (triggerImmediate) Trigger(); var addSecond = firstTriggerSecond; if (sliderValue > 0) { addSecond -= sliderValue * firstTriggerSecond; } nextTriggerTime = DateTime.UtcNow.AddSeconds(addSecond); } private void Trigger() { if (SLUIDragButton.globalDragging) return; if (bindParent.Active == false) return; SLGame.SessionGet(bindParent.BindPath)[triggerBind] = (DateTime.UtcNow - firstTriggerTime).TotalSeconds; SLGame.Command(triggerCommand, SLGame.SessionGet(bindParent.BindPath)); //SLSound.PlaySound(triggerSound); } public void OnPointerUp(PointerEventData eventData) { ReleasePressed(); } public void OnPointerExit(PointerEventData eventData) { ReleasePressed(); } private void ReleasePressed() { pressed = false; zeroValueTime = DateTime.UtcNow.AddSeconds(sliderValue * firstTriggerSecond); SLGame.SessionGet(bindParent.BindPath)[triggerBind] = false; } public void OnScroll(PointerEventData eventData) { // block scroll } public void OnInitializePotentialDrag(PointerEventData eventData) { // block scroll } public void OnBeginDrag(PointerEventData eventData) { // block scroll } public void OnEndDrag(PointerEventData eventData) { // block scroll } public void OnDrag(PointerEventData eventData) { // block scroll } } }