IAP Promo を利用するには、次の設定が必要です。
IAP Promo の利用には、これをサポートする Unity IAP SDK (1.17以上) が必要です。最新の IAP SDK を取得し Services Window (Window > Services) 内の In-App Purchasing を有効にします。あるいは、Asset store からインポートしてください。Services Window から有効にする場合は、プロンプトが表示されたら必ずアセットパッケージを Import してください。
詳細については IAP の設定 を参照してください。
IAP Promo の利用には、これをサポートする Unity Ads SDK (2.2以上) が必要です。Asset store からインポートして最新の Ads SDK を取得してください。これで Unity Ads は有効になります。
詳細については Unity Ads の設定 を参照してください。
これらの必要な Services が設定されると、ゲームに実装できます。
Promotions を正常に動作させるためには Unity Ads の初期化よりも前に IAP の初期化をしなければなりません。IAP の初期化にはコードレスとスクリプティングの2つの選択肢があります。
Codeless IAP は初期化をうまく処理してくれます。Codeless IAP を使うには Product Catalog を入力し、カタログを取得するために IAP Listener を作成します。
コードレスで Product Catalog を入力するには
エディター内で Window > UnityIAP > IAP Catalog を選択し、IAP Catalog ウィンドウを開きます。このウィンドウは以前の Products の設定がすべて記載されています。Product Catalog には少なくとも1つの Product が設定されている必要があります。Products を設定するための詳しい手順については Codeless IAP のドキュメントを参照してください。
IAP Catalog ウィンドウで App Store Export > Cloud JSON を選択し、Product Catalog のローカルコピーをエクスポートします。
次に、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;
}
}
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 の初期化メソッドをコードのどこかで呼び出さなければいけません。
ダッシュボードの IAP Promo セクション を操作して、IAP Promo のオファーを設定します。
以下のサンプコード例を使って IAP Promo のコンテンツを呼び出します。
public void ShowPromo()
{
Advertisement.Show (placementID);
}
エディターの Play を押して、Placement がリクエストした際にテスト広告が表示されることを確認します。実際にプロモーションのクリエイティブアセットを見るには、プロダクションモードで実機にゲームをビルドする必要があります。