본문으로 건너뛰기
버전: 5.11.9

유니티 메인 쓰레드에서 핸들러 호출

설명

공통 에러 핸들러는 기본적으로 비동기에서 호출됩니다.
따라서 메인 쓰레드에서만 접근이 가능한 UI 등을 핸들러 내에서 호출 시 에러가 발생합니다.

 Backend.ErrorHandler.OnMaintenanceError = () => {
gameObject.GetComponentInChildren<Text>().text = "점검 중입니다.";
};

OnMaintenanceError Exception : UnityEngine.UnityException: get_gameObject can only be called from the main thread.

핸들러 내에서 UI에 접근하고 싶을 경우에는 다음 Example과 같이 추가로 함수를 호출해야 합니다.

Example

public class BackendErrorManager : MonoBehaviour {

void Start() {

if(Backend.IsInitialized) {
Backend.ErrorHandler.InitializePoll(true);

Backend.ErrorHandler.OnMaintenanceError = () => {
Debug.Log("점검 에러 발생!!!");
gameObject.GetComponentInChildren<Text>().text = "점검 중입니다.";
};
Backend.ErrorHandler.OnTooManyRequestError = () => {
Debug.Log("403 에러 발생!!!");
gameObject.GetComponentInChildren<Text>().text = "과도한 요청이 감지되었습니다.";
};
Backend.ErrorHandler.OnTooManyRequestByLocalError = () => {
Debug.Log("403 로컬 에러 발생!!!");
gameObject.GetComponentInChildren<Text>().text = "과도한 요청중입니다.";
};
Backend.ErrorHandler.OnOtherDeviceLoginDetectedError = () => {
Debug.Log("리프레시 불가!!!");
gameObject.GetComponentInChildren<Text>().text = "다른 기기에서 로그인이 감지되었습니다.";
};
}
}

void Update() {
Backend.ErrorHandler.Poll();
}
}

1. 폴링 초기화 - InitializePoll()

public void InitializePoll(bool useAsyncPoll);

파라미터

ValueTypeDescription
useAsyncPollbool메인 쓰레드 처리 활성화 여부

설명

공통 에러 핸들러의 처리 방식을 유니티 메인 쓰레드에서 처리할 수 있도록 설정합니다.
핸들러 내부에서 UI 등에 접근하는 로직이 존재하면 활성화하는 것을 권장 드립니다.

useAsyncPoll가 true일 경우, 등록된 모든 서버 공통 핸들러는 메인 쓰레드에서 실행됩니다.
useAsyncPoll가 false이거나 호출하지 않았을 경우, 등록된 모든 서버 공통 핸들러는 외부 쓰레드에서 실행됩니다.

Example

void Start() {
if(Backend.IsInitialized) {
Backend.ErrorHandler.InitializePoll(true);
}

2. Poll

공통 에러 핸들러가 등록된 후 해당 핸들러에 관한 에러 호출 시, 비동기 함수 쓰레드에서 메인 쓰레드로 호출하기 위해 별도의 큐에 저장됩니다.
큐에 저장된 핸들러를 실행하기 위해서는 아래 폴링 함수를 주기적으로 호출해야 합니다.

void Update()  {
Backend.ErrorHandler.Poll();
}

다음은 폴링 함수를 주기적으로 호출하는데 권장하는 방법들입니다.

  • 유니티 객체의 Update 함수 내에 폴링 함수 선언
  • 주기적으로 호출되는 코루틴을 생성하고 해당 코루틴 내에서 폴링 함수 선언
  • 별도의 주기적으로 호출되는 함수를 생성하고 해당 함수 내에 폴링 함수 선언

다음 방법은 폴링 함수를 주기적으로 호출하는데 권장하지 않습니다.

  • 재귀 함수를 선언하고, 재귀 함수 내에 폴링 함수 선언