Prosto
코루틴이란? 사용법은? 본문
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");으로 코루틴을 호출할 수도 있을 것입니다.
코루틴은 유니티 프로그래밍에서 굉장히 유용하게 많이 사용됩니다.
여러 방법으로 사용해보며 익혀 실제로 프로그래밍에 녹여 사용한다면 좋을 것 같습니다.
'Programing > Unity 3D' 카테고리의 다른 글
따라하는 유니티 2D 프로젝트ⓐ -3 (17) | 2016.09.15 |
---|---|
따라하는 유니티 2D 프로젝트ⓐ -2 (14) | 2016.09.14 |
따라하는 유니티 2D 프로젝트ⓐ -1 (40) | 2016.09.13 |
따라하는 유니티 2D 프로젝트ⓐ -0 (1) | 2016.09.11 |
유니티 프로젝트 생성과 기능 (0) | 2016.09.08 |