• 티스토리 홈
  • 프로필사진
    SiJun-Park
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
SiJun-Park
  • 프로필사진
    SiJun-Park
    • 분류 전체보기 (190)
      • Unity (148)
        • 출시 해보기 (Slime Company) (3)
        • 뱀서류 Project (34)
        • Defense Project (20)
        • FPS Project (30)
        • RPG Project (39)
        • 기타 - 개발 (22)
      • 개발 (35)
        • 임베디드 소프트웨어 (7)
        • 컴파일러 (6)
        • 기계학습 (8)
        • 보안 (8)
        • 그래픽스 (2)
        • 그 외 (4)
      • 코딩문제 (6)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • Coroutine 공부 기록
        2025년 12월 30일
        • SiJun-Park
        • 작성자
        • 2025.12.30.:53

        Coroutine을 심화적으로 알아보기 위해서 yield return new WaitForSeconds가 어떻게 실행이 되는지 궁금했습니다.

         

        " 유니티에선 어떻게 이 위치를 기억하고 시간이 지나 다시 실행을 할까? "가 매우 궁금했습니다.

         

        그래서 여러 서적도 봤는데, 막상 있지는 않더라구요..

         

        그래서 외국 개발 커뮤도 돌아보고, 직접 찾아보고 알았습니다.

         

        동작 원리?

        동작 원리는 아주 간단합니다. yield return을 만나는 순간 코루틴의 실행이 그 즉시 멈추고, 현재 그 위치에 책갈피를 꽂아두는 것과 같습니다.

         

        그 다음에는 코루틴이 유니티 엔진에게 몇 초뒤에 깨워달라는 설정을 합니다. ( yield return new WaitForSeconds(2) 라고 하면 2초 )

        그리고 제어권을 넘겨주게 됩니다.

        -> 제어권을 넘겨줌으로써 화면이 멈추지 않게 됩니다.

         

        그 다음은 유니티가 매 프레임마다 돌면서 확인을 하고 지정된 시간이 지나게 되면 아까 꽂아둔 책갈피 위치로 돌아와 코드를 다시 실행하게 됩니다.

         

        그래서 어떻게 실행이 되냐?

        IEnumerator Test()
        {
            Debug.Log("테스트 1");
            yield return new WaitForSeconds(2.0f); 
            Debug.Log("테스트 2");
        }

        위와 같은 코드가 있다고 가정을 하였습니다.

         

            public interface IEnumerator
            {
                object Current { get; }
        
                bool MoveNext();
                void Reset();
            }

         

        또한 위가 IEnumerator 입니다.

         

        이제 컴파일러가 자동 생성을 합니다.

         

        public class Test_Enumerator : IEnumerator
        {
            public int state = 0; 
            public object current; 
            public bool MoveNext() 
            {
                switch (state)
                {
                    case 0: 
                        Debug.Log("테스트 1");
                        current = new WaitForSeconds(2.0f);
                        state = 1;
                        return true;
        
                    case 1: 
                        Debug.Log("테스트 2");
                        state = -1; 
                        return false;
                }
                return false;
            }
        
            public object Current => current;
            public void Reset() { /* ... */ }
        }

         

        그래서 위와같이 생성이 됩니다.

         

        그러면 가장 먼저 state가 의미하는 것은 현재 코드의 어느 단계인지 기록을 합니다.

         

        current는 yield return으로 변환된 값 입니다.

         

        MoveNext는 유니티 엔진이 매 프레임 호출하는 핵심 함수입니다.

         

        그래서 switch문을 보면 가장 첫 시행을 하게 되면 state는 당연히 0이니 case 0번에 들어가게 됩니다.

         

        그 뒤 테스트 1이라는 Debug를 출력하게 됩니다.

         

        그 다음 유니티에게 2초만 기다리라고 객체를 전달 합니다.

         

        state는 다음 단계를 기록해주고 return true를 돌려줌으로써 아직 할 일이 남아있음을 엔진에게 알려줍니다.

         

        2초 뒤 case 1로 들어와 테스트 2를 실행하게 되고 state가 -1 상태가 됩니다.

         

        이 상태는 종료 상태입니다. 

         

        그래서 return false로 해서 이제 다 끝났음을 엔진에게 알려줍니다.

         

        문제 발생

        하지만 코루틴을 남발하게 되면 안좋습니다.

         

        그 이유가 위에 보면 new WaitForSeconds로 계속 새로운 객체를 생성하게 됩니다.

         

        이는 GC가 생기게 됩니다.

         

        해결 방법으로는 캐싱 방법이 있습니다. 캐싱을 해서 재사용하는 방법이 있습니다.

         

        그래서 경력이 있는 개발자들은 WaitForSeconds를 잘 안쓴다고 하더라구요..

        코루틴 자체를 잘 안쓴다고 합니다.. (주워들은 이야기라 틀릴 수도 있습니다.)

         

        코루틴은 반드시 MonoBehaviour가 있어야 하지만, UniTask는 어디서든 실행이 가능하고 다양한 대기 모드가 있어 세밀하게 조절을 할 수 있습니다.

         

        또한, 코드 가독성이 뛰어나다고 합니다.

         

         

        결론

        코루틴을 사용하는 건 좋지만, 남발하지 말아야한다!

         

         

         

         

         

         

         

        'Unity > 기타 - 개발' 카테고리의 다른 글

        Transform 그리고 StopAllCoroutines 공부 기록  (1) 2026.01.01
        GetComponent 공부 기록  (0) 2025.12.30
        Heap과 Stack에 대해 공부  (0) 2025.12.21
        Text와 TextMeshPro 공부  (0) 2025.12.20
        Playfab 닉네임 동기화 문제  (0) 2025.07.04
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바