공부 기록/유니티 Unity

[Unity] 코루틴 활용 기록

톰마토 2025. 3. 12. 23:38
728x90

코루틴은 작업을 다수의 프레임에 분산하는 메서드다. 즉 시간이 걸리는 작업을 프레임을 멈추지 않고 실행할 수 있도록 하는 기능이다. 실행을 일시 정지하고 제어를 Unity에 반환하지만 중단한 부분에서 다음 프레임을 계속할 수 있는 메서드다.
=> 한 프레임에서 모든 작업을 처리하지 않아도 되고, 연속적으로 작동하도록 할 수 있다.

 

코루틴과 함께 yield 키워드를 사용하여 특정 조건이나 시간이 걸릴 때까지 대기시킬 수 있다.  

 

코루틴은 스레드가 아니다. 겉보기에 멀티 스레드마냥 보이지만 사실 단일 스레드로 동작하는 동기식이다. 

비동기처럼 보이는 동기.

 

 

 

코루틴 사용 예시 

1. 코드 사이에 몇초 대기시키기

코루틴을 배운 이후로는 Invoke 대신 많이 사용하게 되는 것 같다 

void Start()
{
    StartCoroutine(ExampleCoroutine());
}

IEnumerator ExampleCoroutine()
{
    Debug.Log("코루틴 예시 1번");

    yield return new WaitForSeconds(2f); // 2초 대기

    Debug.Log("2초 후 실행됨!");
}

2. 다음 프레임까지 대기

IEnumerator FrameWaitExample()
{
    Debug.Log("코루틴 예시 2번");
    
    yield return null; // 다음 프레임까지 대기
    
    Debug.Log("다음 프레임에서 실행됨!");
}

🔄️ 반복 실행시키는 방법

코루틴으로 실행시키는 함수 내에 while문과 yield return문을 사용하면서 게임 진행과 동시에 반복작업을 할 수 있다. 

예시 1

3D 개인 과제 때 사용해보았다. 카메라를 부드럽게 회전하는 코드이다.

 

예시 2

유니티 입문 팀 프로젝트로 제작한 '레전드 닌자' 게임에서 공격을 구현할 때 사용되었다(by 태겸님). 닌자가 공격할 때 같이 발사되어야 하는 무기들의 Attack을 코루틴으로 계속 돌리고 있다.

갖고 있는 무기의 모든 공격코루틴 시작 함수를 실행

그리고 코루틴으로 공격의 딜레이를 설정해준 모습이다. 레전드 닌자는 캐릭터가 멈춰있을 때 계속 자동으로 공격이 나가기 때문에 공격을 구현하신 팀원분께서 while 코루틴을 활용하셨다. 

공격과 관련된 코루틴 함수들


그 외 yield return 종류

  • yield return new WaitUntil(조건) 조건이 참이 될 때까지 대기
yield return new WaitUntil(() => Input.GerKeyDown(KeyCode.Space)); // 스페이스 키 누를 때까지 대기

 

  • yield return new WaitWhile(조건) 조건이 거짓이 될 때까지 대기
yield return new WaitWhile(() => Time.time < 5f); // 게임 시간이 5초 미만인 동안 대기

 

  • yield break 코루틴 실행 즉시 종료 
IEnumerator CoroutineWithBreak()
{
    Debug.Log("작업 시작");
    yield return new WaitForSeconds(1f);
    Debug.Log("코루틴 종료");
    yield break; // 코루틴 강제 종료
}
728x90