
클리키 게임을 만들고 있는 중 레벨업을 위해 버튼이벤트를 작성해주었다.
레벨업 버튼을 눌렀을 때 한번씩 정상적으로 강화가 되던 기존 시스템에, 버튼을 꾹 누르고 있으면 자동으로 연속 강화되는 기능을 추가했다. 이를위해 이벤트 트리거를 활용하였는데 기능 추가 후 버튼을 한번만 눌러도 강화가 두번 실행되는 문제가 발생했다.
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초) 동안은 실행되지 않도록 설정했더니 정상적으로 작동한다!
'Unity > Unity Study' 카테고리의 다른 글
[Unity] 클리키 게임 팀 프로젝트 중, 스탯 생성 (enum 사용전) (0) | 2025.04.07 |
---|---|
[Unity] 개인과제, ATM 만들기 - 송금 (0) | 2025.03.31 |
[Unity] 개인과제, ATM 만들기 - JSON을 이용한 유저 저장 (0) | 2025.03.28 |
[Unity] 개인과제, ATM 만들기 - PlayerPrefs를 통한 유저 저장 (0) | 2025.03.26 |
[Unity] 개인과제, ATM 만들기 - 입금, 송금 (0) | 2025.03.25 |