유니티 메인 쓰레드에서 핸들러 호출
설명
공통 에러 핸들러는 기본적으로 비동기에서 호출됩니다.
따라서 메인 쓰레드에서만 접근이 가능한 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);
파라미터
Value | Type | Description |
---|---|---|
useAsyncPoll | bool | 메인 쓰레드 처리 활성화 여부 |
설명
공통 에러 핸들러의 처리 방식을 유니티 메인 쓰레드에서 처리할 수 있도록 설정합니다.
핸들러 내부에서 UI 등에 접근하는 로직이 존재하면 활성화하는 것을 권장 드립니다.
useAsyncPoll가 true일 경우, 등록된 모든 서버 공통 핸들러는 메인 쓰레드에서 실행됩니다.
useAsyncPoll가 false이거나 호출하지 않았을 경우, 등록된 모든 서버 공통 핸들러는 외부 쓰레드에서 실행됩니다.
Example
void Start() {
if(Backend.IsInitialized) {
Backend.ErrorHandler.InitializePoll(true);
}
2. Poll
공통 에러 핸들러가 등록된 후 해당 핸들러에 관한 에러 호출 시, 비동기 함수 쓰레드에서 메인 쓰레드로 호출하기 위해 별도의 큐에 저장됩니다.
큐에 저장된 핸들러를 실행하기 위해서는 아래 폴링 함수를 주기적으로 호출해야 합니다.
void Update() {
Backend.ErrorHandler.Poll();
}
다음은 폴링 함수를 주기적으로 호출하는데 권장하는 방법들입니다.
- 유니티 객체의 Update 함수 내에 폴링 함수 선언
- 주기적으로 호출되는 코루틴을 생성하고 해당 코루틴 내에서 폴링 함수 선언
- 별도의 주기적으로 호출되는 함수를 생성하고 해당 함수 내에 폴링 함수 선언
다음 방법은 폴링 함수를 주기적으로 호출하는데 권장하지 않습니다.
- 재귀 함수를 선언하고, 재귀 함수 내에 폴링 함수 선언