Unity Ads를 사용하여 Rewared 광고 보기를 완료 하고 나면
OnUnityAdsShowComplete()
이 콜백 함수를 받는데 여기에서 uGUI를 이용 하여 팝업을 띄웠더니 다음 에러가 발생 한다.
에러:
UnityException FindObjectsOfType can only be called from the main thread.
Constructors and field initializers will be executed from the loading thread when loading a scene.
Don't use this function in the contstructor or field initializers, instead move initalization code to the Awake or Start function. at(wrapper managed-to-native) UnityEngine.Object.FindObjectsOfType(System.Type)
원인:
유니티 광고나 다른 플러그인을 사용 하다보면
자체 쓰레드에서 실행 되는 경우가 있는데 이런 경우
유니티 자체 앱을 Pause 시키고
외부 다른 쓰레이드를 실행 해서 일을 처리 하고
결과를 콜백 함수로 알려 주는데
이 때 유니티 자체는 Pause 상태 이고 다른 쓰레드에서
유니티 코드를 실행 하려고 할 때 이런 에러가 나오게 되고
간혹 예기치 못한 이상한 결과가 나올 때가 있는 것이다.
이를 해결 하려면 상태를 기억 하고 있다가
유니티 앱이 Resume 되었을 때 결과를 처리 하게 하면 된다.
해결:
1. 플래그 변수 이용.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
bool isCompleted = false;
public void OnUnityAdsShowComplete(string adUnitId, UnityAdsShowCompletionState showCompletionState)
{
isCompleted = true;
}
void Update()
{
if( isCompleted )
{
// 내용 처리
}
}
|
cs |
2. Function Dispatcher 사용
1
2
3
4
5
6
7
|
public IEnumerator ThisWillBeExecutedOnTheMainThread() {
Debug.Log ("This is executed from the main thread");
yield return null;
}
public void ExampleMainThreadCall() {
UnityMainThreadDispatcher.Instance().Enqueue(ThisWillBeExecutedOnTheMainThread());
}
|
cs |
또는
1
|
UnityMainThreadDispatcher.Instance().Enqueue(() => Debug.Log ("This is executed from the main thread"));
|
cs |
으로 사용 하면 된다.
외부 플러그인 사용 할 때 여러모로 유용 할 듯 하다.
현재 이 방법을 사용 중인데 깔끔 하고 아주 잘 작동 한다.
Unity Main Thread Dispatcher
https://github.com/PimDeWitte/UnityMainThreadDispatcher
'Unity3D' 카테고리의 다른 글
C# .Net TCP/IP 비동기 네트워크 라이브러리 (0) | 2022.05.30 |
---|---|
구글 인앱 결제 구독 결제 테스트 모드로 테스트 하기 (2) | 2022.01.10 |
[Unity] 핸드폰에서 절전모드 해제 하는 코드 (0) | 2021.12.17 |
[이제 유니티에서 바로 보세요] 유니티 안드로이드 로그캣으로 디버깅 하기 - Unity Android Logcat Debugging. (0) | 2021.12.13 |
Unity IAP Error - ProductCatalog could not be found (0) | 2021.12.03 |