🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
AdMob

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

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

Q&A

解決済

1回答

5078閲覧

admob(Unity)のバナー広告の表示/非表示の切り替えを行いたい

PiCo19072018

総合スコア6

AdMob

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

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

0グッド

0クリップ

投稿2019/11/26 01:28

前提・実現したいこと

お世話になります。当方、Unityを使用してアプリ制作をしております。
無料のノベル制作ツール(JokerScript)を使用しアプリを制作、リリースをしていますが広告を付けたいと思い、admobを実装してみました。その際の広告の表示/非表示について質問させてください。

こちらのサイト(https://uni.gas.mixh.jp/unity/android-admob.html)を参考に実装し、バナー広告の表示については行う事が出来ました。

バナー広告は何もしなければ表示され続けてしまうため、表示/非表示を切り替えるコンポーネントを作成し、ノベル制作ツール上のスクリプトで表示の切り替えを行えるようにしたいと考えていますが、下記のエラーが解決できない状況になっていて困っています。

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

Assets/JOKER/Scripts/Novel/Components/AdbunnerComponent.cs(15,14): error CS0120: An object reference is required to access non-static member `GoogleMobileAds.Api.BannerView.Show()' Assets/JOKER/Scripts/Novel/Components/AdbunnerComponent.cs(33,14): error CS0120: An object reference is required to access non-static member `GoogleMobileAds.Api.BannerView.Hide()'

該当のソースコード

c#

1using UnityEngine; 2using System.Collections; 3using System.Collections.Generic; 4 5using GoogleMobileAds.Api; 6 7namespace Novel{ 8 9//バナー表示用処理 10 11 public class AdshowComponent:AbstractComponent 12{ 13 public AdshowComponent() 14 { 15 BannerView.Show(); 16 17// 案2ゲームオブジェクトの切り替えで何とか出来ないか? 18// adBunner.SetActive(true); 19 20 } 21 22 public override void start () 23 { 24//次のシナリオに進む処理 25    this.gameManager.nextOrder (); 26 27 } 28 } 29 30//バナー非表示用処理 31 public class AdhideComponent:AbstractComponent 32{ 33 public AdhideComponent() 34 { 35 BannerView.Hide(); 36 37// 案2ゲームオブジェクトの切り替えで何とか出来ないか? 38// adBunner.SetActive(false); 39 40 } 41 42 public override void start () 43    { 44//次のシナリオに進む処理 45    this.gameManager.nextOrder (); 46 47    } 48 49 } 50}

試したこと

上記のコードはツール(jokerscript)のコードを元に組んでみたものです。
ツール(JokerScript)上のスクリプトで[adshow][adhide]のタグで広告の表示/非表示が切り替わるようにしたいです。

▼試してみた事1
BannerView.Show();
BannerView.Hide();
で他のスクリプト内のstaticでないメソッドにアクセスしようとしているのが原因で、インスタンス化して参照するようにとの事らしいのですが。

BannerViewは、Assets\GoogleMobileAds\Api\BannerView.cs に入っている事を確認しており、そこから表示/非表示の処理を受け取って処理を行っていると考えています。
インスタンス化について調べて該当部分を変更してみたのですが、別のエラー( error CS0103: The name `GetClass' does not exist in the current context 名前がコンテキスト内にありません)が表示されてしまいお手上げとなっています。

▼試してみた事2
バナーの表示/非表示について、上記はadmobの機能を使用して表示/非表示をする方法ですが、admobが空のGameObjectに追加をして表示させていることから、そのGameObject自体の表示/非表示を切り替えてみてはどうかと思ったのですが、そちらはゲームオブジェクトの設定が上手くいかずに断念しました。

どちらかの方法で実現できると思っています。
1のエラーを解消する方法、もしくは2の不足部分(ゲームオブジェクトの設定?)をご教示いただけますと幸いです。

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

Unity Version 2019.1.13
AdmobSDK GoogleMobileAds-v4.1.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

広告表示側のコードでBannerViewのインスタンスを作っています。
参考サイトだとAdMob.csの28行目です。
BannerView bannerView = new BannerView(adUnitId, AdSize.Banner, AdPosition.Top);

これを(一時変数ではなく)メンバ変数に変更し、Novelクラスからアクセス出来るようにして、
例えばadmob.bannerView.Hide();という形でメソッドを呼び出せばいいのではと思います。
(一般的な「別クラスの変数へアクセスする」方法と一緒です)


(2019/12/09追記)

C#

1//前略 2public class AdMob : MonoBehaviour { 3 //バナービューに外からアクセス出来るようにしておく(インスペクタには出さない) 4 [HideIninspector] 5 public BannerView bannerView; 6 7 // Use this for initialization 8 void Start () { 9 //省略 10 } 11 12 private void RequestBanner(){ 13 14 // 広告ユニットID これはテスト用 15 string adUnitId = "ca-app-pub-3940256099942544/6300978111"; 16 17 // Create a 320x50 banner at the top of the screen. 18 //※メンバ変数(Startの前に書いた変数)に入れる 19 bannerView = new BannerView(adUnitId, AdSize.Banner, AdPosition.Top); 20 21 //以下略 22 } 23}

C#

1//前略 2namespace Novel{ 3 4 //バナー表示用処理 5 public class AdshowComponent:AbstractComponent { 6 7 //インスペクタから設定しておく 8 public Admob admob; 9 10 public AdshowComponent() 11 { 12 //AdmobのインスタンスにあるbannerView変数を使う 13 admob.bannerView.Show(); 14 } 15 //以下略 16 } 17 18 //バナー非表示用処理も同様 19}

投稿2019/11/26 02:31

編集2019/12/09 05:21
sakura_hana

総合スコア11427

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

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

PiCo19072018

2019/11/26 12:19

早速の回答、ありがとうございました。 プログラムについては挑戦し始めたばかりで右も左もわからず苦戦していますが、回答を参考に挑戦してみます。
PiCo19072018

2019/12/01 05:02

追加で質問させて下さい。コードを以下のように変更した所、 error CS0103: The name `admob' does not exist in the current context のエラーが発生するようになってしまいました。 コンテキスト内に存在しないという事のようですが、using のように何か必要な記載があるのでしょうか? それとも別の問題でエラーになっているのでしょうか。 以下、ソースコード。 ///////////////////////////////////////// AdMob.cs using UnityEngine; using System.Collections; using System.Collections.Generic; using GoogleMobileAds.Api; namespace Novel{ //バナー表示用処理 public class AdshowComponent:AbstractComponent   { public AdshowComponent() { //admobクラスのbannerViewのShow()を呼び出して実行。 admob.bannerView.Show(); } public override void start () {   //次のシナリオに進む処理     this.gameManager.nextOrder (); } } //バナー非表示用処理 public class AdhideComponent:AbstractComponent   { public AdhideComponent() { //admobクラスのbannerViewのHide()を呼び出して実行。 admob.bannerView.Hide(); } public override void start ()    {   //次のシナリオに進む処理     this.gameManager.nextOrder ();    } } } ///////////////////////////////////////// エラーが発生している該当ソースコード AdbunnerComponent.cs ------- using UnityEngine; using System.Collections; using System.Collections.Generic; using GoogleMobileAds.Api; namespace Novel{ //バナー表示用処理 public class AdshowComponent:AbstractComponent   { public AdshowComponent() { //admobクラスから処理を呼び出して実行。 admob.bannerView.Show(); } public override void start () {   //次のシナリオに進む処理     this.gameManager.nextOrder (); } } //バナー非表示用処理 public class AdhideComponent:AbstractComponent   { public AdhideComponent() { //admobクラスから処理を呼び出して実行。 admob.bannerView.Hide(); } public override void start ()    {   //次のシナリオに進む処理     this.gameManager.nextOrder ();    } } } ///////////////////////////////////////// BannerView.cs ------- using System; using GoogleMobileAds.Common; namespace GoogleMobileAds.Api { public class BannerView { private IBannerClient client; // Creates a BannerView and adds it to the view hierarchy. public BannerView(string adUnitId, AdSize adSize, AdPosition position) { this.client = GoogleMobileAdsClientFactory.BuildBannerClient(); client.CreateBannerView(adUnitId, adSize, position); ConfigureBannerEvents(); } // Creates a BannerView with a custom position. public BannerView(string adUnitId, AdSize adSize, int x, int y) { this.client = GoogleMobileAdsClientFactory.BuildBannerClient(); client.CreateBannerView(adUnitId, adSize, x, y); ConfigureBannerEvents(); } // These are the ad callback events that can be hooked into. public event EventHandler<EventArgs> OnAdLoaded; public event EventHandler<AdFailedToLoadEventArgs> OnAdFailedToLoad; public event EventHandler<EventArgs> OnAdOpening; public event EventHandler<EventArgs> OnAdClosed; public event EventHandler<EventArgs> OnAdLeavingApplication; // Loads an ad into the BannerView. public void LoadAd(AdRequest request) { client.LoadAd(request); } // Hides the BannerView from the screen. public void Hide() { client.HideBannerView(); } // Shows the BannerView on the screen. public void Show() { client.ShowBannerView(); } // Destroys the BannerView. public void Destroy() { client.DestroyBannerView(); } // Returns the height of the BannerView in pixels. public float GetHeightInPixels() { return client.GetHeightInPixels(); } // Returns the width of the BannerView in pixels. public float GetWidthInPixels() { return client.GetWidthInPixels(); } // Set the position of the BannerView using standard position. public void SetPosition(AdPosition adPosition) { client.SetPosition(adPosition); } // Set the position of the BannerView using custom position. public void SetPosition(int x, int y) { client.SetPosition(x, y); } private void ConfigureBannerEvents() { this.client.OnAdLoaded += (sender, args) => { if (this.OnAdLoaded != null) { this.OnAdLoaded(this, args); } }; this.client.OnAdFailedToLoad += (sender, args) => { if (this.OnAdFailedToLoad != null) { this.OnAdFailedToLoad(this, args); } }; this.client.OnAdOpening += (sender, args) => { if (this.OnAdOpening != null) { this.OnAdOpening(this, args); } }; this.client.OnAdClosed += (sender, args) => { if (this.OnAdClosed != null) { this.OnAdClosed(this, args); } }; this.client.OnAdLeavingApplication += (sender, args) => { if (this.OnAdLeavingApplication != null) { this.OnAdLeavingApplication(this, args); } }; } // Returns the mediation adapter class name. public string MediationAdapterClassName() { return this.client.MediationAdapterClassName(); } } }
sakura_hana

2019/12/02 02:18

エラーメッセージをそのままググれば大体同じようなトラブルの対処法が出て来ると思います。 よく見ると、namespace以前にadmobという変数の定義がどこにも行われていないことが分かります。定義されていない変数は当然使えません。 回答の中で記載していますが、「別クラスの変数へアクセスする方法」を調べれば分かると思うのでググってみてください。
PiCo19072018

2019/12/04 14:54

度々お手数おかけします。 同じようなトラブルを調べてみていますが、プログラムの基本も分かっていないため、まだひとつひとつ調べているような状態でなかなかうまくいきません。 解決までまだ時間が掛かりそうですがまずはお礼まで。回答ありがとうございました。
PiCo19072018

2019/12/06 13:02

調べている内に問題、不明点がありましたので質問させて下さい。 他のクラスやメソッドを利用する場合、 using ~(名前空間); を設定すれば該当の名前空間の中にあるクラスやメソッドを持ってくる事ができるようになると知りました。 名前空間については呼び出し対象のAdMob.csのAdmobクラスにはnamespaceの設定が無かったので設定を行いました。 namespace AdMobBunner{ }の中にclass AdMob を入れて、 呼び出し側にusing AdMobBunner; を追加したのですが、これまでと同様のエラー(error CS0103: The name `admob' does not exist in the current context)で処理が行えませんでした。 3点質問があります。(うち二点はこのプログラムではなく一般的な質問) ①別クラスから変数を持ってこられるようにするには上記の方法、考え方で正しいのでしょうか。 またこの方法が正しいのであれば何が問題でclass admobが存在しないというエラーが出ているのでしょうか。 ②名前空間に関して、命名規則のようなものはありますか? (名前の最初は大文字にするようですが、例えば中のクラス名と同じにしなければいけないなどありますか? プログラマーが判り易いように自由に名付けたり、プロジェクト毎(会社、部署等)にルールを決めて運用しているようなものでしょうか?) ③名前空間の指定が無かったAdMob.csは他のサイトを参考に何も疑問を持たずに持ってきてしまいましたが、今回のように名前空間の宣言をせずにclassを作った場合、何か問題があったりするのでしょうか。(他のclassで使用することが無ければ名前空間の設定は特にしなくても良いということでしょうか) ②、③については今後プログラムに触れる際に考えやすくなるかと思い質問させていただきました。可能でしたらご回答いただけますでしょうか。
sakura_hana

2019/12/09 05:43

コード書いた方が早そうだったので回答を編集しました。 >①別クラスから変数を持ってこられるようにするには上記の方法、考え方で正しいのでしょうか。 正しいと言えば正しいですが、今回は不要だと思います(うろ覚えなので怪しいですが)。 >何が問題でclass admobが存在しないというエラーが出ている 存在しないのはAdmobクラスではなくadmob"変数"です。(最初にコメントした通りです) >②名前空間に関して、命名規則のようなものはありますか? 名前空間は「名前の集合を分割することで衝突の可能性を低減しつつ参照を容易にする概念」です(Wikipediaより)。 それでいくと名前空間と中のクラス名が同じというのはあまり無いように思います。 そのほかの命名規則は組織で決まっていたり各言語で推奨があったりするので適宜調べてください。 (名前空間に限らない話なのでとりあえず「リーダブルコード 命名規則」などでググるとよいかと) >③名前空間の宣言をせずにclassを作った場合、何か問題があったりするのでしょうか。 同じ名前のクラスが作れません。 例えば「Admobの広告を操作する為のAdControllerクラス」と「Admob以外の広告を操作する為のAdControllerクラス」は同じ名前空間には存在出来ませんが、それぞれnamespaceを指定すれば存在可能です。 あとはそのクラスを使用する(呼び出す)側が、usingでどちらの名前空間を使用するか、「Admob.AdController」「Other.AdController」と明示して使います。 逆に言えば、クラス名の重複が無いのなら名前空間を分ける必要はありません。 (名前空間を宣言しない場合どこに属すのかは私はよく分かりません、必要ならご自分で調べてみてください)
PiCo19072018

2019/12/11 15:44

返信遅れました。コードの追記、及び丁寧な解説、ありがとうございました。 コードについては別途エラー(CS0246:The type or namespace name `Admob' could not be found. Admobの型もしくはネームスペースが見つからない)が出てしまったので、原因を調べている所です。回答を頂いた内容を参考に進めてみます。 質問についてですが一度解決済みとし、今出ているエラーについて判らないようでしたら別途質問を上げるようにいたします。 重ねてとなりますが、度々の質問への回答、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問