質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2397閲覧

Unity)admobリワードの返りがこない

navesanta

総合スコア198

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/05/14 08:41

AdMobのリワード広告を試しに設置しました。

RewardBasedVideoAdをインスタンス化してhandlerとして
HandleRewardBasedVideoRewarded()を付けました。

HandleRewardBasedVideoRewarded()はユーザーがリワード広告を最後までみた場合に
admob管理画面で登録しているTypeとamountを返してくるメソッドです。

テスト登録してある実機でテストしてみました。

リワード広告が表示されたので最後まで見ました。
しかしその後×をタップしてもなぜかイベントが返ってきません。
どこに問題があるのでしょうか?
ちなみにこのアプリ内にadmobの他の広告(バナー、インタースティシャル)も
設置してありますがこちらは問題なく表示されるのでassetsパッケージ自体は稼働しています。

エミュレータでもshowまでは発生しますがHandleRewardBasedVideoRewarded()は返ってきません。

環境)
PC: mac
Unity2018.2
言語:C#

using System.Collections; using System.Collections.Generic; using UnityEngine; using GoogleMobileAds.Api; using System; using UnityEngine.UI; public class RewardScript : MonoBehaviour { #pragma warning disable 649 [SerializeField] GameObject BaraiMessage; [SerializeField] GameObject BaraiDougaButton; [SerializeField] GameObject BaraiImage; private RewardBasedVideoAd rewardBasedVideo; // Start is called before the first frame update public void Start() { #if UNITY_ANDROID string appId = "appIdが入っている"; #elif UNITY_IPHONE string appId = "appIdが入っている"; #else string appId = "unexpected_platform"; #endif //Initialize Google Mobile Ads SDK MobileAds.Initialize(appId); //Get singleton reward video ad reference this.rewardBasedVideo = RewardBasedVideoAd.Instance; // 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; 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; this.RequestRewardBasedVideo(); } public void PushWatchAd() { if(rewardBasedVideo.IsLoaded()) { rewardBasedVideo.Show(); Debug.Log("testshowSccess"); } } private void RequestRewardBasedVideo() { #if UNITY_ANDROID string adUnitId = "unitIdが入っている"; #elif UNITY_IPHONE string adUnitId = "unitIdが入っている"; #else string adUnitId = "unexpected_platform"; #endif AdRequest request = new AdRequest.Builder() .AddTestDevice("デバイスID") //テスト端末 .Build(); this.rewardBasedVideo.LoadAd(request, adUnitId); } public void HandleRewardBasedVideoLoaded(object sender, EventArgs args) { MonoBehaviour.print("HandleRewardBasedVideoLoaded event received"); } public void HandleRewardBasedVideoFailedToLoad(object sender, AdFailedToLoadEventArgs args) { MonoBehaviour.print( "HandleRewardBasedVideoFailedToLoad event received with message: " + args.Message); } public void HandleRewardBasedVideoOpened(object sender, EventArgs args) { MonoBehaviour.print("HandleRewardBasedVideoOpened event received"); } public void HandleRewardBasedVideoStarted(object sender, EventArgs args) { MonoBehaviour.print("HandleRewardBasedVideoStarted event received"); } public void HandleRewardBasedVideoClosed(object sender, EventArgs args) { MonoBehaviour.print("HandleRewardBasedVideoClosed event received"); } public void HandleRewardBasedVideoRewarded(object sender, Reward args) { string type = args.Type; double amount = args.Amount; int setumeiImageId = PlayerPrefs.GetInt("yakubaraiid", 1); int yakuNum = PlayerPrefs.GetInt("yakunum"); yakuNum++; PlayerPrefs.SetInt("yakunum", yakuNum); PlayerPrefs.Save(); Debug.Log("The ad was succefully over"); //メッセージobjectをActiveにする。 BaraiMessage.SetActive(true); BaraiImage.GetComponent<Image>().sprite = Resources.Load<Sprite>("baraisetumei" + setumeiImageId.ToString()); BaraiDougaButton.SetActive(false); } public void HandleRewardBasedVideoLeftApplication(object sender, EventArgs args) { MonoBehaviour.print("HandleRewardBasedVideoLeftApplication event received"); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

色々調べたら解決しました。
UnityのAPI(今回の場合、HandleRewardBasedVideoRewarded)は
シングルスレッドで別スレッドからアクセスできないため、
そのままHandleRewardBasedVideoRewarded()内に
BaraiMessage.SetActive(true)などを記述したことが要因で
クラッシュしていたようです。

HandleRewardBasedVideoRewarded()内ではフラグの変更(true)のみをして
Update()でif(flag)という形でSetActive処理+flag(false)をしたところ
予想通りの挙動になりました。お騒がせしました。

投稿2019/05/15 01:00

navesanta

総合スコア198

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問