Pの雑記

大体のんびりゲームの感想を書いています。

Unity Adsで広告実装出来なかったのでUnity Monetization使った話

 これはUnityでアプリ開発中に備え付けのUnity Ads使おうとしたら役に立たなかった時の話である。

 

 

前置き

単純な実装で良い人は下記参照。
 
 
俺は広告が失敗したかどうか取得したかったので、これでは駄目だったという事である。
 
 public void ShowAd()
 {
  // このメソッドをボタンから呼び出す
  
  if (Advertisement.IsReady())
  {
   Advertisement.Show();
  }
 }
 
というか俺の場合これすらAdvertisementが無くて駄目だった。usingしても無かったのでプログラムが元々無さそう。
これはバージョン2018.4.12fの話である。でも元のプロジェクトはもうちっと前の奴。
そこで色んな手段を試していたらなぜかUnity Monetizationに行き着いたという流れ。
結局原因を解決しないまま別の手段を選んだという、ある意味負けている話だ。
 

前置きその2

前略、俺はクソゲーを作っていた。
スタミナ制のこんな奴だ。

play.google.com

f:id:nazobutup:20191127130243p:plain
f:id:nazobutup:20191127130248p:plain

 

同じ数値をタップすると数値が増える!
高い数値を押すとコインを稼げる!
コインを稼ぐと最初の数値が増やせてもっとコインが稼げる!
 
……つまりクソゲーなので、スタミナ制にしないと飽きるという建前の元、何らかの収益化を図る為にスタミナをつけた。
最近のマージ系ゲームに寄せて作ろうと思った結果前のゲームを使ったんだが、マージ系ってやっぱ冷静に見るとクソゲーだよね。
(注:試行錯誤をする必要性のない物はクソゲーだと思っている人の意見です)

なお原型はこれ。実は5月に作ってるのでマージゲーム意識したかすら定かではない。2048の影響は受けてた。

 

plicy.net

 

まぁそれはさておき、これに必要なのは広告が失敗したかどうかである。
広告を見れなかったのに無限に回復されるのは困る。
というわけでその成否を取得しようと思った。
その為に講じた手段を書いていく。

 

成功例

 アセットストアからUnity Monetizationダウンロードしてインポートしてこれを書く。

 

 using UnityEngine.Monetization;
 // ゲームIDを入れる。これはでたらめな数値
 // Unity adsにログインして該当ゲーム→Settings→Project SettingsにあるGame IDs
 private string _gameId = "98565";
    private bool testMode = false; // true=test
    void Start () {
     // Unity Monetizationでは明示的な初期化が必要
        Monetization.Initialize(_gameId, testMode);
    }
    public void adstart()
    {
     // 広告スタート時ここを呼ぶ
        if (Advertisement.IsReady("rewardedVideo"))
        {
            // ビデオ見せる
 
   // asから先無いと駄目、キャストしてる事までは分かった
            ShowAdPlacementContent pc = Monetization.GetPlacementContent("rewardedVideo") as ShowAdPlacementContent;
            if (pc != null)
            {
                pc.Show(HandleShowResult); // HandleShowResultに結果格納して呼び出してるっぽい
            }

        }
    }
   
    //広告結果イベント
    private void HandleShowResult(UnityEngine.Monetization.ShowResult result)
    {
        switch (result)
        {
            //最後まで終了
            case UnityEngine.Monetization.ShowResult.Finished:
    // ここにやりたい処理を書いてね
    
                break;
            //途中スキップ
            case UnityEngine.Monetization.ShowResult.Skipped:
                // ここにやりたい処理を書いてね
               
                break;
            //表示失敗
            case UnityEngine.Monetization.ShowResult.Failed:
                // ここにやりたい処理を書いてね
               
                break;
        }
    }

 

 なお必要部分抜き出しただけなので何か間違っているかも知れない。すまぬ。
実際にはこれに加えてダイアログで「広告を見てスタミナを回復しますか? はい いいえ」を作る事が必要になる。
何か押しただけで確認ダイアログ入れず広告再生するとBANされるって聞いた。
あと同じ広告とか表示されそうな気がする。

 

駄目な例1

 先述の元々入ってるUnity Ads。
そもそもとして何か入ってなかったっぽい。
原因は不明である。バージョン上げたからか?
経験上Assetsからreimport allとかしたらいけそうな気はするが試していない。
Unity Monetizationダウンロードしたらエラーは消えた。
消えたが、元々のを無効化しないままほっといたらビルドエラーが出た。
無効化した。

 

駄目な例2

公式。

github.com

 

 下記にさっきのStart()とHandleShowResult()を書き加えた物。

 

    public void adstart()
    {
     // 広告スタート時ここを呼ぶ
        if (Advertisement.IsReady("rewardedVideo"))
        {
         ShowOptions options = new ShowOptions();
         options.resultCallback = HandleShowResult;
         Advertisement.Show ("rewardedVideo", options);
       
        }
       
     }
 
何がいけないって、options.resultCallbackは旧形式ですと出る。
これ公式なんですけど!?
新形式は発見できなかった。っていうかそもそも多分これ元々入ってる奴向けの古いコードっぽい。
 

結論

「unity ShowOptions」とか色々探し回ってたらこれに行き着いた。

 

Unity Monetization SDK 3.0 で動画広告を表示するサンプルスクリプト(コールバックにUnityEventをつかったバージョン) · GitHub

 

var showAdPlacementContent = Monetization.GetPlacementContent(PlacementId) as ShowAdPlacementContent;
showAdPlacementContent?.Show(_showAdCallbacks);
 
この文を見て実装してみたら出来たという話である。

後は成功例をご覧ください。
やっぱプログラムは自分で試行錯誤して作らないと無理だね!

これも役に立たないかも知れないので自分で考えて調べる必要はあると思う。