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

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

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

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

Unity

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

Q&A

解決済

1回答

609閲覧

外部クラスから処理を参照した際に、インスタンスに参照値が無いというエラーが発生するので解消したい。

PiCo19072018

総合スコア6

AdMob

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

Unity

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

0グッド

0クリップ

投稿2019/12/20 02:00

インスタンスに参照値がないというエラーを解消したい

お世話になります。以前、admobの表示/非表示の切り替えについて別クラスから変数をアクセスする方法について質問させて頂いております。そちらについてはおかげさまで解消でき、エラーも無くなったのですが実際に動かしてみると実装した箇所でエラー(インスタンスに参照値がありません)が発生しており困っています。

プログラムの内容としては、表示されているadmobのバナー表示/非表示を切り替える為のコンポーネントとなります。admobバナーの表示は行えており、表示/非表示のクラスもadmobの機能に入っているようですのでそちらを使用しています。

発生している問題・エラーメッセージ

エラーメッセージ NullReferenceException: Object reference not set to an instance of an object

該当のソースコード

C#

1//AdbunnerComponent.cs 2using UnityEngine; 3using System.Collections; 4using System.Collections.Generic; 5using GoogleMobileAds.Api; 6 7namespace Novel 8{ 9 //バナー表示用処理 10 public class AdshowComponent:AbstractComponent 11 { 12 //Admob.csから呼び出せるようインスペクタから設定しておく 13 public AdMob admob; 14 15 public AdshowComponent() 16 { 17   //コンポーネントの変数設定部分。 18 } 19 20 public override void start () 21 { 22  //AdMobのインスタンスにあるbannerView変数を使う 23  //admobから処理を呼び出してバナーを表示状態にする。 24  //↓エラー箇所 25  admob.bannerView.Show(); 26 27//次のシナリオに進む処理 28    this.gameManager.nextOrder (); 29 30 } 31 } 32 //バナー非表示用処理 33 public class AdhideComponent:AbstractComponent 34 { 35 //表示処理と類似処理 36 37 } 38} 39

admob.bannerView.Show(); の所でインスタンスの参照値が無いというエラーが表示されます。
外部のadmobクラスでインスタンスを作成しており、それを引っ張ってきて表示/非表示を切り替えるようにしています。

admobクラスのプログラムは下記の通り。

C#

1//AdMob.cs 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6using GoogleMobileAds.Api; 7 8public class AdMob : MonoBehaviour { 9 //バナービューに外からアクセス出来るようにしておく(インスペクタには出さない) 10 [HideInInspector] 11 public BannerView bannerView; 12 13 // Use this for initialization 14 void Start () { 15 16 // アプリID、 これはテスト用 17 string appId = "ca-app-pub-3940256099942544~3347511713"; 18 19 // Initialize the Google Mobile Ads SDK. 20 MobileAds.Initialize(appId); 21 22 RequestBanner(); 23 } 24 25 private void RequestBanner(){ 26 27 // 広告ユニットID これはテスト用 28 string adUnitId = "ca-app-pub-3940256099942544/6300978111"; 29 30 // Create a 320x50 banner at the top of the screen. 31 //※メンバ変数(Startの前に書いた変数)に入れる 32 bannerView = new BannerView(adUnitId, AdSize.Banner, AdPosition.Top); 33 34 // Create an empty ad request. 35 AdRequest request = new AdRequest.Builder().Build(); 36 37 // Load the banner with the request. 38 bannerView.LoadAd(request); 39 40 // Create a 320x50 banner at the top of the screen. 41 //bannerView = new BannerView(adUnitId, AdSize.Banner, AdPosition.Top); 42 } 43 44 // Update is called once per frame 45 void Update () { 46 47 } 48} 49

AdMob.csはオブジェクトにアタッチしており、バナー表示は正常に機能しています。
bannerViewのインスタンスはこちらのクラスで作成しており、作成したコンポーネントで表示/非表示を切り替えるという動作を考えています。

バナーの表示はされている→admobのインスタンスは動作しておりNullではないはず??
と考えており、詰まってしまっている所です。何が原因でどのようにすれば解消できるのでしょうか。
何かお気づきのことがあればご教示いただけますと幸いです。

試したこと

bannerViewの対象となるオブジェクトが参照されていないのではと考え、オブジェクトの参照を試みましたが改善できず。(そもそもバナー表示はできているのでオブジェクトは参照できている?)

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

 Unity Version 2019.1.13
AdmobSDK GoogleMobileAds-v4.1.0

Admob実装時の参考サイト(AdMob.cs)
https://uni.gas.mixh.jp/unity/android-admob.html

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

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

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

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

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

Y0241-N

2019/12/20 04:00

恐らくですが呼び出しのあとにAdMobの生成が行われているのではないでしょうか?
PiCo19072018

2019/12/20 05:34

追記、ありがとうございます。 呼び出しのあとにAdMobの作成が行われているのではとの事ですが、 http://tsubakit1.hateblo.jp/entry/2017/02/05/003714 こちらのサイトで紹介されているような事でしょうか? AdMob→AdbunnerComponent となるようにScript Execution Orderを設定や、メタデータの変更を行ってみたのですが、今のところは変化がないようでした。
guest

回答1

0

ベストアンサー

別々のスクリプト内のStartの順番は(設定で明示しない限り)保証されません。
つまりAdmobクラスのStartよりも先にAdshowComponentのStartクラスが発動している可能性があります。

Script Execution Orderを設定しても変わらないなら、Admobの内部機能で通信を行っているならばそれを待った上でbannerViewに中身が入るのだと思われます。
(エラーによる中断はスクリプト単位なので、AdshowComponentでエラーが起こってもAdmobクラスは問題無いので動作し続ける=バナーの描画は正常にされる、だと思います)

最初から表示状態にしたいならAdMobのRequestBannerメソッド内でShowすればいいので、
AdshowComponentのstart内でadmob.bannerView.Show();する必要はそもそも無いのではないでしょうか。

ちなみにAdshowComponentのadmob変数にAdmobクラスをセットし忘れている場合もエラーになるので、ちゃんとセットしているか再確認してください。

投稿2019/12/20 05:38

sakura_hana

総合スコア11425

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

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

PiCo19072018

2019/12/20 13:27

回答ありがとうございます。Startの順番の説明、ありがとうございました。広告が表示されているので動作していると考えていましたがそのような動きをするんですね。 >AdMobのRequestBannerメソッド内でShowすればいいので~ こちらについてですが、最初から表示状態にしたいというわけではなくコンポーネントよりバナー表示の切り替えを行いたいと考えており、このような形を取っています。 AdshowComponentの内容についてはこちらのサイト http://jokerscript.jp/adv/next/plugin を参考に制作をしており、シナリオファイルの中でAdshowComponentで作成した[adshow]、[adhide]のタグを使ってadmobバナーの表示/非表示を切り替えられたらと考えています。 不勉強で申し訳ないのですが、「admob変数にAdmobクラスをセットし忘れている」というのはどういう事でしょうか? どのような状況なのでしょうか?
sakura_hana

2019/12/21 01:55

とりあえずこのエラーは「admob.bannerView.Show();」の行へ辿り着いた時点で、 「admobの中身がnull」か「admobはnullではないが、bannerViewの中身がnull」という状態になっている為に発生します。 admobは「public AdMob admob;」と宣言されています。 なのでコメントにも書かれている通り「インスペクタから設定しておく」かスクリプトから代入する必要があります。 この時点で意味が分からないのなら(以前から伝えている気もしますが)「別クラスの変数へアクセスする」方法を学んでください。(調べればたくさん情報が出ます) admobはnullではないがbannerViewがnullの場合、 「admob.bannerView.Show();」へ辿り着いた時点ではまだAdMobクラスのRequestBannerメソッドが完了していないと予想されます。 なので一旦無視して通過する( if(admob.bannerView != null) {admob.bannerView.Show();} とするなど)か、 完了までコルーチン等で待機するか等の対処をしてください。 (どれが適切かはゲームの仕様によるので自分で決めてください)
PiCo19072018

2019/12/23 15:00

ご回答ありがとうございました。また返信遅れて申し訳ありません。 別の問題があると考えていましたが、原因は前回と同じだったのですね。 変数周りというか、プログラム自体の理解が浅く度々ご面倒おかけして申し訳ありません。 エラーを色々と調べてみた所、どうやらbannerViewがnullのようでした。 回答を頂いた内容を元に修正してみます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問