유니티 숙련 (2) - 코루틴

2025. 5. 19. 23:13·스파르타코딩클럽_Unity개발과정

1. 코루틴 이란?

정의: 작업을 다수의 프레임에 분산하는 메서드

 

yield return 구문이 나올 때 실행 일시 정지

다음 프레임에 중단한 부분에서 계속

 

Update()에 넣기에는 성능 상 매번 체크하기 애매하고

특정 이벤트에만 발동 시작하여 여러 프레임 이상 연속적으로 그 경과를 보아야 할 내용에 사용하기 좋습니다.

 

 

코루틴은 HTTP 전송, 에셋 로드, 파일 I/O 완료 등을 기다리는 것과 같이 긴 비동기 작업을 처리해야 하는 경우 사용하는 것이 가장 좋습니다.

주로 yield return WaitUntil() 를 람다식과 함께 사용하여 특정 프로세스가 끝날 때까지 대기하는 것과 함께 사용하고는 합니다.

 

 

유니티는 기본적으로 단일 스레드로 구성되며 이는 코루틴도 마찬가지입니다.
매 프레임마다 중단점에서 계속하기에 동시에 멀티로 구동되고 있는 것처럼 보일 뿐이지요.

 

아래와 같이 이벤트 함수 순서에 들어가 있습니다.

매 프레임 Update()의 실행 때 함께 동작

 

이벤트 함수 실행은 단일 스레드로  모노비헤비어에서 이루어지기에
모노비헤비어를 상속받은 클래스가 비활성화/파괴될 경우

해당 스크립트에서 동작 중인 코루틴들은 멈추게 됩니다.

 

 

2. 사용법

1) 네임스페이스

      System.Collections


2) 선언

     IEnumerator (메서드 이름)

 

3) 대기를 명령하는 구문

    yield를 붙여서 사용합니다.

    (1) 즉시 종료하고 싶을 때 : yield break;

    (2) 다음 프레임까지 대기 : yield return null;

    (3) 다음 픽스드업데이트까지 대기 : yield return new WaitForFixedUpdate();

    (4) n초 대기 : yield return new WaitForSeconds(n);

    (5) 타임스케일에 무관하게 실제 시간으로 n초 대기 : yield return new WaitForSecondsRealtime(n);

    (6) 특정 상태가 될 때까지 대기
          - yield return WaitUntil() + 람다식   :   조건이 참이 될 때까지 대기
          - yield return WaitWhile() + 람다식   :   조건이 참인 동안 대기

          예시)  yield return WaitUntil(() => n < 0);   :   n이 음수가 될 때까지 대기
                    yield return WaitWhile(() => n < 0);   :   n이 음수인 동안 대기

 

다른 구문들도 있기는 하나 주로 이 6가지 정도에서 구현이 가능했습니다.

 

4) 메서드 호출, 정지 관련

    (1) StartCoroutine(코루틴 메서드()); // 해당 코루틴 시작

    (2) StopCoroutine(코루틴 메서드()); // 해당 코루틴 정지

    (3) StopAllCoroutines(); // 동작 중인 모든 코루틴 정지

 

 

3. 사용 시 주의할 점!!!

1) 해당 코루틴이 동작하는 도중에 다시 StartCoroutine()을 사용하여 동일한 코루틴을 중복으로 돌리면,

     따로 객체가 생성되어 코루틴을 돌아 둘이 동일한 데이터를 조작하기에 의도와는 다른 동작을 하게 됩니다.

 

따라서, StartCoroutine() 전에 해당 코루틴이 동작하는지 체크해 주고 상황에 따라 알맞게 대처하면 됩니다.

해당 코루틴이 동작하고 있다면, 멈추고 재시작하게끔 해주는 구문입니다.

 

2) 프레임, 시간 동안 대기하는 구문들은 타임 스케일의 영향을 받습니다.

Time.TimeScale = 0; 인 상태에서 동작하지 않는 구문들이 있습니다.

 

yield return new WaitForSecondsRealtime(n); 을 이용하면

타임스케일이 0이더라도 실제 시간 n초 동안 대기할 수 있습니다.

 

 

활용 예시) ~초 동안 무적 + 깜빡임으로 상태 알림

bool 값인 isInvincible을 이용하여 코루틴 중임을 알리고, 무적 상태 유지에 사용하였습니다.

고정값인 FixedUpdate() 주기를 사용하여 대기 초를 확실히 맞추도록 하였습니다.

    // 매개변수(초) 동안 무적 상태 처리
    IEnumerator Invincible(float second)
    {
        // 무적 상태 진입
        isInvincible = true;

        // 깜빡깜빡 무적 상태 표시
        
        // 반투명하게 해주기 위해서는 색상의 알파 값을 조정해줘야 하는데
        // 스프라이트/메터리얼 색상 알파값에 직접 접근하여 바꿀 수 없음
        
        // 하지만! 항상 방법은 있는 법
        // 색상 변수를 하나 만들어서 알파 값을 변경
        // > 반투명하게 된 색상 값을 집어넣어 변경

        // 현재 반투명도를 나타낼 색상
        Color tempColor = Color.white;
        // 코루틴 시작(무적 시작) 후 얼마나 진행되었나 세어줄 카운터
        float loopCount = 0f;
        
        // 알파값(투명도) 변화량
        float alphaChange = 0.1f;

        // 무적 시간 내내 반복
        while (isInvincible)
        {
            // 루프 1번당 = 0.02초
            // 20번 반복하면 1번 깜빡임 = 0.4초

            // 좀 더 천천히 깜빡이게 하고 싶으면
            // 알파값 변화량을 줄이고, 루프 횟수를 늘리면 됨
            for (int j = 0; j < 20; j++)
            {
            	// 투명도 변화
                if (j < 10)
                    tempColor.a -= alphaChange;
                else
                    tempColor.a += alphaChange;
                Leon_mat1.color = Leon_mat2.color = tempColor;
                
                // 0.02초 대기
                yield return new WaitForFixedUpdate();
                loopCount += 0.02f;
                
                // 설정한 무적 시간이 지났다면
                if(loopCount >= second)
                {
                    // while 루프를 벗어날 수 있도록 설정 및 무적 시간 종료 
                    isInvincible = false;
                    // for루프 즉시 벗어나게끔
                    break;
                }
            }
        }
        // 마지막에는 원래 색상으로 복구
        Leon_mat1.color = Leon_mat2.color = Color.white;
    }

 

 

<< 참고 메뉴얼 >>

https://docs.unity3d.com/kr/current/Manual/ExecutionOrder.html

 

이벤트 함수의 실행 순서 - Unity 매뉴얼

Unity 스크립트를 실행하면 사전에 지정한 순서대로 여러 개의 이벤트 함수가 실행됩니다. 이 페이지에서는 이러한 이벤트 함수를 소개하고 실행 시퀀스에 어떻게 포함되는지 설명합니다.

docs.unity3d.com

 

https://docs.unity3d.com/kr/2021.3/Manual/Coroutines.html

 

코루틴 - Unity 매뉴얼

코루틴을 사용하면 작업을 다수의 프레임에 분산할 수 있습니다. Unity에서 코루틴은 실행을 일시 정지하고 제어를 Unity에 반환하지만 중단한 부분에서 다음 프레임을 계속할 수 있는 메서드입니

docs.unity3d.com

 

저작자표시 비영리 동일조건 (새창열림)

'스파르타코딩클럽_Unity개발과정' 카테고리의 다른 글

유니티 숙련 개인 과제 - 3D 게임 캐릭터 이동과 물리 (1)  (0) 2025.05.21
유니티 숙련 (3) - 서바이벌 강의 완강, 새로 배운 내용 정리  (0) 2025.05.20
유니티 숙련 - (1) 스카이박스, 인풋 시스템  (0) 2025.05.16
5주차 팀 프로젝트: 아마도.. 궁수의 전설 (2)  (0) 2025.05.15
5주차 팀 프로젝트: 아마도.. 궁수의 전설 (1)  (0) 2025.05.12
'스파르타코딩클럽_Unity개발과정' 카테고리의 다른 글
  • 유니티 숙련 개인 과제 - 3D 게임 캐릭터 이동과 물리 (1)
  • 유니티 숙련 (3) - 서바이벌 강의 완강, 새로 배운 내용 정리
  • 유니티 숙련 - (1) 스카이박스, 인풋 시스템
  • 5주차 팀 프로젝트: 아마도.. 궁수의 전설 (2)
ybbro
ybbro
대부분의 포스팅은 pc에서 작성되었습니다. 모바일에서 볼 때 설명이 잘리면 데스크탑 모드를 사용해보길 바랍니다.
  • ybbro
    어떻게든 굴리는 게임 공방
    ybbro
  • 전체
    오늘
    어제
    • 전체 N
      • 스파르타코딩클럽_Unity개발과정 N
      • Unity 2D
        • 카드게임
        • 플랫포머 게임
        • 뱀서라이크
      • Unity 3D
        • 닷지
        • 유니티 짱
        • 디펜스 게임
      • Unity 에러 노트
      • 기능 구현 방법 정리
      • 셰이더 그래프
        • 2D
        • 3D
      • 프로그래머스
      • 자료구조
      • 기타
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    직렬화
    텍스트매시프로
    UI
    hello
    unity
    갤럭시 S24
    룰렛
    다크모드
    무료스킨
    대시
    앱이 휴대전화와 호환되지 않아 설치되지 않았습니다
    sprite mask
    64비트
    유니티 애니메이터 파라미터 초기화
    삭제
    마스크
    세이브
    스파인
    유니티
    잔상
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
ybbro
유니티 숙련 (2) - 코루틴
상단으로

티스토리툴바