콘텐츠로 이동

"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 설정 같은 작업을 할 수 없다.

  1. 플래그를 세우고 Update에서 처리
  2. 메시지 형식의 invoke로 처리 (스레드가 Unity로 돌아와야 처리된다)
  3. 코루틴과 async-await 활용
  4. 직접 큐를 만들어 작업을 넣어 두고, 메인 스레드에서 dequeue해 처리
  5. 외부 dispatcher 사용 (UnityMainThreadDispatcher 등. com.baracuda.thread-dispatcher는 Destroy할 때 참조 버그가 있었다)
  6. Task와 CancellationToken 활용

한 모바일 게임의 보상형 광고 시스템을 처음에는 5번 방식으로 해결했다가 버그를 만났고, 3번과 6번 방식으로 다시 해결했다.