DEV/Unity

Unity 코루틴(coroutine) 관련하여 ..

꿀먹는돼지 2022. 7. 2. 20:03

일반 함수를 실행하면, 값을 반환하기 전에 실행이 완료된다.

그래서 (일정)시간이 지난 후에 실행되어야 하는 이벤트 호출에 사용할 수 없다.

ex. 페이드와 같은 애니메이션 처리를 일반 함수에 처리할 수 없다. 

 

그래서 코루틴 함수를 사용하여 중간에 시간(프레임)정지 처리도 할 수 있는 방법이 있다. 

 

 

 

근데, 해당 이벤트 처리 후에 값을 받아오고 싶어졌다.

return bool 을 원해서 찾아본 결과

 

1. 코루틴이 끝나면 함수가 실행되도록 

    public void callbackTest(){
        //for Lambda
        StartCoroutine(callbackTestCor((x) =>
        {
            Debug.Log("ServerCallBackTest: " + x);
        }
        ));   
    }
    IEnumerator callbackTestCor(System.Action<int> callback){
        yield return new WaitForSeconds(5f);
        callback(-1);
    }

 

5 초후에 로그가 찍히는 것을 확인할 수 있다.

ServerCallBackTest: -1

 

2. 다른 스크립트의 코루틴을 실행하기 


서버 컨트롤러 스크립트 ServerController가 있다고 할 때, 

다른 스크립트에서 서버쪽 코루틴 메소드를 실행하고 싶을때

ServerController ServerC; // 코루틴을 가지고 있는 클래스 인스턴스

ServerC.StartCorutine(method()); 는 실행되지 않는다.

ServerC.StartCorutine(ServerC.method()); 는 실행된다.

 

 

 

3. 서버 응답에 따른 Client 분기 처리


========== Client 
    public void rewardGift(int seq) {
        //1. 서버에 선물 사용 처리 요청 
        ServerC.StartCoroutine(ServerC.UseGift(seq, (callback) => {
            if(callback ==1){
                UseLocalGift();
            }else{
                Debug.Log("서버 접속 실패");
            }
        }
        ));
    }
    
    
    ========== SERVER 
        public IEnumerator UseGift(int seq, System.Action<int> callback) {
        ...
                if (request.result != UnityWebRequest.Result.Success){
                    callback(-1);
                } else {
                    callback(1);
                }
        }

 

Ref 


https://docs.unity3d.com/kr/530/Manual/Coroutines.html

 

코루틴 - Unity 매뉴얼

함수를 호출하면 값을 반환하기 전에 실행 완료됩니다. 이는 함수에서 수행되는 모든 액션이 하나의 프레임 업데이트 내에서 발생해야 한다는 것을 의미합니다. 시간이 지남에 따라 절차식 애

docs.unity3d.com

https://sunpil.tistory.com/70