농장 게임을 만들다가 밭을 선택할 때 꾹 눌렀을 시 밭에 작물을 심을 수 있도록 하는 코드를 만들기 위해서
고민을 하다가 여러가지 방식을 고민했습니다.
1. 타이머 방식
이 방식을 고민했을 때 IPointerEnter일 때 bool값을 true로 돌려서 Update에서 실행되는 함수를 만들 다음 일정 시간 즉, Time.deltatime이 지나면 실행시키는 방식을 생각했습니다.
하지만 이 방식은 꾹 누른다는게 아닌 그 안에 들어가있다는 것을 의미해서 제가 원하는 풀이 방식이 될 수 없었습니다.
2. 코루틴을 활용한 방식.
이 방식을 생각하고 나서 여러가지 방법을 시도한 끝에 이 방식으로 풀게 되었습니다.
IPointerDownHandler와 IPointerUpHandler를 통해서 OnPointerDown, OnPointerUp을 사용해서 코루틴을 돌렸습니다.
OnPointerDown시에 StartCorutine을 사용하고 OnPointerUp에 StopCoroutine을 하는 방식으로 했습니다.
처음에는 전역으로 bool값을 줘서 코루틴 내의 if문에 들어가지 않게 하려고 했지만 연속적으로 클릭을 했을 때 WaitForSecond가 끝났을 시 true가 되는 경우가 생기게 되어서 StopCoroutine을 채택하였습니다.
아래의 코드는 제가 사용한 코드입니다.
public void OnPointerDown(PointerEventData eventData) {
StartCoroutine("PressCheck");
}
public void OnPointerUp(PointerEventData eventData) {
StopCoroutine("PressCheck");
}
IEnumerator PressCheck(){
yield return new WaitForSeconds(1.0f);
//연속적으로 클릭하면 화면이 나온다. -> 그 이유는 연속적일 때 한 순간에 pressDownCheck가 true인 상황이 발생하기 때문이다. -> StopCoroutin으로 고침
if(isSelected == false && isPlanted == false){ //밭이 심어진 상태가 아니면서 밭이 선택되면 되도록 함.
gameObject.GetComponent<SpriteRenderer>().color = Color.yellow;
setVector3(gamePosition); //위치를 저장. -> 작물을 생성해야함.
corpListUI_ScrollView.SetActive(true);
isSelected = true;
}
}
'Unity 게임 개발' 카테고리의 다른 글
게임 개발 잡기술: Update에 선언된 Coroutine OnCollisionXX or OnTriggerXX보다 늦게 실행하기. (0) | 2021.09.17 |
---|---|
Unity Object Pooling (0) | 2021.06.17 |
C# Unity Delegate 설명 및 사용법 (0) | 2021.05.09 |
C# Unity [SerializeField]와 [HideInInspector] (1) | 2021.04.19 |
C# 추상메소드와 인터페이스 설명 (0) | 2021.04.14 |