"Can only be called from the main thread" 에러 해결 패턴
Unity API(예: MonoBehaviour의 API)를 메인 스레드가 아닌 스레드에서 호출하면 다음 에러가 난다.
Can only be called from the main thread
클라이언트-서버 통신이나 광고, Facebook, Firebase 같은 외부 SDK는 C# 콜백을 다른 스레드에서 호출하는 경우가 있다. 이 콜백에 이벤트를 걸면, 그 시점에 메인 스레드인 Unity 스레드는 일시 정지 상태라서 다시 실행되기 전까지 UI 설정 같은 작업을 할 수 없다.
해결 패턴
섹션 제목: “해결 패턴”- 플래그를 세우고
Update에서 처리 - 메시지 형식의 invoke로 처리 (스레드가 Unity로 돌아와야 처리된다)
- 코루틴과 async-await 활용
- 직접 큐를 만들어 작업을 넣어 두고, 메인 스레드에서 dequeue해 처리
- 외부 dispatcher 사용 (UnityMainThreadDispatcher 등. com.baracuda.thread-dispatcher는 Destroy할 때 참조 버그가 있었다)
- Task와 CancellationToken 활용
적용 경험
섹션 제목: “적용 경험”한 모바일 게임의 보상형 광고 시스템을 처음에는 5번 방식으로 해결했다가 버그를 만났고, 3번과 6번 방식으로 다시 해결했다.