1초마다 로그를 찍는 함수를 각각 Invoke 방식과 Coroutine 방식으로 호출하는 예제이다.


void OnEnable()

{

InvokeRepeating("Func1", 0, 1.0f);

StartCoroutine(Func2());

}


void Func1()

{

Debug.Log("Invoke");

}


IEnumerator Func2()

{

while (true)

{

Debug.Log("Coroutine");

yield return new WaitForSeconds(1.0f);

}

}


컴포넌트가 활성화 됐을 때 Func1 과 Func2 를 각각 InvokeRepeating 과 StartCoroutine 으로 호출하고 있다.


이 상태에서 컴포넌트가 비활성화 되더라도 Func1 과 Func2 는 계속 수행된다. 단 게임 오브젝트가 비활성화되면 Coroutine 은 일시 정지하도록 되어 있기 때문에 Func2 는 수행되지 않고 Func1 은 여전히 호출된다.


다시 컴포넌트가 활성화가 됐다고 해보자. 결과는 Func1 과 Func2 가 매번 두 번씩 중복 호출된다. Invoke 혹은 Coroutine 모두 같은 함수에 대해 개별적인 호출로 본다.


이렇게 중복 호출되는 것을 막기 위해서 OnDisable 을 아래처럼 구현해주면 된다.


void OnDisable()

{

CancelInvoke();

StopAllCoroutines();

}


CancelInvoke 와 StopAllCoroutines 는 "현재 컴포넌트"에 존재하는 모든 Invoke 및 Coroutine 을 종료시킨다.

'유니티 - 이것저것' 카테고리의 다른 글

유니티를 유니티답게 사용하려면  (3) 2016.06.08
에셋번들 기초  (0) 2016.02.04
에셋 기초  (0) 2016.02.01
Frustum Testing  (0) 2016.01.09
안드로이드에서 수동으로 프로파일러 Attach 하기  (0) 2016.01.08
Posted by 카코데몬
,