스크립트를 하나 만들어서 기능을 여러 가지 넣으려고 할 때 다음과 같은 문제점이 발생한다.

만약 Update() 메소드 안에 제어문을 통한 메소드 호출 식으로 코딩을 할 경우, 이미 사용된 기능들도 제어문을 거치는 작업을 계속 수행하여 연산을 낭비하게 된다.

서버에서 다운이 끝난 후 작업을 하려고 할 때, X초 후 작업을 할 때, 물리연산이 모두 끝난후 작업을 하려고 할 때 Update()이나 다른 메소드를 통해서 작업이 끝났는지 확인하는 작업을 해서 연산량이 늘어난다.

 

코루틴 쓰레드와 비슷한 개념으로 하나의 스크립트에서 동시에 2개 이상의 연산을 하도록 하는 것이다. 쓰레드와 다르게 모든 코루틴은 프레임단위(또는 지정해놓은 대기시간)마다 똑같이 작동된다.

따라서 Update문에 모든 코드를 넣어서 사용하지 않는 코드도 계속 연산시키는 것이 아닌 특정 상황마다 코루틴을 실행시켜서 연산의 낭비를 최소화 할 수 있다.

 

코루틴을 시작하는 함수

StartCoroutine(“코루틴함수이름”)

StartCoroutine(코루틴함수())

 

 

기본 구조 쓰레드와 유사하게 호출시 한번만 작동하기 때문에 반복문으로 감싸줘야 유지할 수 있다. (반복문을 쓰지않아도 되는 상황이면 없애도 된다)

IEnumerator 함수이름()

{

while(true)

{

...

}

}

이 구조에서는 return이 없어도 되지만 yield 라는 것으로 코루틴이 해당 조건이 될 때까지 실행을 일시정지시키는 기능을 사용하여야 한다. 무한반복문 구조안에 yield문이 없거나 1프레임안에 해야할 작업이 많다면 무한루프에 빠지거나 게임이 통째로 멈춰버린다.



<!--[endif]-->

유니티에서 지원하는 yield


다른 곳에서 쉽게 코루틴을 끌 수 있도록 하려면 다음과 같은 코드를 참고하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Coroutine currentRoutine;
 
    void Start ()
    {
        currentRoutine = StartCoroutine (DoSomthingCo());
    }
 
    void StopCurrentRoutine ()
    {
        if (currentRoutine != null) {
            StopCoroutine(currentRoutine);
            currentRoutine = null;
        }
    }
 
    IEnumerator DoSomthingCo ()
    {
        while (true)
        {
            // job
        }
    }
cs


코루틴 예시

1
2
3
4
5
6
7
8
9
10
11
    //소리를 점점 줄이는 코루틴
    IEnumerator bgmFadeout()
    {
        for(float i = m_volume; i>=0;i-=0.01f)      //현재 볼륨에서 0까지 줄이는 반복문
        {
            Mainbgm.volume = i;
            yield return new WaitForSeconds(0.1f);  //0.1초 뒤에 코루틴작동(yield문이 없으
                                                       면 바로 볼륨이 0이됨)
        }
        Mainbgm.Stop();
    }
cs


+ Recent posts