ProjectDDD/Assets/_Datas/SLShared/SLUnity/SLUI/SLUILongPressed.cs
2025-06-17 20:47:57 +09:00

159 lines
4.6 KiB (Stored with Git LFS)
C#

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