Humility

아무리 노력해도 최고가 되지 못할 수 있다⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀그럼에도 노력하는자가 가장 겸손한 것 아닌가

공부하는 블로그

유니티/문법

[Unity] 유니티 C#) 코루틴(Coroutine)

새벽_글쓴이 2024. 12. 27. 14:44
반응형

코루틴의 사전적 의미

코루틴은 "Co" + "Routine"의 합성어이다

Co: '함께', '협력'을 의미하는 접두사

Routine: '일상적인 절차' 또는 '정해진 일련의 작업'을 의미

 

따라서 코루틴은 "협력하여 실행되는 루틴" 또는 "서로 협력하는 프로시저"라고 해석할 수 있다

 

유니티의 코루틴

실행을 일시 중지했다가 다시 시작할 수 있는 특별한 종류의 함수

일반적인 함수는 한 번 실행되면 끝까지 실행되어야 하지만,
코루틴은 다른 코루틴이나 메인 프로그램과 협력적으로

실행 시간을 공유하면서 작업을 수행할 수 있다

 

코루틴 사용법

// 코루틴 선언
IEnumerator MyCoroutine()
{
    Debug.Log("시작");
    yield return new WaitForSeconds(2f); // 2초 대기
    Debug.Log("2초 후 실행");
}

// 코루틴 시작
void Start()
{
    StartCoroutine(MyCoroutine());
}

 

코루틴의 종류

1. WaitForSeconds

yield return new WaitForSeconds(float seconds);
  • 지정된 시간(초) 동안 대기
  • 실제 시간 기준으로 동작
  • 게임이 일시정지되어도 계속 카운트됨

 

사용상황

  • 스킬 쿨타임 구현
  • 적 캐릭터의 공격 패턴 간 딜레이
  • UI 팝업이 표시되는 시간 제어
  • 게임 시작 전 카운트다운

 

2. WaitForSecondsRealtime

yield return new WaitForSecondsRealtime(float seconds);
  • 실제 시간을 기준으로 대기
  • Time.timeScale의 영향을 받지 않음
  • 게임이 일시정지되어도 계속 카운트됨

 

사용 상황

  • 일시정지 화면에서도 작동해야 하는 타이머
  • 게임 속도와 무관하게 동작해야 하는 UI 애니메이션
  • 실제 시간 기반 이벤트 처리

 

3. WaitForFixedUpdate

yield return new WaitForFixedUpdate();
  • 다음 물리 업데이트(FixedUpdate)까지 대기
  • 물리 연산과 관련된 작업에 주로 사용

 

사용 상황

  • 물리 기반 움직임 구현
  • 충돌 감지가 필요한 동작
  • 리지드바디를 사용하는 오브젝트 제어

 

4. WaitForEndOfFrame

yield return new WaitForEndOfFrame();
  • 현재 프레임의 렌더링이 모두 완료될 때까지 대기
  • 카메라 렌더링과 GUI 렌더링이 모두 완료된 후 실행

 

사용 상황

  • 스크린샷 찍기
  • 프레임 단위 렌더링 효과 적용
  • 후처리 효과 적용

 

5. WaitUntil

yield return new WaitUntil(() => condition);
  • 지정된 조건이 true가 될 때까지 대기
  • 조건을 람다식으로 전달

 

사용 상황

  • 플레이어의 특정 상태 대기
  • 애니메이션 완료 대기
  • 로딩 완료 체크
  • 특정 이벤트 발생 대기

 

6. WaitWhile

yield return new WaitWhile(() => condition);
  • 지정된 조건이 false가 될 때까지 대기
  • WaitUntil의 반대 개념

 

사용 상황

  • 로딩 중일 동안 대기
  • 특정 상태가 지속되는 동안 대기
  • 게임 일시정지 중 대기

 

7. null 반환

yield return null;
  • 다음 프레임까지 대기
  • 가장 기본적인 형태의 대기

 

사용 상황

  • 프레임별 점진적인 움직임 구현
  • UI 페이드 인/아웃 효과
  • 부드러운 카메라 이동
  • 최적화가 필요한 무거운 작업 분산 처리

 

8. Custom YieldInstruction

public class CustomYieldInstruction : YieldInstruction
{
    public override bool keepWaiting
    {
        get { return /* 조건 */; }
    }
}
  • 사용자 정의 대기 조건을 만들 수 있음
  • 복잡한 대기 로직 구현 가능

 

사용예시

// 1. 먼저 CustomYieldInstruction을 상속받는 사용자 정의 대기 조건을 만든다
public class WaitForScore : CustomYieldInstruction
{
    private int targetScore;
    private GameManager gameManager;

    public WaitForScore(GameManager gameManager, int targetScore)
    {
        this.gameManager = gameManager;
        this.targetScore = targetScore;
    }

    public override bool keepWaiting
    {
        get { return gameManager.currentScore < targetScore; }
    }
}

// 2. 사용방법
IEnumerator GameSequence()
{
    // 우리가 만든 커스텀 대기 조건을 사용
    yield return new WaitForScore(gameManager, 1000);
    Debug.Log("점수가 1000점을 넘었습니다!");
}

 

 

코루틴 제어

  • StopCoroutine(): 특정 코루틴 정지
  • StopAllCoroutines(): 모든 코루틴 정지
  • StopCoroutine(string): 이름으로 코루틴 정지

 

주의사항

  • 게임 오브젝트가 비활성화되면 코루틴도 정지됨
  • 코루틴을 너무 많이 사용하면 메모리와 성능에 영향을 줄 수 있음
  • MonoBehaviour를 상속받는 클래스에서만 사용 가능
반응형