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

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

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

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

C#

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

Unity

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

Q&A

解決済

1回答

1118閲覧

Singletonクラスでインスタンスを作ったEventクラスのイベンドハンドラーに、デリゲートを登録したい。

Ceitofu

総合スコア4

AdMob

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

C#

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

Unity

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

0グッド

0クリップ

投稿2021/06/27 03:39

前提・実現したいこと

UnityでAdmobのリワード広告を使おうと思ったのですが、用途がゲームの復活やアイテムゲットなどで複数あるので、ダウンロードの節約や、読み込み時間をなくそうという考えで、広告読み込みたびにRewardAdインスタンスを作るのではなくSingletonとして共有化し、一度広告をダウンロードしたら、それを使い切るまで保持しておこうと思い実装を変更しました。
しかし、ちゃんと登録できていないのか、Eventが呼び出されません。どうすれば呼び出せるようになるでしょうか?
また、こうした方法についての記載が探しても出ないということはメモリ(や広告の寿命的に?)非効率だから誰もやっていないだけなんでしょうか?

C#

1 2 //https://developers.google.com/admob/unity/rewarded-ads?hl=ja 3 //サンプル等では使うたびにインスタンスを作っている 4 private RewardedAd rewardedAd; 5 ... 6 7 public void Start() 8 { 9 ... 10 11 this.rewardedAd = new RewardedAd(adUnitId); 12 13 // Create an empty ad request. 14 AdRequest request = new AdRequest.Builder().Build(); 15 // Load the rewarded ad with the request. 16 this.rewardedAd.LoadAd(request); 17 } 18} 19

C#

1//共有化したRewardAd等を保持しているクラス 2public class AdmobConfig { 3 #region Singleton 4 private static readonly AdmobConfig instance = new AdmobConfig(); 5 private AdmobConfig(){} 6 public static AdmobConfig Instance { get { return instance; } } 7 #endregion 8 //Information 9 public RewardedAd rewardedAd; //Use all scene 10... 11 //rewardedAdの初期化など 12} 13

該当のソースコード

C#

1ublic class RouletteAdmob : MonoBehaviour { 2 bool isSet; 3 4 void OnDisable() { 5 if(!isSet){ 6 return; 7 } 8 isSet = false; 9 AdmobConfig.Instance.rewardedAd.OnAdLoaded -= HandleRewardedAdLoaded; 10 AdmobConfig.Instance.rewardedAd.OnAdFailedToLoad -= HandleRewardBasedVideoFailedToLoad; 11 AdmobConfig.Instance.rewardedAd.OnAdOpening -= HandleRewardedAdOpening; 12 AdmobConfig.Instance.rewardedAd.OnAdClosed -= HandleRewardBasedVideoClose; 13 AdmobConfig.Instance.rewardedAd.OnUserEarnedReward -= HandleUserEarnedReward; 14 } 15 ///使うときに他クラスから呼ぶ 16 public void RegisterAdmobEvent() { 17 isSet = true; 18 AdmobConfig.Instance.rewardedAd.OnAdLoaded += HandleRewardedAdLoaded; 19 AdmobConfig.Instance.rewardedAd.OnAdFailedToLoad += HandleRewardBasedVideoFailedToLoad; 20 AdmobConfig.Instance.rewardedAd.OnAdOpening += HandleRewardedAdOpening; 21 AdmobConfig.Instance.rewardedAd.OnAdClosed += HandleRewardBasedVideoClose; 22 AdmobConfig.Instance.rewardedAd.OnUserEarnedReward += HandleUserEarnedReward; 23 } 24}

試したこと

外部のクラスだから正確に関数が渡せてないのでは?と思い、this.HandleRewardedAdLoadedなどとやってみましたがだめでした。
それではとクラス内で一度インスタンスを保持してから渡したのですがかわりませんでした。
広告はちゃんと読み込め、通常読み込めていれば行われるゲームのポーズや再開などもできています。Event周りだけが呼べません。
UnityAPIをHandleRewardedAdLoadedなどから直接呼んでもエラーが起こらないのでおそらくイベントの登録すらできていませんでした。

C#

1 public void RegisterAdmobEvent() { 2 RewardedAd rewardedAd = AdmobConfig.Instance.rewardedAd; 3 rewardedAd.OnAdLoaded += HandleRewardedAdLoaded; 4 5 AdmobConfig.Instance.rewardedAd.OnAdFailedToLoad += this.HandleRewardBasedVideoFailedToLoad; 6 }

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

Admob 5.4.0
Unity 2020.3.11f

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

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

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

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

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

guest

回答1

0

自己解決

色々試しましたがどれもうまくいかなかったので、結局のところ個別にインスタンスを作成することにしました。
旧式のAPIではAPIの段階で共通のインスタンスを使っていたので何かしら問題があって変更があったのかもしれません。

投稿2021/07/22 08:49

Ceitofu

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問