Unity3D

유니티 Ads 사용 중 에러 해결 | Constructors and field initializers will be executed from the loading thread when loading a scene

DragonTory 2021. 12. 17. 14:39
반응형

 

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

 

GitHub - PimDeWitte/UnityMainThreadDispatcher: A simple, thread-safe way of executing actions (Such as UI manipulations) on the

A simple, thread-safe way of executing actions (Such as UI manipulations) on the Unity Main Thread - GitHub - PimDeWitte/UnityMainThreadDispatcher: A simple, thread-safe way of executing actions (S...

github.com

 

반응형