自動化

【PlayFab】リワード広告を統合する方法【UnityAdsを使用】

playfab-reward-ads

無料アプリには欠かせない、広告の実装。

短い動画を見ることで、ゲーム内の仮想通貨やアイテム(報酬)を付与する、というのが一般的です。

これを「リワード広告」といいます。

PlayFab では、管理画面で登録しておいた情報から報酬を付与する仕組みが提供されています。

しかし、公式ドキュメントにサンプルプログラムが載っておらず、実装に少し苦戦してしまいました。

ということでこの記事では、UnityAds を使った報酬を付与する具体的な方法を詳しく解説しています。

サンプルプログラムも用意しているので、読み終える頃には簡単に実装ができるようになっているはずです。

では、さっそく見ていきましょう。

サンプルプログラムの動き

今回は UnityAdsWithPlayFab というサンプルプログラムを用意しました。

プロジェクトを開くと、以下の画面が出てきます。

playfab-reward-ads

「GetReward!!」を押すと動画広告が流れて、閉じると報酬を受け取れる仕組みです。

また、動画広告に回数制限をもたせる場合、何度もボタンを押せないように制御する必要があります。

その場合は、ボタンのテキストに「次に動画広告が見れるまでの時間」を表示するようにしました。

playfab-reward-ads

サンプルプログラムの動きはこんな感じです。

ということで、細かく中身を見ていきましょう。

リワード広告を統合する方法

この記事は、公式ドキュメントの「リワード広告のクイックスタート」を参考に作成しました。

UnityAds の実装

UnityAds の環境構築や実装については、公式ドキュメントがかなり詳しいので、この通り進めてください。

私が用意したサンプルプログラムを動かす上では、特に公式ドキュメントを読む必要はありません。

この記事では PlayFab の内容に焦点を絞って説明します。

PlayFab での広告を定義する

UnityAds の実装ができたら、次はPlayFab の管理画面からリワード広告を定義します。

自動化 > リワード広告 > 新しい広告配置」と進んでください。

playfab-reward-ads

すると以下の画面になるので、必要な情報を入力していきます。

playfab-reward-ads

項目の説明は以下の通り。

配置名 好きな名前で問題なし
AppId Unity Dashboard で確認(7桁の数値)
広告ユニット Unity Dashboard で確認

念のため、Unity Dashboard の画面キャプチャも載せておきます。

playfab-reward-ads

Game ID が iOS と Android で分かれているので、PlayFab 管理画面からの登録も2つ必要になります。

今回は、iOS のみの登録としました。

入力ができたら、「リワードを保存して追加」のボタンを押しましょう。

以下の画面になるので、「新しいリワード」のボタンを押してください。

playfab-reward-ads

すると、実際の報酬で何を与えるかを登録する画面に移ります。

playfab-reward-ads

今回は「仮想通貨 1000 ゴールドを付与する」という設定にしました。

ねこじょーかー
ねこじょーかー
仮想通貨の登録がまだの人は、経済のクイックスタートを参考に登録してください!

最後に「リワードを保存」を押すと、以下の画面になります。

playfab-reward-ads

下にある「セグメントの割り当て」では、いま登録した「EarnGold」を指定しています。

報酬をランダムにしたい場合は、別のリワードを追加して「ランダムに選択」を指定してあげればOKです。

これで、PlayFab 管理画面でやる作業は完了しました。

次からはプログラムを見ていきましょう。

おおまかに、以下に順番で処理をする必要があります。

  1. 登録した広告配置の取得
  2. アクティビティの報告
  3. 報酬の付与
ペンギンくん
ペンギンくん
なるほど。ここまでは理解できたぞ。

登録した広告配置の取得

まずは先ほど登録した広告配置を取得します。

取得するには、GetAdPlacements というメソッドを使用すればOKです。

public static string PlacementId { get; private set; } = "";
public static string RewardId { get; private set; } = "";
public static int? PlacementViewsRemaining { get; private set; } = null;
public static double? PlacementViewsResetMinutes { get; private set; } = null;

public void GetAdPlacements(string gameId, string placementName)
{
    PlayFabClientAPI.GetAdPlacements(new GetAdPlacementsRequest { AppId = gameId }
    , result =>
    {
        var placement = result.AdPlacements.Find(x => x.PlacementName == placementName);
        PlacementId = placement.PlacementId;
        RewardId = placement.RewardId;
        PlacementViewsRemaining = placement.PlacementViewsRemaining;
        PlacementViewsResetMinutes = placement.PlacementViewsResetMinutes;

        Debug.Log("GetAdPlacements Success!!");
    }, error =>
    {
        Debug.Log(error.GenerateErrorReport());
    });
}

保持しているプロパティは以下の通り。

プロパティ
PlacementId 後続の API で使うため保持
RewardId 後続の API で使うため保持
PlacementViewsRemaining あと何回報酬をもらえるか
PlacementViewsResetMinutes 回数が回復するまであと何分か

まずは何回でも報酬をもらえるパターンで説明していきます。

また、引数の情報は以下の通り。

引数
gameId PlayFab の管理画面で登録した AppId
placementName rewardedVideo

これで、管理画面から登録した情報の取得ができました。

アクティビティの報告

ペンギンくん
ペンギンくん
アクティビティ?

「アクティビティ」と聞くとよくわかりませんが、要するに「広告がどういう状態になっているか」という意味です。

たとえばUnityAds では、動画広告の表示が終わったタイミングで、以下のステータスが返ってきます。

Finished 動画をスキップせず最後まで視聴した
Skipped 動画がスキップされた
Failed 動画表示に失敗した

上記のようにステータスが変わるタイミングで、PlayFab に対しても変わったことを通知して上げる必要がある、ということです。

この通知は ReportAdActivity という API を使用します。

public void ReportAdActivity(AdActivity activity)
{
    PlayFabClientAPI.ReportAdActivity(new ReportAdActivityRequest { PlacementId = PlacementId, RewardId = RewardId, Activity = activity }
    , result =>
    {
        if (activity == AdActivity.End)
            RewardAdActivity();
    }, error =>
    {
        Debug.Log(error.GenerateErrorReport());
    });
}

「AdActivity」というのが PlayFab で用意されているステータスの列挙体です。

今回は以下の意味合いで使用します。

AdActivity
Opened 今回は使用しない
Closed スキップやそのほか異常終了
Start 広告が始まったタイミング
End 動画をスキップせず最後まで視聴した

上記の AdActivity は明確な意味が定義がされていないため、使用する人が勝手に決めてしまって良いと思います。

実際には以下のタイミングで呼び出しました。

public void OnUnityAdsDidFinish(string placementId, ShowResult showResult)
{
    if (showResult == ShowResult.Finished)
    {
        Debug.Log("Reward Finish!!");
        PlayFabController.Instance.ReportAdActivity(AdActivity.End);
    }
    else if (showResult == ShowResult.Skipped)
    {
        Debug.Log("Reward Skipped...");
        PlayFabController.Instance.ReportAdActivity(AdActivity.Closed);
    }
    else if (showResult == ShowResult.Failed)
    {
        Debug.Log("Reward Failed...");
        PlayFabController.Instance.ReportAdActivity(AdActivity.Closed);
    }
}

public void OnUnityAdsDidStart(string placementId)
{
    Debug.Log("Reward Start!!");
    PlayFabController.Instance.ReportAdActivity(AdActivity.Start);
}

これをするとどうなるかというと、PlayFab の管理画面からデータが詳しく見れるようになります。

playfab-reward-ads

スキップされたのか、ちゃんと最後まで視聴されたのかなど、詳しいデータが取れそうですね。

報酬の付与

最後に、動画を最後まで見た人に報酬を付与します。

RewardAdActivity という API を使用すればOKです。

public void RewardAdActivity()
{
    PlayFabClientAPI.RewardAdActivity(new RewardAdActivityRequest { PlacementId = PlacementId, RewardId = RewardId }
    , result =>
    {
        Debug.Log("GrantedVirtualCurrencies:" + result.RewardResults.GrantedVirtualCurrencies["GD"]);
    }, error =>
    {
        Debug.Log(error.GenerateErrorReport());
    });
}

この処理自体はシンプルですね。

先ほど実装した、ReportAdActivity にてステータスが End の場合のみ、呼び出されるようにしています。

実行して以下のようなログが出たら、無事成功です。

playfab-reward-ads

参考までに、PlayStream は以下のように出ます。

playfab-reward-ads

ここまで、基本の流れをひと通り説明しました。

ペンギンくん
ペンギンくん
次からは回数制限を入れる場合だね。

回数制限を入れる場合の実装

次に、何度も広告報酬を与えたくない場合の実装方法です。

リワード制限を設定する

一度 PlayFab の管理画面に戻り、「リワード制限」を設定しましょう。

playfab-reward-ads

上記の例では、「1時間に2回まで」という制限をしています。

制限を超えないように制御する

制限を超えて RewardAdActivity を呼び出すと、「これ以上の報酬を与えるのは無理だよエラー」が出てしまいます。

具体的には、All Ad Placement Views Already Consumed というエラーです。

管理画面で設定をしただけでは不十分で、プログラムから制御して上げる必要があります。

ここで最も重要になることは、「報酬を与えたタイミングで、再度 GetAdPlacements を呼び出す」という点です。

これをやらないと、保持している残りの呼び出し回数が更新されません。

さらに、ボタンの入力制御も追加していきます。

private void Update()
{
    if (PlayFabController.PlacementViewsRemaining == null
        || PlayFabController.PlacementViewsResetMinutes == null
        || PlayFabController.PlacementViewsRemaining > 0
        || PlayFabController.PlacementViewsResetMinutes <= 0)
    {
        buttonText.text = "Get Reward!!";
        rewardButton.interactable = Advertisement.IsReady(Constants.REWARD_PLACEMENT_ID);
    }
    else
    {
        buttonText.text = string.Format("Next : {0} minutes", PlayFabController.PlacementViewsResetMinutes.ToString());
        rewardButton.interactable = false;
    }
}

広告の回数制限がない場合は、残り回数やリセット時間は null となります。

回数制限がある場合で、残り回数が残っているか、残り時間が 0 になったタイミングでボタンを押せるようにしましょう。

今回のプログラムでは、自動でカウントダウンする仕組みにはなっていません。

以上でリワード広告の実装が完了しました。

最後に

PlayFab と UnityAds を統合する方法について解説しました。

公式ドキュメントを読むと、「初めて動画を視聴する人には、通常よりよい報酬を与えるとよい」と書いてあります。

余裕がある人は、そちらも試してみるとよいかもしれません。

また、この記事では UnityAds を使用しましたが、AdMob や他の広告サービスでも同様に実装ができるはずです。

考え方は同じはずなので、この記事を参考に他の広告サービスの実装もしてみてください。

PlayFab の書籍も好評発売中!
playfab-book

PlayFab のことをもっと皆さんに知ってもらいたくて、合計500ページ以上にもなる書籍を5冊に分けて執筆しました。

私の知識をすべて詰め込んでいるので、ゲーム開発をさらに加速させたい方はぜひご覧ください。

COMMENT

メールアドレスが公開されることはありません。