오늘은 시간의 흐름이 있는 절차를 순서대로 표현할 때 사용하는 코루틴에 대해 정리해보겠습니다.
일반적인 함수는 한 번 호출되면 끝날 때까지 제어할 수 없습니다.
하지만 코루틴은 실행을 일시정지하고 나중에 정지된 시점부터 다시 실행할 수 있는 함수입니다.
코루틴을 사용하기 위해서는 다음의 문법을 이해하고 있어야합니다.
public Ienumerator SimpleCoroutine()
{
Debug.Log("코루틴 시작.");
}
public Ienumerator SimpleCoroutine()
{
Debug.Log("코루틴 시작.");
yield return new WaitForSeconds(3.0f);
Debug.Log("3초 후 동작");
}
yield return에는 다음과 같은 것들을 사용할 수 있습니다.

void Start()
{
StartCoroutine(SimpleLogLoop()); // 매개 변수 없이 코루틴 실행
StartCoroutine(LogWithMessage(3.0f, "몬스터가 생성되었습니다!")); // 매개변수 전달
}
<style>
using System.Collections;
using UnityEngine;
public class StopCoroutineExample : MonoBehaviour
{
private Coroutine attackRoutine;
private void OnEnable()
{
attackRoutine = StartCoroutine(AutoAttack());
}
private void OnDisable()
{
if (attackRoutine != null)
{
StopCoroutine(attackRoutine);
attackRoutine = null;
}
}
private IEnumerator AutoAttack()
{
while (true)
{
Debug.Log("공격!");
yield return new WaitForSeconds(1f);
}
}
}
</style>
코루틴은 다음과 같은 특징을 가지고 있습니다.
멀티 스레드x
코루틴은 Main Thread에서 동작합니다. 무거운 연산을 처리하는 용도가 아닌 흐름과 시간을 제어하는 용도로 사용합니다.
오브젝트 비활성화 시 중단
코루틴을 실행하는 GameObject가 비활성화 되거나 파괴되면, 실행 중이던 코루틴도 자동으로 강제 중단됩니다.
가비지 컬렉션 최적화
yield return new WaitForSecond(); 에서 new 키워드는 메모리 가비지를 생성합니다.
따라서 자주 호출되는 경우 변수에 미리 선언해두고 재사용하는 것이 중요합니다.
Time.timeScale의 영향
WaitForSeconds는 게임의 타임스케일의 영향을 받기 때문에 일시정지 상태에서도 현실 시간을 측정하기 위해서 WaitForSecondsRealtime을 사용해야합니다.
오늘은 코루틴에 대해서 정리해보았습니다. 이전 프로젝트에서 DOTween을 활용하여 페이드인/아웃이나 시퀀스를 통해서 순차적인 연출을 진행하였는데 그때는 코루틴을 몰라서 DOTween으로만 처리 가능한 줄 알았지만, 지금은 코루틴을 알게 되었으니 전체적인 개발 부분에서 더 다양하게 활용할 수 있을것 같습니다.