
터치 인터페이스 선언
방치형 게임을 하다 보면 일반 터치와 쭉 누르면 연속 터치가 존재한다.구현해보자
유니티에서 터치를 인식하는 인터페이스 IPointerDownHandler와 IPointerUpHandler를 상속받으면 알아서 터치를 감지한다

인터페이스 구현
아래 이터페이스를 구현해야 오류가 안 생긴다
OnPointerDown은 누를 때 콜백함수로 호출 된다
OnPointerUp은 누른 걸 땔 때 콜백함수로 호출 된다.

연속터치 감지하기
아직 코드를 모두 구현하지는 않았지만 가설을 하나 세워보자
isPush가 true인 경우를 연속터라고 생각해 보자.
timer를 0으로 초기화 하는 이유는 연속터치의 횟수를 조절하기 위해서이다 너무 빠르다 싶으면 0.01의 숫자를 늘려주면 된다.
자 그럼 연속 터치의 기준을 세우면 된다 1초 이상 꾹 누른 경우에만 isPush를 True로 만들면 된다.

코루틴 선언.

터치감지
버튼을 누르는 시점에 PushCoroutine 코루틴이 실행 되게 하자

이 코루틴은 정확히 1 초 뒤에 isPush를 true로 만든다.
내가 터치를 하기만 하면 1초 뒤에 isPush가 true.되어 아까 update문에서 무조건 타게 된다는 것이다.
우리가 원하는 것은 1초 PushCoroutine이 1초 뒤에 isPush를 true로 만들기 전에 버튼에서 손을 떼면 이 코루틴을 종료하면 되는 것이다 그러면 isPush가 true가 되지 않는다.

코루틴이 실행 중이지만 1.0f 이전에 손을 뗀 경우 코루틴이 종료 된다
버튼에서 손을 떼면 OnPointerUp 메서드가 실행 되면서 코루틴을 종료시키는데
1초가 이미 지낫다면 연속터치가 중단 되는 것이고
1초 전에 호출 된거라면 연속터치가 안 되는 것이다.

클릭 빠르게 한 경우 코루틴을 계속 종료시키기 때문에 연속터치로 판정되지 않는다.

버튼을 쭉 누르고 있는 경우 코루틴이 1초가 지나 isPush를 true로 해서 update문을 타서 연속터치로 인식하는것이다.

이런식으로 일반터치와 연속터치를 구분할 수 있다
그리고 버튼 클릭 할 때 작아졌다 커졌다 하는 모션은 두트윈 프로 에셋을 설치하였으며
아래와 같이 코드로 해야되는 것을

DoTween Animation 컴포넌트 추가하고 위 코드와 같이 아래 컴포넌트에서 설정하면 된다.
Punch/Scale 설정
Duration 0.2
Vector3 0.2 0.2 0.2

마지막을 애니메이션을 실행할 곳에서 dotween.DoRestart()를 호출하면 된다.


원본코드
using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class LevelupButton : MonoBehaviour,IPointerDownHandler,IPointerUpHandler
{
[SerializeField] Image expSlider;
[SerializeField] TextMeshProUGUI expText,atkText,goldText,hpText,getExpText;
[SerializeField] DOTweenAnimation dotween;
bool isPush = false;
float timer = 0.0f;
Coroutine _coroutine;
private void Update()
{
if (isPush)
{
timer += Time.deltaTime;
if (timer >= 0.01f)
{
timer = 0.0f;
dotween.DORestart();
Debug.Log("연속터치");
}
}
}
/* void ExpUp()
{
transform.DORewind();
transform.DOPunchScale(new Vector3(.2f, .2f), 0.25f);
}*/
public void OnPointerDown(PointerEventData eventData)
{
/*ExpUp();*/
dotween.DORestart();
_coroutine = StartCoroutine(PushCoroutine());
}
public void OnPointerUp(PointerEventData eventData)
{
Debug.Log("스탑터치");
isPush = false;
if(_coroutine != null)
{
StopCoroutine(_coroutine);
}
timer = 0.0f;
}
IEnumerator PushCoroutine()
{
yield return new WaitForSeconds(1.0f);
isPush = true;
}
}'유니티 > 구현내용정리' 카테고리의 다른 글
| 유니티 -방치형 프로젝트 (버튼 클릭 시 레벨업 적용하기) (2) | 2025.03.22 |
|---|---|
| 나누기 - 다음 Exp가 몇 오르는지 퍼센트 구하기 (0) | 2025.03.22 |
| 유니티 - 모바일에서 특정 해상도 UI 깨지는 문제 해결 (0) | 2025.03.19 |
| 유니티 방치형 프로젝트 - 아이템 획득 (이펙트) #2 (0) | 2025.03.19 |
| 유니티 방치형 프로젝트 - 아이템 획득 (포물선) #1 (1) | 2025.03.18 |
