[유니티] 안드로이드 Google Admob 보상형 광고 구현 문제 해결 방법
안녕하세요. 개발자 드리머즈입니다.
지난번 포스트에서 말씀드린 문제점으로 인해 유니티에서 현재 테스트 중인 안드로이드 어플에 Unity Ads가 아닌 Google Admob을 구현하고 있습니다.
구글 공식홈의 가이드(https://developers.google.com/admob/unity/start)대로 하면 구글 애드몹을 유니티에 구현하는 것을 별로 어렵지 않았습니다.
그런데 보상형 광고(Reward based video)를 구현시.. 심각한 문제점이 발견됐습니다.
Scene재시작 시 콜백 설정이 누적되는 문제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // Called when an ad request has successfully loaded. rewardBasedVideo.OnAdLoaded += HandleRewardBasedVideoLoaded; // Called when an ad request failed to load. rewardBasedVideo.OnAdFailedToLoad += HandleRewardBasedVideoFailedToLoad; // Called when an ad is shown. rewardBasedVideo.OnAdOpening += HandleRewardBasedVideoOpened; // Called when the ad starts to play. rewardBasedVideo.OnAdStarted += HandleRewardBasedVideoStarted; // Called when the user should be rewarded for watching a video. rewardBasedVideo.OnAdRewarded += HandleRewardBasedVideoRewarded; // Called when the ad is closed. rewardBasedVideo.OnAdClosed += HandleRewardBasedVideoClosed; // Called when the ad click caused the user to leave the application. rewardBasedVideo.OnAdLeavingApplication += HandleRewardBasedVideoLeftApplication; | cs |
공식홈의 가이드에 따르면 위의 코드로.. 보상형 광고 실행과 관련된 콜백 함수를 등록합니다. 특이한 점은.. 위의 콜백을 설정하는 코드들은 모두 += 연산자를 사용하는데 이로인해 콜백이 추가된다는 점입니다. 말로하니까 설명이 좀 어려운데요 예를 들면 보상형 광고를 다 보았을 때 호출되는 OnAdRewarded로 설정하는 콜백함수를 여러개 설정할 수 있다는 것입니다.
1 2 3 4 | // Called when the ad is closed. rewardBasedVideo.OnAdClosed += HandleRewardBasedVideoClosed; rewardBasedVideo.OnAdClosed += HandleRewardBasedVideoClosed; rewardBasedVideo.OnAdClosed += HandleRewardBasedVideoClosed; | cs |
위 코드와 같이 동일한 함수 3개를 콜백으로 지정할 수 있습니다. 사용자가 광고를 다 본다면.. HandleRewardBasedVideoClosed() 함수가 3번 불립니다.
그런데 문제는.. 게임재시작 등의 이유로 씬(Scene)을 재시작(reload)하면 콜백함수를 초기화하면서 콜백함수가 누적?으로 더해져서.. 각 이벤트가 발생할 때 여러 번 불린다는 것입니다.
문제가 왜 발생하는지 생각해봤습니다.
1 2 | // Get singleton reward based video ad reference. this.rewardBasedVideo = RewardBasedVideoAd.Instance; | cs |
보상형 광고를 사용할 때는 위의 코드와 같이 싱글턴 패턴으로 객체를 얻게 되는데 이를 간단히 보면 static 변수입니다. static 변수는 씬을 재시작해도 초기화되지 않더라구요!
그래서 이 문제는 static Boolean isInitialized 변수를 하나 만들어서 보상형 광고를 위한 초기화를 하면 true로 설정하여, scene이 재시작하더라도 보상형 광고의 콜백설정부분이 실쟁되지 않도록 하여 해결했습니다.
위의 방법을 사용하여.. 콜백 함수가 누적?되는 것을 막으면 아래의 이슈가 발생함
보상형 광고를 보고 나오면 연결된? GameObject가 null이 되는 이슈
그러나 또 다른 이슈가 발견됏네요.
유니티 초보라 그런지.. 참 신기해보이는 이슈가 많습니다. ㅡ.ㅡ;;
Scene을 재시작 한 후 보상형 광고가 로드되면(HandleRewardBasedVideoLoaded) C# 스크립트에 연결되어 있던 GameObject의 연결이 끊어지는 것으로 보입니다.(null을 가리킴)
참.. 신기한 이슈죠? 이 문제를 어떻게 해결해야 하나 고민하다가.. 재시작한 Scene에서 이전 Scene에서 등록된 콜백함수가 문제를 일으키는 것 같아 콜백 문제를 다른 방향으로 고쳐보려고 했습니다.
유니티에서 Scene이 재시작되기 전에 OnDestroy()함수가 불립니다.
그래서 이 함수에서 초기화부분에서 등록한 콜백들을 -= 연산자를 이용해 제거했습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | private void OnDestroy() { MonoBehaviour.print("OnDestroy()"); // Called when an ad request has successfully loaded. rewardBasedVideo.OnAdLoaded -= HandleRewardBasedVideoLoaded; // Called when an ad request failed to load. rewardBasedVideo.OnAdFailedToLoad -= HandleRewardBasedVideoFailedToLoad; // Called when an ad is shown. rewardBasedVideo.OnAdOpening -= HandleRewardBasedVideoOpened; // Called when the ad starts to play. rewardBasedVideo.OnAdStarted -= HandleRewardBasedVideoStarted; // Called when the user should be rewarded for watching a video. rewardBasedVideo.OnAdRewarded -= HandleRewardBasedVideoRewarded; // Called when the ad is closed. rewardBasedVideo.OnAdClosed -= HandleRewardBasedVideoClosed; // Called when the ad click caused the user to leave the application. rewardBasedVideo.OnAdLeavingApplication -= HandleRewardBasedVideoLeftApplication; } | cs |
이렇게 하니까 잘 동작하는 것 같습니다. ㅜㅜ
제가 겪은 이 문제가..
유니티에서 Google Admob으로 보상형 광고를 사용하는 사람들이 아주 흔하게 겪는 문제같은데
인터넷에 검색해도 해결책이 잘 나오지 않아 많이 답답했습니다.
그리고 유니티에 구글 Admob 구현 후기를 말씀드리겠습니다.
유니티 Ads에 비해 구글 Admob이 구현 및 사용이 좀 더 어렵긴 합니다.
하지만 유니티 애즈로 광고 동영상을 시청했을 때 한 번 시작되면 영상이 끝날때까지(30초?) 취소가 안되더라구요.
이렇게 하면.. 사용자 입장에서 상당히 불편할 것 같았습니다.
그에 비해 구글 광고는 동영상 광고 시청 중간에 취소를 할 수 있어서 더 좋았습니다.(광고를 다 봤는지 아닌지 확인 가능)
그리고.. 무엇보다 수익지급 방식이.. Invoicing을 메일이나 우편으로 보내야하는 중소기업같은 유니티보다
인터넷으로 간단하게 처리되는 구글 애드센스가 낫기에
이 부분에서 큰 장점이 있다고 생각합니다.
참고 하시기 바랍니다.
댓글 영역