Unity/Unity Study

[Unity] 클리키 게임 팀 프로젝트 중, 여러번 눌림 현상

Jee-U 2025. 4. 3. 20:19

 

 

 

클리키 게임을 만들고 있는 중 레벨업을 위해 버튼이벤트를 작성해주었다.

레벨업 버튼을 눌렀을 때 한번씩 정상적으로 강화가 되던 기존 시스템에, 버튼을 꾹 누르고 있으면 자동으로 연속 강화되는 기능을 추가했다. 이를위해 이벤트 트리거를 활용하였는데 기능 추가 후 버튼을 한번만 눌러도 강화가 두번 실행되는 문제가 발생했다.

public class PlayerUpgrade : MonoBehaviour
{  
    // 버튼이벤트 메서드
    public void UpgradeClick()
    {
    	int gold = playerStat.upgradeGold; // 강화 비용 가져오기

    	if (player.gold >= gold)
    	{
        	player.gold -= gold;            // 골드 차감
        	playerStat.UpgradeBonus();      // 보너스 스탯증가
        	player.UpdateTotal();           // 토탈 스탯
        	UpdateUI();
    	}
    }

    public void OnButtonDown()
    {
        if (upgradeCoroutine == null) // 실행중일경우 중복실행 방지
        {
            isHolding = true;
            upgradeCoroutine = StartCoroutine(UpgradeLoop()); // 코루틴 시작
        }
    }

    // 버튼 이벤트트리거 - 떼는 순간 실행
    public void OnButtonUp()
    {
        isHolding = false; // false로 변경
        if (upgradeCoroutine != null) // 실행중인 코루틴이 있으면
        {
            StopCoroutine(upgradeCoroutine); // 코루틴 중지
            upgradeCoroutine = null; // 변수 초기화
        }
    }

    // 반복실행
    private IEnumerator UpgradeLoop()
    {
        //yield return new WaitForSeconds(delayTime);

        while (isHolding) // 버튼을 누르고있는동안 실행
        {
            UpgradeClick();
            yield return new WaitForSeconds(repeatRate); // 일정시간 기다림
        }
    }
}

원인은 기존에 버튼 클릭 시 버튼이벤트 (UpgradeClick())가 한번 실행되었지만, OnButtonDown()에서 추가로 실행되는 UpgradeLoop() 코루틴이 즉시 시작되면서 첫번째 클릭이 중복으로 처리된 것이었다.

그래서 UpgradeLoop() 코루틴의 시작부분에 yield return new WaitForSeconds(delayTime);을 추가하여 처음 일정시간(0.5초) 동안은 실행되지 않도록 설정했더니 정상적으로 작동한다!