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 |