Coroutine과 InvokeRepeating는 Update와는 다른, 별도의 시간의 간격으로 실행되는 동작을 구현할 수 있다.
Coroutine
- frame 단위의 작업을 수행할 수 있으며, 도중에 일시 정지가 가능하다, 재개는 다음 frame부터 진행된다.
- 매개변수를 전달해 줄 수 있다.
- 코루틴은 멀티스레드 작업이 아니다. 유니티에서 멀티스레드처럼 보이고, 그렇게 사용할 수 있도록 만들어 둔 것이다.
- 실제 코루틴은 비동기적 처리로, yield return을 통하여서 흐름을 넘겨주는 방식으로, 일을 나누어서 처리한다.
using UnityEngine;
using System.Collections;
public class CoroutineTest : MonoBehaviour
{
private void Start()
{
StartCoroutine(Test());
}
private IEnumerator Test()
{
while(true)
{
Debug.Log("InvokeRepeating Test");
yield return null;
}
}
}
//실행 결과 : 매 프레임 마다 Log가 찍힌다.
InvokeRepeating
- 지정된 시간 이후부터, 일정한 간격으로 동작을 수행한다.
- 매개변수가 없는 메서드만 호출 가능하다.
- 한번 실행된 이후에는 cancelInvoke를 통해서 종료하거나, 스크립트 또는 스크립트가 부착된 오브젝트가 삭제되지 않는 이상, 무한히 호출된다.
- 스크립트 또는 스크립트가 부착된 오브젝트가 비활성화 된다고 하여서, 호출이 멈추는 것이 아니라는 점을 명심하여서 사용해야 한다.
using UnityEngine;
public class InvokeRepeatingTest1 : MonoBehaviour
{
private void Start()
{
InvokeRepeating("Test", 1, 1);
}
private void Test()
{
Debug.Log("InvokeRepeating Test");
}
}
//실행 결과 : 1초 후부터, 1초마다 Log가 찍힌다.
using UnityEngine;
public class InvokeRepeatingTest2 : MonoBehaviour
{
private void Start()
{
InvokeRepeating("Test", 1, 1);
Invoke("StopInvokeRepeating", 5);
}
private void Test()
{
Debug.Log("InvokeRepeating Test");
}
private void StopInvokeRepeating()
{
CancelInvoke("Test");
}
}
//실행 결과 : CancelInovke로 5초 후에 실행되던 InokeRepeating으로 실행한 Test가 동작하지 않는다.
Coroutine과 InvokeRepeating의 비교
성능
- Coroutine
- 하나의 메서드 자체를 담고 있기에 호출이 빠르다.
- InvokeRepeating
- 호출할 메서드의 이름을 통한, 리플렉션 방식의 호출로, 같은 작업을 처리한다는 가정 하에 Coroutine보다 느리다.
사용
- Coroutine
- 매개변수를 사용할 수 있다.
- Coroutine을 변수로 관리할 수 있다.
- InvokeRepeating
- 매개변수를 사용할 수 없다.
- 실행 중인 InvokeRepeating은 시작 대기 시간과 실행 시간의 간격을 변경할 수 없다. 대신 Invoke를 활용해 만든 재귀 함수로 실행 시간의 간격이 계속 바뀔 수 있도록 구현할 수 있다.
유니티에서는 위의 두 방법 중에서 Coroutine 사용하기를 권장한다.
using UnityEngine;
public class Test : MonoBehaviour
{
private Coroutine coroutineTest = null;
private void Start()
{
coroutineTest = StartCoroutine(Test());
Invoke("StopCoroutineTest", 5);
}
private void StopCoroutineTest()
{
//StopAllCoroutine(); 모든 코루틴 종료
StopCoroutine(coroutineTest);
}
private IEnumerator Test()
{
while(true)
{
Debug.Log("Coroutine Test");
yield return new WaitForSeconds(1f);
}
}
}
//실행 결과 : Test 코루틴이 5초 동안 실행된 후에 종료된다.'유니티 > 개념 정리' 카테고리의 다른 글
| Exception(예외 처리) (0) | 2024.08.07 |
|---|---|
| ref와 out (0) | 2024.08.02 |
| Addressable Asset System (0) | 2024.07.27 |
| Asset Bundle (0) | 2024.07.24 |
| 직렬화(Serialize) (0) | 2024.07.24 |