728x90
반응형

📕오늘의 공부 주제



Unity에서 Thread, Task, async/await, Coroutine의 차이와 사용 시기

🤔Why?



Unity에서는 다양한 비동기 기법을 사용할 수 있지만, 어떤 상황에서 어떤 방식을 써야 안정적이고 효율적인지를 알고 있어야 한다. 특히 Unity는 메인 스레드에서만 게임 오브젝트를 안전하게 다룰 수 있기 때문에, 적절한 방법 선택이 중요하다.

📖오늘의 공부 내용



✅ 1. Coroutine

  • Unity의 메인 스레드에서 실행됨
  • yield return을 이용해 흐름을 나눔
  • Unity 오브젝트, UI, 애니메이션 등 제어 가능
  • 연출, 지연 실행, 순차 동작 처리에 적합
IEnumerator FadeOut() {
    yield return new WaitForSeconds(1f);
    canvas.alpha = 0f;
}

✅ 2. Thread

  • System.Threading.Thread
  • 멀티 스레드 기반 병렬 처리
  • Unity 오브젝트 직접 접근 불가능
  • CPU 집약적인 계산, 대용량 처리 등에 적합
new Thread(() => {
    var result = HeavyWork();
    lock (queue) {
        queue.Enqueue(result); // 메인 스레드에서 처리
    }
}).Start();

✅ 3. Task / async-await

  • C#의 비동기 프로그래밍 패턴
  • 내부적으로는 스레드 풀을 사용하거나 await 스케줄링
  • 비동기 로직을 동기 코드처럼 작성 가능
  • Unity 오브젝트는 직접 접근 불가, await 이후 메인 복귀 가능
async void LoadJson() {
    var json = await File.ReadAllTextAsync("data.json"); // 백그라운드 처리
    Debug.Log(json); // 메인 스레드 복귀 후 출력
}

✅ 4. 요약 비교

항목 Coroutine Thread Task / async-await
실행 위치 메인 스레드 백그라운드 스레드 백그라운드 → 메인 복귀
Unity API 사용 가능 불가능 불가능 (await 후 가능)
흐름 제어 yield 사용 직접 구현 필요 await로 자연스럽게 처리
주 용도 연출, 지연, 애니메이션 연산, 파일 처리 등 파일 I/O, 네트워크 요청 등
중단/재개 쉬움 어려움 쉬움

✅ 추천 사용 시나리오

작업 종류 적합한 방식
페이드 인/아웃, 대사 순차 출력 Coroutine
경로 탐색, 대량 수학 계산 Thread 또는 Task.Run
JSON/파일 로드, 저장 처리 async/await
서버 API 통신 Coroutine + UnityWebRequest 또는 async/await + HttpClient

💡 보너스 팁

  • Task.Run(() => {...})을 통해 ThreadPool 기반 비동기 처리 가능
  • Unity에서 메인 스레드로 복귀하고 싶다면 UnityMainThreadDispatcherUniTask 라이브러리 활용도 고려
728x90
반응형

'프로그래밍 공부 > TIL' 카테고리의 다른 글

2025-07-30 TIL  (1) 2025.07.30
2025-07-29 TIL  (0) 2025.07.29
2025-07-25 TIL  (3) 2025.07.25
2025-07-24 TIL  (0) 2025.07.24
2025-07-23 TIL  (0) 2025.07.23