본문 바로가기
유니티/개념 정리

Coroutine과 InvokeRepeating

by fore4022 2024. 7. 27.

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