본문 바로가기
Unity 게임 개발

Unity C#으로 꾹 눌렀을 때 상태변화 시키기

by daisy0461 2021. 9. 10.

농장 게임을 만들다가 밭을 선택할 때 꾹 눌렀을 시 밭에 작물을 심을 수 있도록 하는 코드를 만들기 위해서

고민을 하다가 여러가지 방식을 고민했습니다.

 

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;                          
        }
    }