코루틴(Coroutine)은 시간에 걸쳐 실행되는 작업을 처리할 수 있도록 해주는 기능이다.
일반적인 함수는 한 번 호출되면 즉시 실행을 완료하지만,
코루틴은 실행을 잠시 멈췄다가 이후 특정 조건이 충족되면 다시 실행한다.
비동기적 작업 처리: 특정 시간동안 기다리거나 반복적인 작업을 수행할 때 사용됨.
IEnumerator 반환 타입 사용: IEnumerator 타입을 반환해야 하고, 'yield return' 키워드를 사용해 실행을 일시 정지할 수 있음.
StartCoroutine으로 실행: StartCoroutine(코루틴함수()) 형태로 호출해야 함.
4. 게임 오브젝트가 비활성화되면 중지: 코루틴을 실행하는 오브젝트가 비활성화되거나 제거되면 해당 코루틴도 자동으로 중지됨.
ex)
public class Coroutine : MonoBehaviour
{
void Start()
{
StartCoroutine(PrintNumbers()); // 코루틴 실행
}
IEnumerator PrintNumbers()
{
for (int i = 1; i <= 5; i++)
{
Debug.Log(i);
yield return new WaitForSeconds(1f); // 1초 대기
}
}
}
Start()에서 StartCoroutine(PrintNumbers())를 호출하면 PrintNumbers()가 실행.
for 문이 루프 1부터 5까지 반복하며 Debug.Log(i) 실행.
IEnumerator 반환 타입 사용하고 yield return new WaitForSeconds(1f); 로 인해 각 숫자가 1초 간격으로 출력.
1. yield return null
2. yield return newWaitForSeconds(시간)
3. yield return newWaitForSecondsRealTime
4. yield return new WaitForEndOfFrame();
5. yield return new WaitUntil(조건)
ex) yield return new WaitUntil(() => Time.time > 10f);
게임 내 시간이 10초를 초과할 때까지 대기
6. yield return new WaitWhile(조건)**
ex) yield return new WaitWhile(() => Input.GetKey(KeyCode.Space));
스페이스바가 눌려있는 동안 기다리기
7. yield break
코루틴을 완전히 중지하고 싶다면
StopCoroutine() 또는 StopAllCoroutines() 사용하기
ex)
IEnumerator Coroutine()
{
while (true)
{
Debug.Log("Running...");
yield return new WaitForSeconds(1f); //1초 대기
}
}
void Start()
{
StartCoroutine("Coroutine");
Invoke("StopMyCoroutine", 5f); // 5초 후에 중지
}
void StopCoroutine()
{
StopCoroutine("Coroutine"); // 특정 코루틴 중지
// StopAllCoroutines(); // 실행 중인 모든 코루틴 중지
}
장점
단점
bool isShoot = true;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space) && isShoot) //스페이스바 누르면 쏘기
{
StartCoroutine(Shoot());
}
}
IEnumerator Shoot()
{
isShoot = false;
Debug.Log("총알 발사!");
yield return new WaitForSeconds(1f); // 1초 대기
isShoot = true;
}
실행 방식 : 조건이 만족될 때까지 즉시 실행
흐름 제어 : 한 번 시작하면 끝날 때까지 멈출 수 없음
프레임 영향 : 한 프레임 내에서 반복 실행
사용 목적 : 단순한 연산 반복
EX)
void PrintNumbers()
{
for (int i = 1; i <= 5; i++)
{
Debug.Log(i);
}
}
실행 방식 : 일정 시간 동안 실행을 멈췄다가 다시 실행 가능
흐름 제어 : yield return으로 중단 및 재개 가능
프레임 영향 : 여러 프레임에 걸쳐 실행 가능
사용 목적 : 시간 지연, 애니메이션, 비동기 처리
EX)
IEnumerator PrintNumbersCoroutine()
{
for (int i = 1; i <= 5; i++)
{
Debug.Log(i);
yield return new WaitForSeconds(1f); // 1초 대기
}
void Start()
{
StartCoroutine(PrintNumbersCoroutine());
}
}
반복 작업이 일정 시간 간격을 가져야 할 때
비동기 작업(네트워크 요청, 데이터 로딩 등)을 처리할 때
애니메이션이나 이펙트를 부드럽게 실행할 때
프레임마다 상태를 업데이트해야 할 때
즉시 실행할 반복 작업이면 for나 while,
시간이 걸리는 반복 작업이면 코루틴