2024년 12월 13일 금요일

Unity : Graphics device is null. (admob 사용시)

AdMob 보상형 광고 문제 해결: Unity Editor에서 Android 단말기로의 전환


최근 Unity를 사용하여 AdMob의 보상형 광고를 구현하는 과정에서, 에디터에서는 정상적으로 작동하던 코드가 Android 단말기에서 오류를 발생시키는 문제가 있었습니다. 이를 해결하기 위해 ADB(Android Debug Bridge)를 통해 로그를 확인한 결과, 다음과 같은 오류 메시지를 발견했습니다.


 I Unity   : Rewarded ad full screen content opened.

 I Unity   : Rewarded ad recorded an impression.

 I Unity   : Rewarded ad paid 0 USD.

 E Unity   : Graphics device is null.

 E Unity   :  #0 0x75f8780ce4 (libunity.so) ? 0x0

 E Unity   :  #1 0x75f8c292e8 (libunity.so) ? 0x0

 E Unity   :  #2 0x75f8a68e20 (libunity.so) ? 0x0

 E Unity   :  #3 0x75f8caef40 (libunity.so) ? 0x0

 E Unity   :  #4 0x75f8cb1c20 (libunity.so) ? 0x0

 E Unity   :  #5 0x75f8cb1fc4 (libunity.so) ? 0x0

 E Unity   :  #6 0x75f844a8e0 (libunity.so) ? 0x0

 E Unity   :  #7 0x75f52cfd30 (libil2cpp.so) ? 0x0

 E Unity   :  #8 0x75f3adc6b0 (libil2cpp.so) ? 0x0

 E Unity   :  #9 0x75f3adc5fc (libil2cpp.so) ? 0x0

 E Unity   :  #10 0x75f8692c10 (libunity.so) ? 0x0

 E Unity   :  #11 0x75f86a1f18 (libunity.so) ? 0x0

 E Unity   :  #12 0x75f86a48d4 (libunity.so) ? 0x0

 E Unity   :  #13 0x75f86ed6fc (libunity.so) ? 0x0

 E Unity   :  #14 0x75f86b1b10 (libunity.so) ? 0x0

 E Unity   :  #15 0x75f86b1f20 (libunity.so) ? 0x0

 E Unity   :  #16 0x75f86b1a7c (libunity.so) ? 0x0

 E Unity   :  #17 0x75f86ef248 (libunity.so) ? 0x0

 E Unity   :  #18 0x75f86ef124 (libunity.so) ? 0x0

 E Unity   :  #19 0x75f84e348c (libunity.so) ? 0x0

 E Unity   :  #20 0x75f845ca24 (libunity.so) ? 0x0

 E Unity   :  #21 0x75f3bb0880 (libil2cpp.so) ? 0x0

 E Unity   :  #22 0x75f3bb1168 (libil2cpp.so) ? 0x0

 E Unity   :  #23 0x75f49dc658 (libil2cpp.so) ? 0x0

 E Unity   :  #24 0x75f3adc6b0 (libil2cpp.so) ? 0x0

 E Unity   :  #25 0x75f3adc5fc (libil2cpp.so) ? 0x0

 E Unity   :  #26 0x75f3a


이중 "Unity   : Graphics device is null."가 문제였으며 구글링을 해보았습니다.

이 오류는 Unity의 그래픽 장치가 null이라는 것을 의미하며, UI 관련 작업이 메인 스레드에서 제대로 처리되지 않았음을 암시합니다. 여러 자료를 참고한 결과, UI를 메인 스레드에서 처리해야 한다는 공통적인 의견이 있었습니다. 

참고 블로그들...

https://bonnate.tistory.com/552

https://sam0308.tistory.com/84


문제의 원인


문제를 분석해보니, 보상형 광고가 표시된 후 사용자를 보상하는 과정에서 UI 업데이트가 메인 스레드 외부에서 이루어져 오류가 발생한 것으로 보입니다. 이를 해결하기 위해, UI 처리를 메인 스레드로 옮기는 작업이 필요했습니다.


해결 방법


기존의 `GetReward` 메소드는 광고 보상 처리를 즉시 진행하고 있었으나, 이를 메인 스레드에서 처리하도록 수정했습니다. 아래는 수정된 코드입니다.


개선 전 코드


```

public void GetReward(Reward reward)

{

    GameManager.instance.ShowRewardGetNoGen(GetItem.ItemNo.GEM, 5);

}

```


개선 후 코드


변수를 추가하여 플래그를 설정하고, UI 처리를 `Update` 메소드로 옮겼습니다.


```

private bool getReward = false;


public void GetReward(Reward reward)

{

    getReward = true;

}


private void Update()

{

    if (getReward)

    {

        getReward = false;

        GameManager.instance.ShowRewardGetNoGen(GetItem.ItemNo.GEM, 5);

    }

}

```


이렇게 수정한 후, 문제는 해결되었고 광고가 정상적으로 작동했습니다.


검색해보니 아래와 같은 것도 있던데 실제 사용해 보지는 않았습니다. 참고용으로만 적어둡니다.

MobileAds.RaiseAdEventsOnUnityMainThread = true;



결론


AdMob 보상형 광고를 Unity에서 사용할 때, UI 업데이트를 메인 스레드에서 처리하는 것이 필요합니다. 그리고 여기에서는 이러한 방식으로 문제를 해결할 수 있었습니다.


댓글 없음:

댓글 쓰기