[Unity2018.3.0f2] 코루틴 - 유니티에서 While문 멈추지 않고 돌리기.

별거 아닌 얘기긴 한데, 한창 유니티 배우던 때, While문으로 내부에서 돌리고 싶은데 쓰면 거의 반드시 멈추기 때문에 골치아팠던 때가 있습니다.

Update에서 주로 돌렸는데, 업데이트에서 while문을 돌리게 되면, 대충 잡아서 몇만회 이상 돌아가기 시작하면 Update에서 뻗어버리는 문제가 있었죠.

그 때 가장 흔하게 쓰던 방법으로 Coroutine 시스템이 있습니다.

While은 코드의 컨트롤을 넘기지 않고 자기 자신이 끝날때까지 모든 일을 중단하고 잡고 있기 때문에 코드 중간에 넣어서 사용하기 시작하면 그 일을 끝날때까지 모든 코드의 일이 멈춰버리기 때문에, 부하가 심하게 걸리는 작업에 들어가버리면 가끔 멈춰버리기도 합니다.

1
2
3
4
5
6
7
void Start() // Unity Stop!
{
    while(true)
    {
        Debug.Log("Hello, World!");
    }
}
cs

그럴때 멈추지 않고 사용하기 위해서 특정 행위가 종료된 후 컨트롤을 다시 넘겨주고, 다시 돌아왔을때 해당 작업을 진행할 수 있도록 하는 내용입니다.

다음은 0.2초마다 1씩 더한 내용을 출력하는 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
    void Start()
    {
        StartCoroutine(IncreaseCoroutine());
    }    
    IEnumerator IncreaseCoroutine()
    {
        while(true)
        {
            increaseInt++;
            Debug.Log(increaseInt);
            yield return new WaitForSeconds(0.2f);
        }
    }
cs

IEnumerator  로 선언한 함수에 Yield return 을 넣어 컨트롤을 해제시켜주도록 합니다. 다시 컨트롤을 가져오는 지점이 yield return 지점이 됩니다.
이렇게 만든 코루틴은 StartCoroutine으로 사용하면 됩니다. 그냥 함수처럼 실행시키면 일반 함수와 똑같이 사용됩니다.

해당 코루틴을 사용한 예제입니다. 0.2초마다 증가시켰으니 초당 5씩 증가한 셈이네요.

코루틴 예제를 사용해 보았습니다.

절대로 귀찮아서 짧게쓴게 아닙니다 시간이 없었을 뿐

참고자료

유니티 코루틴 메뉴얼

댓글

이 블로그의 인기 게시물

[Unreal] AnimNotify 애님 노티파이 시스템.

[Unreal 4.20] 애니메이션 블루프린트에 캐릭터 가져오기.