[Unity] UI 롱 클릭 이벤트 처리 with UniRxUnity/UI2024. 6. 11. 10:23
Table of Contents
짧은 글
`ObservableLongPointerDownTrigger.cs`
- 판정을 원하는 UI오브젝트에 컴포넌트로 추가
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UniRx;
using UniRx.Triggers;
using UnityEngine.EventSystems;
public class ObservableLongPointerDownTrigger : ObservableTriggerBase, IPointerDownHandler, IPointerUpHandler
{
public float IntervalSecond = 1f;
Subject<Unit> onLongPointerDown;
Subject<Unit> onPointerDown;
Subject<Unit> onPointerUp;
float? raiseTime;
void Update()
{
if (raiseTime != null && raiseTime <= Time.realtimeSinceStartup)
{
if (onLongPointerDown != null) onLongPointerDown.OnNext(Unit.Default);
raiseTime = null;
}
}
void IPointerDownHandler.OnPointerDown(PointerEventData eventData)
{
raiseTime = Time.realtimeSinceStartup + IntervalSecond;
if (onPointerDown != null)
onPointerDown.OnNext(Unit.Default);
}
void IPointerUpHandler.OnPointerUp(PointerEventData eventData)
{
raiseTime = null;
if (onPointerUp != null)
onPointerUp.OnNext(Unit.Default);
}
public IObservable<Unit> OnLongPointerDownAsObservable()
{
return onLongPointerDown ?? (onLongPointerDown = new Subject<Unit>());
}
public IObservable<Unit> OnPointerDownAsObservable()
{
return onPointerDown ??= new Subject<Unit>();
}
public IObservable<Unit> OnPointerUpAsObservable()
{
return onPointerUp ??= new Subject<Unit>();
}
protected override void RaiseOnCompletedOnDestroy()
{
if (onLongPointerDown != null)
{
onLongPointerDown.OnCompleted();
}
if(onPointerDown != null)
{
onPointerDown.OnCompleted();
}
if(onPointerUp != null)
{
onPointerUp.OnCompleted();
}
}
}
`LongPointerDownTester.cs`
- 사용법
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UniRx;
public class LongPointerDownTester : MonoBehaviour
{
public ObservableLongPointerDownTrigger trigger;
private void Start()
{
trigger.OnLongPointerDownAsObservable().Subscribe(val =>
{
Debug.Log("Long Click");
});
trigger.OnPointerUpAsObservable().Subscribe(val =>
{
Debug.Log("Pointer Up");
});
trigger.OnPointerDownAsObservable().Subscribe(val =>
{
Debug.Log("Pointer Down");
});
}
}
여담
사실 평범한 `Pointer Up&Down`의 경우는 `Event Trigger`컴포넌트를 쓰면 되긴한다
근데 이왕이면 롱클릭, 포인터 업&다운 셋 다 같은 방식으로 이벤트를 관리하면 좀 더 보기 좋지않을까 싶었다
출처
UniRx 저장소 리드미에서 찾은 코드를 약간 커스텀 함
'Unity > UI' 카테고리의 다른 글
[Unity] 스크롤 렉트 스크롤에 따라 Element들 스케일 효과 주기 (0) | 2024.07.01 |
---|---|
[Unity] Grid Layout Group 좌우 여백 동적으로 균등하게 맞추기 (0) | 2024.06.11 |
[Unity] Button을 상속받아 커스텀하기 (0) | 2023.03.09 |
[Unity] UI드래그로 이동 시킬 때 범위 제한 (0) | 2022.08.29 |
[Unity] 마우스(포인터)가 UI위에 있는지 확인하기 (0) | 2022.05.11 |