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

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

詳細はこちら
AdMob

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

C#

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

Unity

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

Q&A

解決済

1回答

5386閲覧

UnityでAdMob(ver5.4.0)を導入後、ゲームを実行するたびに警告メッセージが表示されます。

Z_Silver

総合スコア27

AdMob

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

C#

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

Unity

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

0グッド

1クリップ

投稿2021/01/23 14:10

編集2021/01/25 02:56

###前提・実現したいこと
UnityでAdMobの導入後以下の警告メッセージがゲームを実行するたびに表示されてしまいます。

調べるとMonoBehaviourを継承したClassのインスタンスを作成する時にNewを使用してインスタンスを作成すると出てくるエラー
らしいのですが調べたサイトのように書き換えてみたもののエラーが逆に増えてしまったため
こちらで質問することにしました。

警告メッセージ
イメージ説明
実行前と実行中の画像
イメージ説明
###警告内容

You are trying to create a MonoBehaviour using the 'new' keyword. This is not allowed. MonoBehaviours can only be added using AddComponent(). Alternatively, your script can inherit from ScriptableObject or no base class at all UnityEngine.MonoBehaviour:.ctor() ButtonBehaviour:.ctor() GoogleMobileAds.Unity.BannerClient:CreateButtonBehavior() (at Assets/GoogleMobileAds/Platforms/Unity/BannerClient.cs:64) GoogleMobileAds.Unity.BannerClient:ShowBannerView() (at Assets/GoogleMobileAds/Platforms/Unity/BannerClient.cs:143) GoogleMobileAds.Unity.BannerClient:LoadAd(AdRequest) (at Assets/GoogleMobileAds/Platforms/Unity/BannerClient.cs:123) GoogleMobileAds.Api.BannerView:LoadAd(AdRequest) (at Assets/GoogleMobileAds/Api/BannerView.cs:61) AdMobManager:RequestBanner() (at Assets/Project/Scripts/Admob/AdMobManager.cs:40) AdMobManager:Awake() (at Assets/Project/Scripts/Admob/AdMobManager.cs:19) ``` ###該当のソースコード BannerClient.cs

using System;
using System.Reflection;
using System.Collections.Generic;
using GoogleMobileAds.Api;
using GoogleMobileAds.Common;

using UnityEngine;
using UnityEngine.UI;

namespace GoogleMobileAds.Unity
{
public class BannerClient : BaseAdDummyClient, IBannerClient
{
// Ad event fired when the banner ad has been received.
public event EventHandler<EventArgs> OnAdLoaded;
// Ad event fired when the banner ad has failed to load.
public event EventHandler<AdFailedToLoadEventArgs> OnAdFailedToLoad;
// Ad event fired when the banner ad is opened.
public event EventHandler<EventArgs> OnAdOpening;
// Ad event fired when the banner ad is closed.
public event EventHandler<EventArgs> OnAdClosed;
// Ad event fired when the banner ad is leaving the application.
public event EventHandler<EventArgs> OnAdLeavingApplication;
// Ad event fired when the banner ad is estimated to have earned money.
public event EventHandler<AdValueEventArgs> OnPaidEvent;

private Dictionary<AdSize, string> prefabAds = new Dictionary<AdSize, string>() { {AdSize.Banner, "DummyAds/Banners/BANNER"}, {AdSize.SmartBanner, "DummyAds/Banners/SMART_BANNER" }, {AdSize.MediumRectangle, "DummyAds/Banners/MEDIUM_RECTANGLE" }, {AdSize.IABBanner, "DummyAds/Banners/FULL_BANNER" }, {AdSize.Leaderboard, "DummyAds/Banners/LEADERBOARD" }, {new AdSize (320,100), "DummyAds/Banners/LARGE_BANNER" } }; private ButtonBehaviour buttonBehaviour; private void AddClickBehavior(GameObject dummyAd) { Image myImage = dummyAd.GetComponentInChildren<Image>(); Button button = myImage.GetComponentInChildren<Button>(); button.onClick.AddListener(() => { buttonBehaviour.OpenURL(); }); }

//該当部分-----------------------------------------------
private void CreateButtonBehavior()
{
buttonBehaviour = new ButtonBehaviour(); //←警告メッセージが出ている箇所
buttonBehaviour.OnAdOpening += OnAdOpening;
buttonBehaviour.OnLeavingApplication += OnAdLeavingApplication;
}

//-----------------------------------------------

<省略>

// Shows the banner view on the screen.
public void ShowBannerView()
{
dummyAd = AdBehaviour.ShowAd(prefabAd, getRectTransform(prefabAd).anchoredPosition);
CreateButtonBehavior();
AddClickBehavior(dummyAd);
}

###該当のソースコード ButtonBehaviour.cs

using UnityEngine;
using UnityEngine.UI;
using System;

public class ButtonBehaviour : MonoBehaviour
{
public event EventHandler<EventArgs> OnAdOpening;
public event EventHandler<EventArgs> OnLeavingApplication;

public void OpenURL() { Debug.Log("Opened URL"); Application.OpenURL("http://google.com"); if (OnAdOpening != null) { OnAdOpening.Invoke(this, new EventArgs()); } if (OnLeavingApplication != null) { OnLeavingApplication.Invoke(this, new EventArgs()); } }
調べたサイト [UNITY5の備忘録 様](http://fumotoppara.blog.fc2.com/blog-entry-9.html) [Unity+UnrealEngine4+Blog 様](https://nabesi777.hatenablog.com/entry/2018/12/07/%E3%82%A8%E3%83%A9%E3%83%BC%E8%A7%A3%E6%B1%BA%EF%BC%9AYou_are_trying_to_create_a_MonoBehaviour_using_the_%27new%27_keyword__This_is_not_allowed__MonoBehaviours_can_only_be_added_using_AddComponent%28) インポートしたGoogleMobileAdsのバージョンは5.4.0になります。 CreateButtonBehavior()の部分をコメントアウトした場合は警告は出なくなりますが 今度はバナーをクリックした場合にエラーが表示されます。(パソコンのみ) Unityのバージョン:2018.4.28f1 言語:C# よろしくお願いします。

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

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

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

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

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

fiveHundred

2021/01/24 08:40

ButtonBehaviourは名前からしてボタンにアタッチするスクリプトだと思いますが、そのボタンはどこでしょうか? もしくは警告が出ている箇所で生成しようとしているのでしょうか?
Z_Silver

2021/01/24 12:59 編集

ご指摘有難うございます。該当のソースを追加しました。 ShowBannerView()にてCreateButtonBehavior()が呼び出され 広告のバナーを生成して、押した時にOpenURL()を実行してるものだと思われます。 ※テスト用の広告のバナーをクリック(タップ)したときGoogleのホームページ(Google AdMobのページ)に飛ぶ処理の部分ではないかと・・
fiveHundred

2021/01/24 12:57

私が知りたいのは『『ButtonBehaviour』』です。 「BannerClient」ではありません。
fiveHundred

2021/01/24 13:05

ああすいません、上記の発言は自分で言ってて矛盾してますね。 ただ、現状ではButtonBehaviourがどういうものなのか分からないですし、Behaviourなのだからボタンにアタッチ済み、もしくはアタッチさせる必要があるのに、なぜnewをするようなことをするのかが分からないのでそのようなことを聞いてるわけなのです。
Z_Silver

2021/01/24 13:12 編集

申し訳ございません。ButtonBehaviourのソースを追加しました。
fiveHundred

2021/01/24 13:45 編集

私自身、頭の整理をせずに発言してしまったので申し訳ないのですが、コードだけでなく、何かのゲームオブジェクトにButtonBehaviourをアタッチしているのかも重要だと思っていたので、そちらも記載してほしかったのです。 なぜ、そのようなことを聞いているのかというと、MonoBehaviourを継承したスクリプト(=ButtonBehaviour)はゲームオブジェクトにアタッチして使うものなので、以下のどちらかを取る必要があるからです。 A. 既に存在するButtonBehaviourを取得する B. 新しくゲームオブジェクトを作成し、そちらにButtonBehaviourをAddComponentでアタッチする そのため、「既にButtonBehaviourをアタッチしたオブジェクトが存在する場合」と「存在しない場合」で解決策が異なるだろう、と判断したからです。 「存在する場合」は「A.」に該当します。 一方で、「存在しない場合」は「B.」になる…と思っていたのですが、今よくよく考えたら、ButtonBehaviourをアタッチするだけでなくButtonもアタッチして設定する必要があり面倒そうなので、ボタンを作成して「A.」の方法を取ったほうがよさそうです。 ただ、「A.」は質問文に提示してあるサイトの内容とほぼ一致しています。 「調べたサイトのように書き換えてみたもの」がどのようなものかよく分からないので、どのように修正したのか、修正後にどんなエラーが表示されたのか、シーンのゲームオブジェクトがどうなっていてButtonBehaviourはどのゲームオブジェクトにアタッチしているのか、を記載してくれると解決できるかもしれません。
Z_Silver

2021/01/24 16:00 編集

返信ありがとうございます。 一旦、空のゲームオブジェクト(Behaviour)を作成し、ButtonBehaviour(ソース)をアタッチして BannerClient.csの buttonBehaviour = new ButtonBehaviour();を ButtonBehaviour buttonBehaviour = GameObject.Find("Behaviour").GetComponent<ButtonBehaviour>();と変更し ゲームを実行したところ警告メッセージは出なくなり問題を解決することができました。 fiveHundred様 ありがとうございました。
Z_Silver

2021/01/24 23:13 編集

ボタンを作成した場合も同様の手順で問題なく動作しました事をお伝えします。
guest

回答1

0

自己解決

fiveHundred様のご回答により問題が解決致しました。

GoogleMobileAds>Platforms>Unity内の
BannerClientに書かれている
buttonBehaviour = new ButtonBehaviour();を

ButtonBehaviour buttonBehaviour = GameObject.Find("[ゲームオブジェクト]").GetComponent<ButtonBehaviour>();に変更

各シーンごとに[ゲームオブジェクト]を生成し、GoogleMobileAds>Platforms>Unity内のButtonBehaviourを生成した[ゲームオブジェクト]にアタッチする

また、GoogleMobileAds5.4.0で発生した現象であり
旧バージョンでも発生するかは不明です。
(BannerClientの内容が変わってる?為、2018年頃に使ってたものでは発生した記憶がない為)

//--追記--
※インタースティシャル広告を使用する際も同様の警告が発生しましたのでお伝えします。

投稿2021/01/25 02:51

編集2021/01/26 13:36
Z_Silver

総合スコア27

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問