Prosto

코루틴이란? 사용법은? 본문

Programing/Unity 3D

코루틴이란? 사용법은?

Prosto 2016. 9. 13. 16:06

C#의 기능 중 코루틴이라는 기능에 대하여 알아보고

실제로 유니티의 C# 스크립트를 이용하여 어떻게 사용하는지 예제를 통하여 확인해보겠습니다.

 

개념적인 부분을 잡기 위하여 작성한 포스팅으로

이미 작업해두었던 '따라하는 유니티 2D 프로젝트ⓐ -1'에서 이동 부분을 수정하도록 하겠습니다.

(실제로 구현해서 확인해보고 싶으시다면 위 프로젝트ⓐ 1번까지 따라하신 후 해보시는 것도 좋을 것 같습니다.)

 

 

 

그럼 먼저 C#의 코루틴이란 어떤 것이고, 어떻게 작동하는지 알아보겠습니다.

 

먼저 코루틴이란 무엇일까요?

코루틴이라는 것은 어떠한 작업을 처리할 때 필요에 따라

시간 간격을 두고 작업을 처리할 수 있도록 도와주는 함수 형식입니다.

 

코루틴과 Unity에서의 Update 혹은 FixedUpdate를 비교해본다면

   - Update(매 프레임 호출), FixedUpdate(1초 당 정해진 횟수 호출 (50회 40회 등) )

 

예를 들어 설명하겠습니다.

 게임에서 어떤 아이템을 사용하면 캐릭터가 버프를 받을 수 있다고 생각해봅시다.

 이때 Update나 FixedUpdate에서 버프의 유무를 확인한다면 모든 프레임에(혹은 1초에 4-50회)

 if문으로 조건을 확인하게 될 것입니다. 현재 버프가 활성화 됐나? 버프는 끝나려면 얼마 남았지?하고 말이죠.

 그렇지만 코루틴에서는 그 경우를 간단하게 처리합니다. 아이템 효과가 10초라면 그 효과를 가지고 있는 코루틴 함수를 실행시키고

 그 코루틴 함수에서는 10초 후에 버프를 종료시키면 됩니다.

 

 

외부의 아이템에 존재하는 스크립트가 플레이어가 가지고 있는 스크립트에 아이템을 먹었다고 알려준다고 하면

플레이어에겐 이런 스크립트가 필요할 것입니다.

 

먼저 업데이트만을 사용한다면.

void Update(){

    if(buffOn){

      //버프 효과 적용. + 지속 시간 체크하여 시간이 만료되면 buffOn을 false로 상태 전환.

      // (효과 적용이야 단발성으로 가능하지만 종료시기가 있다면 체크해야겠죠?)

    }
}

 

그리고 코루틴을 사용한다면.

void Update(){

   //에서 시간 체크나 효과 적용 불필요.
}

IEnumerator BuffCoroutine(){

  //1.버프효과 적용.

  //2.시간 대기(10초). yield return new WaitForSeconds(10.0f);

  //3.버프효과 종료 후 코루틴 함수 끝.
}

 

 

이런식으로 코루틴과 업데이트에서 사용되는 차이가 있습니다.

하지만 매 프레임 처리되어야 하는 작업은 Update를 이용하는 것이 코루틴을 사용하는 것보다 낫습니다.

코루틴은 일정시간 기다리라는 명령을 주고 기다렸다가 작업하는 형식이지만,

업데이트는 애초에 매프레임 사용하기 위하여 만들어진 함수니까 차이가 있겠죠?

그렇지만 매 프레임 처리하는 작업을 제외하고는 코루틴이 더욱 효과적입니다.

(예를 들어 1초에 5번 처리한다고 해도 1초에 50번 읽는 것과 1초에 5번 읽는 것은 차이가 크다고 볼 수 있죠.)

 

 

그렇다면 실제로 코루틴을 작성해보겠습니다.

현재 진행중이던 프로젝트에서 캐릭터 이동을 변경시킨 것이기 때문에

많은 프레임 호출이지만 코루틴으로 만들었습니다.

 

기존의 FixedUpdate에서의 플레이어 이동을 코루틴에서의 플레이어 이동으로 전환하는 것을

'따라하는 유니티 2D 프로젝트ⓐ -1'까지 작업한 상태라고 보고 설명하겠습니다.

간단합니다. 코루틴 자체도 프로그래밍 소스이니

그 소스만 변경해주면 됩니다.

 

먼저 이전의 소스입니다.

FixedUpdate를 이용하여 이동처리가 되고 있습니다.

 

코루틴을 이용하여 이동처리가 되고 있습니다.

 

실제로 소스를 바꿔서 사용해봐도

볼이 이동하는 것을 확인할 수 있습니다.

 

일정 시간 간격으로 처리하는 경우 저렇게 무한루프를 걸어서 사용할 수도 있고,

특정 조건 만족하는 동안이면 저 부분을 bool 변수를 위치시켜 true -> false로 전환하여 코루틴을 종료시킬 수도 있습니다.

 

---------추가적으로...

1회성 코루틴이라면 이렇게 하면 되겠죠?

    IEnumerator AttackFunc()
    {

        //검을 휘두르는 애니메이션

        yield return new WaitForSeconds(0.2f);

        //실제 공격 효과 적용(데미지 줌)
    }

이런식으로 만들어놓고 공격버튼을 눌렀을 때 StartCoroutine("AttackFunc");으로 코루틴을 호출할 수도 있을 것입니다.

 

 

코루틴은 유니티 프로그래밍에서 굉장히 유용하게 많이 사용됩니다.

여러 방법으로 사용해보며 익혀 실제로 프로그래밍에 녹여 사용한다면 좋을 것 같습니다.

Comments