Unityアプリに動画リワード広告を追加する

Audience Networkを利用すると、AndroidアプリとiOSアプリにFacebook広告を掲載して収益を生み出すことができます。リワード動画広告は、利用者が動画広告を視聴することの引き換えに、仮想通貨、アプリ内アイテム、限定コンテンツといった何らかの特典を得られる、フルスクリーンの広告サービスです。広告は短い動画によるもので、コールトゥアクションが備わったエンドカードが表示されます。動画の視聴が完了すると、利用者に提案したリワードを付与するためのコールバックが届きます。

続行する前に、必ずAudience NetworkのスタートガイドUnityのスタートガイドすべてに目を通しておいてください。

動画リワード広告のステップ

ステップ1: 動画リワード広告を初期化する

ステップ2: コールバックイベントを追加する

ステップ3: 広告を読み込む

ステップ4: 広告を表示する

ステップ1: 動画リワード広告を初期化する

動画リワード広告を表示するための最初のステップは、GameObjectに添付されているC#スクリプトでRewardedVideoAdオブジェクトを作成することです。

...
using AudienceNetwork;
...

public class RewardedVideoAdTest : MonoBehaviour
{
    public void LoadRewardedVideo()
    {
        // Create the rewarded video unit with a placement ID (generate your own on the Facebook app settings).
        // Use different ID for each ad placement in your app.
        this.rewardedVideoAd = new RewardedVideoAd("YOUR_PLACEMENT_ID");

        this.rewardedVideoAd.Register(this.gameObject);

        // Set delegates to get notified on changes or when the user interacts with the ad.
        this.rewardedVideoAd.RewardedVideoAdDidLoad = (delegate() {
            Debug.Log("RewardedVideo ad loaded.");
            this.isLoaded = true;
        });
        this.rewardedVideoAd.RewardedVideoAdDidFailWithError = (delegate(string error) {
            Debug.Log("RewardedVideo ad failed to load with error: " + error);
        });
        this.rewardedVideoAd.RewardedVideoAdWillLogImpression = (delegate() {
            Debug.Log("RewardedVideo ad logged impression.");
        });
        this.rewardedVideoAd.RewardedVideoAdDidClick = (delegate() {
            Debug.Log("RewardedVideo ad clicked.");
        });

        this.rewardedVideoAd.RewardedVideoAdDidClose = (delegate() {
            Debug.Log("Rewarded video ad did close.");
            if (this.rewardedVideoAd != null) {
                this.rewardedVideoAd.Dispose();
            }
        });

        // Initiate the request to load the ad.
        this.rewardedVideoAd.LoadAd();
    }
}

RewardedVideoAdのコンストラクターには次のパラメーターがあります:

  • placementId - この動画リワード広告ユニットのAudience Network配置ID。

ステップ2: コールバックイベントを追加する

次に、いくつかのコールバックを実装して、広告のライフサイクルイベントをフォローすることができます。次の例に示すように、イベントのデリゲートを登録して、これらのイベントをリッスンします。

...
// Set delegates to get notified on changes or when the user interacts with the ad.
this.rewardedVideoAd.RewardedVideoAdDidLoad = (delegate() {
    Debug.Log("RewardedVideo ad loaded.");
    this.isLoaded = true;
});
this.rewardedVideoAd.RewardedVideoAdDidFailWithError = (delegate(string error) {
    Debug.Log("RewardedVideo ad failed to load with error: " + error);
});
this.rewardedVideoAd.RewardedVideoAdWillLogImpression = (delegate() {
    Debug.Log("RewardedVideo ad logged impression.");
});
this.rewardedVideoAd.RewardedVideoAdDidClick = (delegate() {
    Debug.Log("RewardedVideo ad clicked.");
});

this.rewardedVideoAd.RewardedVideoAdDidClose = (delegate() {
    Debug.Log("Rewarded video ad did close.");
    if (this.rewardedVideoAd != null) {
        this.rewardedVideoAd.Dispose();
    }
});
...

Unity Androidで破棄された広告アクティビティのコールバック

これはAndroidにのみ関係します。

現在、Android用Unityゲームで、メインUnity ActivitylaunchModeとしてサポートされているのは、singleTaskのみです。AndroidマニフェストについてはUnityのドキュメントを、アクティビティについてはAndroidのドキュメントを参照してください。

FacebookはActivityを使用してInterstitial広告やRewarded Video広告を表示するため、ユーザーがバックグラウンドでアプリを実行した後、アプリスイッチャーではなくアイコンを使用してそのアプリを再起動すると、広告アクティビティが正しく終了せずに破棄される可能性があります。次のコールバックを使用して、広告がユーザーによって閉じられたかどうかを確認することができます。

インタースティシャルの場合:

this.interstitialAd.interstitialAdDidClose = (delegate() { Debug.Log("Interstitial ad did close."); this.didClose = true; if (this.interstitialAd != null) { this.interstitialAd.Dispose(); } }); #if UNITY_ANDROID /* * Only relevant to Android. * This callback will only be triggered if the Interstitial activity has * been destroyed without being properly closed.This can happen if an * app with launchMode:singleTask (such as a Unity game) goes to * background and is then relaunched by tapping the icon. */ this.interstitialAd.interstitialAdActivityDestroyed = (delegate() { if (!this.didClose) { Debug.Log("Interstitial activity destroyed without being closed first."); Debug.Log("Game should resume."); } }); #endif 

動画リワードの場合:

this.rewardedVideoAd.rewardedVideoAdDidClose = (delegate() { Debug.Log("Rewarded video ad did close."); this.didClose = true; if (this.rewardedVideoAd != null) { this.rewardedVideoAd.Dispose(); } }); #if UNITY_ANDROID /* * Only relevant to Android. * This callback will only be triggered if the Rewarded Video activity * has been destroyed without being properly closed.This can happen if * an app with launchMode:singleTask (such as a Unity game) goes to * background and is then relaunched by tapping the icon. */ this.rewardedVideoAd.rewardedVideoAdActivityDestroyed = (delegate() { if (!this.didClose) { Debug.Log("Rewarded video activity destroyed without being closed first."); Debug.Log("Game should resume. User should not get a reward."); } }); #endif 

ステップ3: 広告を読み込む

RewardedVideoAdがインスタンス化されたら、次のステップとして広告を読み込みます。これを行うには、loadAdメソッドを呼び出します。

前出の例では、広告の読み込みを開始する方法を示しています。

...
this.rewardedVideoAd.LoadAd();
...

ステップ4: 広告を表示する

最後に、広告が読み込まれた後、Showメソッドを呼び出して、動画リワード広告を画面にレンダリングできます。たとえば、ShowRewardedVideo用の関数を作成して、広告を表示するときにこの関数を呼び出すことができます:

public void ShowRewardedVideo()
{
    if (this.isLoaded) {
        this.rewardedVideoAd.Show();
        this.isLoaded = false;
    } else {
        Debug.Log("Ad not loaded. Click load to request an ad.");
    }
}

サーバー側でリワードを確認する

この機能はオプションです。動画リワード広告を利用する際、サーバー側でリワードを確認する必要はありません。これは、自分のサーバーに確認ステップを導入してセキュリティを強化するために、サーバー側でリワードを確認する場合にのみ必要です。この機能を有効にするには、パブリッシャーのエンドポイントをFacebookの担当者にお知らせください。

概要

利用者のリワードをサーバー側で管理する場合に備えて、Facebookでは、検証技術を使用してこれらの処理を安全に実行するためのソリューションを用意しています。Facebookのサーバーが指定のhttpsエンドポイントとやり取りして各広告インプレッションを確認し、リワードを提供するかどうかを確認します。

  1. Audience Network SDKでは、次のパラメーターを使用して動画リワード広告をリクエストします。
    • placementId: Audience Network配置ID
    • RewardData - RewardDataオブジェクトは、ユーザーIDを表すUserIdと、実際のゲーム内リワードを表すCurrencyで構成されます。
  2. 動画が完了すると、Facebookサーバーはこれらの値を、App Secretと固有の取引IDとともに、指定されたエンドポイントに転送します。
  3. サーバーはリクエストを受け取り次第確認し、次のように応答します。
    • 200 response: リクエストは有効であり、リワードを配信する必要があります。
    • Non 200 response: リクエストは有効ではなく、リワードを配信してはなりません。
  4. 動画の視聴が完了すると、エンドカードが表示され、次のいずれかのイベントが開始されます。
    • RewardedVideoAdDidSucceed - ステップ3で200応答を受け取った場合にのみトリガーされます。
    • RewardedVideoAdDidFail - ステップ3で200応答以外を受け取った場合にトリガーされます。

FacebookのサーバーからパブリッシャーのエンドポイントにアクセスするURLの例: https://www.your_end_point.com/?token=APP_SECRET&puid=USER_ID&pc=REWARD_ID&ptid=UNIQUE_TRANSACTION_ID

ワークフローは次のようになります。

実装

動画リワードオブジェクトを初期化した後、広告をロードする前に、ユーザーIDとリワードの内容をリワード広告データに渡す必要があります。この操作は、RewardDataクラスを使用して行えます。ユーザーIDとリワードの内容はどちらも文字列です。たとえば、次のようにします:

public class RewardedVideoAdTest : MonoBehaviour
{
  ...
  private bool isLoaded;
  private RewardedVideoAd rewardedVideoAd;

  public void LoadRewardedVideo()

    //Set the rewarded ad data
    RewardData rewardData = new RewardData();
    rewardData.UserId = "USER_ID";
    rewardData.Currency = "REWARD_ID";

    // Instantiate RewardedVideoAd with reward data
    this.rewardedVideoAd = new RewardedVideoAd("YOUR_PLACEMENT_ID", rewardData);
    this.rewardedVideoAd.Register(this.gameObject);

    // Set delegates to get notified on changes or when the user interacts with the ad.
    this.rewardedVideoAd.RewardedVideoAdDidLoad = (delegate() {
        Debug.Log("RewardedVideo ad loaded.");
        this.isLoaded = true;
    });
    this.rewardedVideoAd.RewardedVideoAdDidFailWithError = (delegate(string error) {
        Debug.Log("RewardedVideo ad failed to load with error: " + error);
    });
    this.rewardedVideoAd.RewardedVideoAdWillLogImpression = (delegate() {
        Debug.Log("RewardedVideo ad logged impression.");
    });
    this.rewardedVideoAd.RewardedVideoAdDidClick = (delegate() {
        Debug.Log("RewardedVideo ad clicked.");
    });
    this.rewardedVideoAd.RewardedVideoAdDidClose = (delegate() {
        Debug.Log("Rewarded video ad did close.");
        if (this.rewardedVideoAd != null) {
            this.rewardedVideoAd.Dispose();
        }
    });

    // For S2S validation you need to register the following two callback
    this.rewardedVideoAd.RewardedVideoAdDidSucceed = (delegate() {
        Debug.Log("Rewarded video ad validated by server");
    });
    this.rewardedVideoAd.RewardedVideoAdDidFail = (delegate() {
        Debug.Log("Rewarded video ad not validated, or no response from server");
    });       

    this.rewardedVideoAd.loadAd();
  }
  ...
}

リワードが確認されたかどうかをアプリに通知するには、RewardedVideoAdのその他のコールバックに加えて、RewardedVideoAdDidSucceedおよびRewardedVideoAdDidFailコールバックを実装する必要があります。

広告が読み込まれた後、通常のRewardedVideoAdと同様に、Showメソッドを呼び出して広告をレンダリングできます。

サーバー確認のコールバックは、利用者がエンドカードを閉じた後に発生する可能性があります。これらのコールバックのいずれかを受け取るまでは、動画リワードオブジェクトの割り当てを解除しないでください。

次のステップ

Unityアプリ内で別の広告フォーマットを統合する方法をご確認ください。

アプリを公開して収益を得る準備が整ったら、Audience NetworkのポリシーFacebookコミュニティ規定を順守していることを確認してから、アプリのレビューを申請します。