Version: 2017.3
IAP Promo
IAP Promo Placements

IAP Promo のインテグレーション

Unity エディター内のプロジェクトの準備

Unity Services の設定

IAP Promo を利用するには、次の設定が必要です。

  1. プロジェクトの Unity Services の設定
  2. Unity IAP と Unity Ads の有効化

Unity IAP の設定

IAP Promo の利用には、これをサポートする Unity IAP SDK (1.17以上) が必要です。最新の IAP SDK を取得し Services Window (Window > Services) 内の In-App Purchasing を有効にします。あるいは、Asset store からインポートしてください。Services Window から有効にする場合は、プロンプトが表示されたら必ずアセットパッケージを Import してください。

エディターの Services Window から Unity IAP を有効化
エディターの Services Window から Unity IAP を有効化

詳細については IAP の設定 を参照してください。

Unity Ads の設定

IAP Promo の利用には、これをサポートする Unity Ads SDK (2.2以上) が必要です。Asset store からインポートして最新の Ads SDK を取得してください。これで Unity Ads は有効になります。

詳細については Unity Ads の設定 を参照してください。

実装

これらの必要な Services が設定されると、ゲームに実装できます。

IAP の実装

Promotions を正常に動作させるためには Unity Ads の初期化よりも前に IAP の初期化をしなければなりません。IAP の初期化にはコードレスとスクリプティングの2つの選択肢があります。

Codeless IAP を利用する

Codeless IAP は初期化をうまく処理してくれます。Codeless IAP を使うには Product Catalog を入力し、カタログを取得するために IAP Listener を作成します。

コードレスで Product Catalog を入力するには

  1. エディター内で Window > UnityIAP > IAP Catalog を選択し、IAP Catalog ウィンドウを開きます。このウィンドウは以前の Products の設定がすべて記載されています。Product Catalog には少なくとも1つの Product が設定されている必要があります。Products を設定するための詳しい手順については Codeless IAP のドキュメントを参照してください。

  2. IAP Catalog ウィンドウで App Store Export > Cloud JSON を選択し、Product Catalog のローカルコピーをエクスポートします。

IAP Product Catalog を JSON でエクスポート
IAP Product Catalog を JSON でエクスポート

次に、IAP Listener を作成します。Window > Unity IAP > Create IAP Listener を選択し、ゲームの最初のシーンにこれを追加します。このリスナーは Product Catalog をゲーム起動時に取得します。これによって Promotions がリクエストされる際のエラーは回避できますが、コードレスボタンがシーンに現れていないため、Product はまだ準備が完了していません。

スクリプトを利用する

もしスクリプトで Unity IAP を手動で初期化する 場合は、以下のコード例にある通り、常に Unity Ads の前に IAP を初期化するようにします。

using System.Collections;
using System.Collections.Generic;

using UnityEngine;
using UnityEngine.Advertisements;
using UnityEngine.Events;
using UnityEngine.Purchasing;
using UnityEngine.UI;

[RequireComponent(typeof(UnityAds))]
public class UnityIAP : MonoBehaviour, IStoreListener
{
    private IStoreController controller;
    private AdsManager ads;

    private const string product_coins = "100.gold.coins";
    private const string product_hat = "top_hat";
    private const string product_elite = "elite_status";
    private const string product_bundle = "gem_super_box";
    public int coin_count = 0;
    public int gems_count = 0;
    public bool hat_owned = false;
    public bool elite_member = false;


    private void Awake()
    {
        this.ads = GetComponent<AdsManager>();
        // AdsManager は Ads 初期化スクリプト
    }

    private void Start()
    {
        Debug.Log("UnityIAP.Init()");

//      var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
    
        StandardPurchasingModule module     = StandardPurchasingModule.Instance();
        ProductCatalog catalog              = ProductCatalog.LoadDefaultCatalog();
        ConfigurationBuilder builder        = ConfigurationBuilder.Instance(module);
        IAPConfigurationHelper.PopulateConfigurationBuilder(ref builder, catalog);

        UnityPurchasing.Initialize(this, builder);
    }

    public void OnInitialized (IStoreController controller, IExtensionProvider extensions)
    {
        Debug.Log("UnityIAP.OnInitialized(...)");
        this.controller = controller;

        this.ads.Init (); 
        //  Init() は Unity Ads を初期化するためのメソッド

        Button coinsButton = GameObject.Find ("buyCoins").GetComponent<Button> ();
        coinsButton.GetComponentInChildren<Text>().text = "Coins! Only " + controller.products.WithID(product_coins).metadata.localizedPrice.ToString();
    }

    public void OnInitializeFailed (InitializationFailureReason error)
    {
        Debug.Log("UnityIAP.OnInitializeFailed(" + error + ")");

        this.ads.Init ();
        //  IAP 初期化が失敗しても、Ads を初期化する場合があります
    }

    public void Buy(string productId) {
        Debug.Log("UnityIAP.BuyClicked(" + productId + ")");
        this.controller.InitiatePurchase(productId);
    }

    public void OnPurchaseFailed(Product item, PurchaseFailureReason r)
    {
        Debug.Log("UnityIAP.OnPurchaseFailed(" + item + ", " + r + ")");
    }

    public PurchaseProcessingResult ProcessPurchase (PurchaseEventArgs e)
    {
        string purchasedItem = e.purchasedProduct.definition.id;

        switch (purchasedItem) {
        case product_coins:
            Debug.Log ("IAPLog: Congratualtions you are richer!");
            coin_count += 100;
            Debug.Log ("IAPLog: Coin count: " + coin_count);
            break;

        case product_hat:
            hat_owned = true;
            Button topHatButton = GameObject.Find ("buyTopHat").GetComponent<Button> ();
            topHatButton.interactable = false;
            topHatButton.GetComponentInChildren<Text> ().text = "That hat is dashing!";
            Debug.Log ("IAPLog: Hat owned: " + hat_owned);
            break;

        case product_elite:
            elite_member = true;
            Button eliteButton = GameObject.Find ("buyElite").GetComponent<Button> ();
            eliteButton.interactable = false;
            eliteButton.GetComponentInChildren<Text> ().text = "Welcome to Elite Status";
            Debug.Log ("IAPLog: Elite member: " + elite_member);
            break;
        case product_bundle:
            gems_count += 5000;
            break;
        }

        return PurchaseProcessingResult.Complete;
    }
}

Unity Ads の実装

IAP の初期化スクリプトにあるコールバック OnInitialized() 内から Unity Ads を初期化することで、確実に適切な初期化シーケンスを実行できます。次のコード例は、Unity Ads の初期化メソッドを呼び出す方法を示しています。

using System.Collections;
using System.Collections.Generic;

using UnityEngine;
using UnityEngine.Advertisements;
using UnityEngine.Events;
using UnityEngine.Purchasing;
using UnityEngine.UI;

public class AdsManager : MonoBehaviour
{
    #if UNITY_IOS
        private string gameId = "0000000"; // 自分の iOS game ID 
    #elif UNITY_ANDROID
        private string gameId = "9999999"; // 自分の Android game ID
    #else
        private string gameId = "0123456"; //  エディターのエラーを避ける
    #endif

    public void Init()
    {
        Debug.Log("UnityAds.Init()");
        if (!Advertisement.isSupported || Advertisement.isInitialized)
        {
            Debug.Log("Could not initialize ads");
            return;
        }

        Debug.Log("Initializing Unity Ads with game ID: " + gameId);
        Advertisement.Initialize(gameId, false);
    }

    public void ShowAdUnit()
    {
        Debug.Log("Unity Ads Log: Ad shown");
        Advertisement.Show("testAdButton"); // 広告の Ad Placement ID 
    }

    public void ShowPromo()
    {
        Debug.Log("Unity Ads Log: Promo Shown");
        Advertisement.Show("testPromoButton"); // プロモーションの Ad Placement ID
    }
}

注意 :IAP の初期化のために Codeless IAP を利用する場合は、Unity Ads の初期化メソッドをコードのどこかで呼び出さなければいけません。

ダッシュボードで Promotions を設定

ダッシュボードの IAP Promo セクション を操作して、IAP Promo のオファーを設定します。

  • ゲーム内のどこで、どのように Promotions を表示させるかをコントロールするには Placements を使います。
  • Product Catalog をインポートして各 Product のクリエイティブアセットを管理するには Products のインターフェイスを使います。
  • プロモーションの実行時、その中に含まれる PlacementsProducts、ターゲットとするユーザーなど、 Promotions のパラメーターを定義します。

インテグレーションのテストをする

以下のサンプコード例を使って IAP Promo のコンテンツを呼び出します。

public void ShowPromo()
{
    Advertisement.Show (placementID);
}

エディターの Play を押して、Placement がリクエストした際にテスト広告が表示されることを確認します。実際にプロモーションのクリエイティブアセットを見るには、プロダクションモードで実機にゲームをビルドする必要があります。




IAP Promo
IAP Promo Placements