using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using static UnityEngine.UI.Button;
namespace GeneralTools.UI
{
public class MultipleButton : Selectable, IEventSystemHandler, ISubmitHandler
{
enum ButtonFunction
{
OnClickAndLongClick,
OnClickAndDoubleClick,
All
}
[Header("Multiple Button Config")]
[SerializeField]
ButtonFunction buttonFunction = ButtonFunction.All;
private bool isPress;
private bool isLongClick;
[SerializeField]
private float pressTime = 0.6f;
private float curTime = 0;
private bool isDoubleClick;
private float firstTime = 0;
[SerializeField]
private float doubleTime = 0.2f;
[SerializeField]
private ButtonClickedEvent onClick;
public ButtonClickedEvent OnClick
{
get => onClick;
set => onClick = value;
}
[SerializeField]
private ButtonClickedEvent onLongClick;
public ButtonClickedEvent OnLongClick
{
get => onLongClick;
set => onLongClick = value;
}
[SerializeField]
private ButtonClickedEvent onDoubleClick;
public ButtonClickedEvent OnDoubleClick
{
get => onDoubleClick;
set => onDoubleClick = value;
}
private void Update()
{
if (isPress)
{
curTime += Time.deltaTime;
}
if (firstTime < doubleTime)
{
firstTime += Time.deltaTime;
}
}
public void OnSubmit(BaseEventData eventData)
{
Debug.Log("Submitted!");
}
public override void OnPointerDown(PointerEventData eventData)
{
base.OnPointerDown(eventData);
isPress = true;
///双击状态 第二次按下与第一次抬起间隔判断是否触发双击
if (firstTime <= doubleTime)
{
isDoubleClick = true;
}
else
{
isDoubleClick = false;
}
}
public override void OnPointerUp(PointerEventData eventData)
{
base.OnPointerUp(eventData);
///长按状态
if (curTime>=pressTime&&isPress)
{
isLongClick = true;
}
else
{
isLongClick = false;
}
isPress = false;
curTime = 0;
///根据当前状态判断哪种按键触发
switch (buttonFunction)
{
case ButtonFunction.OnClickAndLongClick:
if (isLongClick)
{
Debug.Log("isLongClick");
onLongClick?.Invoke();
}
else
{
Debug.Log("onClick");
onClick?.Invoke();
}
break;
case ButtonFunction.OnClickAndDoubleClick:
if (isDoubleClick)
{
Debug.Log("onDoubleClick");
onDoubleClick?.Invoke();
}
else
{
///防止双击的同时还触发第一次单击事件
StartCoroutine(OnClickButtonEvent());
}
break;
case ButtonFunction.All:
if (isLongClick)
{
Debug.Log("isLongClick");
onLongClick?.Invoke();
}
else if (isDoubleClick)
{
Debug.Log("onDoubleClick");
onDoubleClick?.Invoke();
}
else
{
StartCoroutine(OnClickButtonEvent());
}
break;
}
///抬起后重置双击时间
firstTime = 0;
}
IEnumerator OnClickButtonEvent()
{
yield return new WaitForSeconds(doubleTime);
if (!isDoubleClick)
{
Debug.Log("onClick");
onClick?.Invoke();
}
}
}
}
Unity UI Button实现单击、双击以及长按
最新推荐文章于 2024-03-19 15:17:38 发布