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

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

新規登録して質問してみよう
ただいま回答率
85.49%
AdMob

AdMobは、事前に指定した条件に従ってアプリに広告を表示するGoogleのサービス。開発者の向けのサービスで、広告を掲載することにより、収益を得ることが可能です。その他、見た目や雰囲気などアプリに合う広告に変更したり、広告表示の場所を指定することもできます。

C#

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

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

Unity

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

Q&A

解決済

2回答

1310閲覧

AdMobのReward広告においてイベントハンドラでログを出力したいが実行されない

cappuccinon

総合スコア17

AdMob

AdMobは、事前に指定した条件に従ってアプリに広告を表示するGoogleのサービス。開発者の向けのサービスで、広告を掲載することにより、収益を得ることが可能です。その他、見た目や雰囲気などアプリに合う広告に変更したり、広告表示の場所を指定することもできます。

C#

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

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

Unity

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

0グッド

0クリップ

投稿2020/07/02 01:07

質問内容

AdMobのReward広告においてイベントハンドラでログを出力したいが実行されない。
もし実行されない理由などが分かる方がいれば教えていただきたいです。
そもそも実行が不可であれば、不可とだけでなく理由を添えていただけると助かります。

該当のソースコード

Unity

1private bool isClose; 2private bool isReward; 3 4public void リワード広告のロード(adUnitId) { 5 RewardedAd rewardedAd = new RewardedAd(adUnitId); 6 AdRequest request = new AdRequest.Builder().Build(); 7 rewardedAd.OnAdClosed += HandleRewardedAdClosed; 8 rewardedAd.OnUserEarnedReward += HandleUserEarnedReward; 9 rewardedAd.LoadAd(request); 10} 11 12public void HandleRewardedAdClosed(object sender, EventArgs args) { 13 this.isClose = true; // 値の変更は確認済み 14 Debug.Log("closed rewardedAd"); // 出力されない 15} 16 17public void HandleUserEarnedReward(object sender, EventArgs args) { 18 this.isReward = true; // 値の変更は確認済み 19 Debug.Log("get rewardAd"); // 出力されない 20} 21

試したこと

リワード広告を閉じた際、イベントハンドラ内のフラグ値は変更されているが、ログが出力されません。
本来は報酬獲得時にシーン遷移をするようにしたいのですが、遷移されないためログ出力に変えるなどして問題点を探っています。
フラグ値は変更されるため、Update内でシーン遷移を呼び出すことはできていますので本件の質問内容ではありません。
(ログは画面出力するようにしているのでそこが問題ではないと思います)

補足情報(FW/ツールのバージョンなど)

Unity Version 2019.4.0f1 Personal
Google Mobile Ads Unity Plugin v5.2.0

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

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

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

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

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

guest

回答2

0

ベストアンサー

Admobのイベントは別スレッドで実行されます。
メインスレッドでしか実行できないUnity API(Debug.Logなど)は走りません。

メインスレッドで実行されるようにするにはUpdate内でフラグを立てるのが簡単ですが
僕が使っているスクリプトを差し上げるのでこれ使ってみてください。

メインスレッドで実行させるスクリプト

下記コードを「MainThreadEventExecutor.cs」としてプロジェクト内に保存
[追記]出来る限りコードの初めでMainThreadEventExecutor.Initialize()を呼んでください。
例) AdmobManagerがあればそのAwake()、ゲーム起動時 タイトル画面 Awake()、ゲーム画面 GameManagerAwake() 複数回呼んでも問題無いです。

C#

1 2using System; 3using System.Collections.Generic; 4using UnityEngine; 5 6/// <summary> 7/// メインスレッドでイベントを実行する 8/// </summary> 9public sealed class MainThreadEventExecutor : MonoBehaviour 10{ 11 static MainThreadEventExecutor instance; 12 13 static List<Action> queues = new List<Action>(); 14 static volatile bool eventQueueEmpty = true; 15 16 public static void Initialize() 17 { 18 if (instance == null) 19 { 20 instance = new GameObject("MainThreadEventExecutor").AddComponent<MainThreadEventExecutor>(); 21 DontDestroyOnLoad(instance.gameObject); 22 } 23 } 24 25 public static void Execute(Action action) 26 { 27 lock (queues) 28 { 29 queues.Add(action); 30 eventQueueEmpty = false; 31 } 32 } 33 34 public void Update() 35 { 36 if (eventQueueEmpty) 37 { 38 return; 39 } 40 41 var queue = new List<Action>(); 42 43 lock (queues) 44 { 45 queue.AddRange(queues); 46 queues.Clear(); 47 eventQueueEmpty = true; 48 } 49 50 foreach (Action ev in queue) 51 { 52 ev.Invoke(); 53 } 54 } 55}

使い方

初期化
例) AdmobManagerがあるとしてAwake()で初期化

C#

1using UnityEngine; 2 3public sealed class AdmobManager : MonoBehaviour 4{ 5 void Awake() 6 { 7 MainThreadEventExecutor.Initialize(); 8 } 9}

使用
Admobイベント内で実行したい内容をMainThreadEventExecutor.Execute内に書く

C#

1public void HandleRewardedAdClosed(object sender, EventArgs args) 2{ 3 MainThreadEventExecutor.Execute(() => 4 { 5 this.isClose = true; // 値の変更は確認済み 6 Debug.Log("closed rewardedAd"); // 出力されない 7 }); 8}

このスクリプトのモデル

実はAdmobプラグイン内にメインスレッドで実行される為のスクリプトが含まれております。
存在について何処にも書かれて居ない為、もしかすると今後消される可能性があります。
突然消されても困るので改変して作成したMainThreadEventExecutorを使っています。

投稿2020/07/02 10:13

編集2020/07/02 11:13
IShix

総合スコア1724

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

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

cappuccinon

2020/07/02 21:03

メインスレッドで実行されるスクリプトありがとうございます! 試してみてメインスレッドで動作することを確認しました。 非常に丁寧にご説明下さった上にスクリプトまでいただき感謝しております。
IShix

2020/07/03 05:50

解決できて良かったです。だいぶ罠ですよね。
guest

0

AdMobのイベントハンドラは別スレッドで実行されるから、UnityAPIは使えないのですね...(という理解をしました)

投稿2020/07/02 01:39

cappuccinon

総合スコア17

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問