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에서 메인 스레드로 복귀하고 싶다면
UnityMainThreadDispatcher나UniTask라이브러리 활용도 고려
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 |
