2025-07-08 10:46:31 +00:00
|
|
|
|
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<Slider>();
|
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|