ソースコード
LongPressEventTrigger
public class LongPressEventTrigger : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerClickHandler
{
// 0.3秒以上押したままだと長押し
private const int longPressMillisecound = 300;
private bool pressing;
private bool disableClick;
public UnityEvent OnLongPress;
public UnityEvent OnClick;
public async void OnPointerDown(PointerEventData eventData)
{
var token = this.GetCancellationTokenOnDestroy();
pressing = true;
disableClick = false;
var result = await UniTask.WhenAny(
UniTask.Delay(longPressMillisecound, cancellationToken: token),
UniTask.WaitWhile(() => pressing, cancellationToken: token));
if (result == 0)
{
pressing = false;
disableClick = true;
OnLongPress.Invoke();
}
}
public void OnPointerUp(PointerEventData eventData)
{
pressing = false;
}
public void OnPointerClick(PointerEventData eventData)
{
if (!disableClick)
{
OnClick.Invoke();
}
}
}
OnPointerDownの中で”if (result == 1) OnClick.Invoke();”のようにしてしまうとスクロール動作時に反応してしまうのでOnPointerClickを使用しています。