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

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

ただいまの
回答率

87.77%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,184

score 27

前提・実現したいこと

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の備忘録 様
Unity+UnrealEngine4+Blog 様

インポートしたGoogleMobileAdsのバージョンは5.4.0になります。
CreateButtonBehavior()の部分をコメントアウトした場合は警告は出なくなりますが
今度はバナーをクリックした場合にエラーが表示されます。(パソコンのみ)

Unityのバージョン:2018.4.28f1
言語:C#

よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fiveHundred

    2021/01/24 22:43 編集

    私自身、頭の整理をせずに発言してしまったので申し訳ないのですが、コードだけでなく、何かのゲームオブジェクトにButtonBehaviourをアタッチしているのかも重要だと思っていたので、そちらも記載してほしかったのです。

    なぜ、そのようなことを聞いているのかというと、MonoBehaviourを継承したスクリプト(=ButtonBehaviour)はゲームオブジェクトにアタッチして使うものなので、以下のどちらかを取る必要があるからです。
    A. 既に存在するButtonBehaviourを取得する
    B. 新しくゲームオブジェクトを作成し、そちらにButtonBehaviourをAddComponentでアタッチする

    そのため、「既にButtonBehaviourをアタッチしたオブジェクトが存在する場合」と「存在しない場合」で解決策が異なるだろう、と判断したからです。
    「存在する場合」は「A.」に該当します。
    一方で、「存在しない場合」は「B.」になる…と思っていたのですが、今よくよく考えたら、ButtonBehaviourをアタッチするだけでなくButtonもアタッチして設定する必要があり面倒そうなので、ボタンを作成して「A.」の方法を取ったほうがよさそうです。

    ただ、「A.」は質問文に提示してあるサイトの内容とほぼ一致しています。
    「調べたサイトのように書き換えてみたもの」がどのようなものかよく分からないので、どのように修正したのか、修正後にどんなエラーが表示されたのか、シーンのゲームオブジェクトがどうなっていてButtonBehaviourはどのゲームオブジェクトにアタッチしているのか、を記載してくれると解決できるかもしれません。

    キャンセル

  • Z_Silver

    2021/01/25 00:57 編集

    返信ありがとうございます。
    一旦、空のゲームオブジェクト(Behaviour)を作成し、ButtonBehaviour(ソース)をアタッチして
    BannerClient.csの
    buttonBehaviour = new ButtonBehaviour();を

    ButtonBehaviour buttonBehaviour = GameObject.Find("Behaviour").GetComponent<ButtonBehaviour>();と変更し
    ゲームを実行したところ警告メッセージは出なくなり問題を解決することができました。
    fiveHundred様 ありがとうございました。

    キャンセル

  • Z_Silver

    2021/01/25 07:57 編集

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

    キャンセル

回答 1

check解決した方法

+1

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

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

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