Unity 内购(InAppPurchasing)
艾克索拉 Mobile SDK 通过提供扩展模块,实现了与 Unity 内购的无缝集成。
您只需在代码中的任何位置配置并初始化它,然后即可开始处理购买。
配置与初始化
public class MyIAPManager
{
// ...
public MyIAPManager()
{
var settings = XsollaStoreClientSettings.Builder.Create()
.SetProjectId(77640)
.SetLoginId("026201e3-7e40-11ea-a85b-42010aa80004")
.SetSandbox(true)
.Build();
var configuration = XsollaStoreClientConfiguration.Builder.Create()
.SetSettings(settings)
.Build();
var module = XsollaPurchasingModule.Builder.Create()
.SetConfiguration(configuration)
.Build();
var builder = ConfigurationBuilder.Instance(module);
builder.AddProduct("100_gold_coins", ProductType.Consumable, new IDs
{
{ "100_gold_coins_google", "com.mycompany.mygame.100_gold_coins_google" }
});
UnityPurchasing.Initialize(this, builder);
}
// ...
}
提示
官方 Unity IAP 初始化指南请参考此处。
完整实现
我们的代码基于现有的官方 Unity IAP 示例代码 "01 Buying Consumables":
代码示例:
using UnityEngine;
using UnityEngine.Purchasing;
using UnityEngine.Purchasing.Extension;
using UnityEngine.UI;
using Xsolla.MobileSDK.Common;
using Xsolla.MobileSDK.Store;
using Xsolla.MobileSDK.UnityPurchasing;
namespace Samples.Purchasing.Core.BuyingConsumables
{
public class BuyingConsumables : MonoBehaviour, IDetailedStoreListener
{
IStoreController m_StoreController; // Unity 购买系统。
// 您的产品 ID。它们应与商店中产品的 ID 相匹配。
public string goldProductId = "com.mycompany.mygame.gold1";
public string diamondProductId = "com.mycompany.mygame.diamond1";
public Text GoldCountText;
public Text DiamondCountText;
int m_GoldCount;
int m_DiamondCount;
void Start()
{
InitializePurchasing();
UpdateUI();
}
void InitializePurchasing()
{
// 删除原始代码中的这一行。
//var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
// 添加以下代码。
var settings = XsollaStoreClientSettings.Builder.Create()
.SetProjectId(77640)
.SetLoginId("026201e3-7e40-11ea-a85b-42010aa80004")
.SetSandbox(true)
.Build();
var configuration = XsollaStoreClientConfiguration.Builder.Create()
.SetSettings(settings)
.Build();
var module = XsollaPurchasingModule.Builder.Create()
.SetConfiguration(configuration)
.Build();
var builder = ConfigurationBuilder.Instance(module);
// 添加可购买产品并指定其类型。
builder.AddProduct(goldProductId, ProductType.Consumable);
builder.AddProduct(diamondProductId, ProductType.Consumable);
UnityPurchasing.Initialize(this, builder);
}
public void BuyGold()
{
m_StoreController.InitiatePurchase(goldProductId);
}
public void BuyDiamond()
{
m_StoreController.InitiatePurchase(diamondProductId);
}
public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
{
Debug.Log("In-App Purchasing successfully initialized");
m_StoreController = controller;
}
public void OnInitializeFailed(InitializationFailureReason error)
{
OnInitializeFailed(error, null);
}
public void OnInitializeFailed(InitializationFailureReason error, string message)
{
var errorMessage = $"Purchasing failed to initialize. Reason: {error}.";
if (message != null)
{
errorMessage += $" More details: {message}";
}
Debug.Log(errorMessage);
}
public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
{
// 获取已购买的产品
var product = args.purchasedProduct;
// 将已购买的产品添加到玩家的物品库
if (product.definition.id == goldProductId)
{
AddGold();
}
else if (product.definition.id == diamondProductId)
{
AddDiamond();
}
Debug.Log($"Purchase Complete - Product: {product.definition.id}");
// 返回 Complete,通知 IAP 我方的处理已完成,交易可以关闭。
return PurchaseProcessingResult.Complete;
}
public void OnPurchaseFailed(Product product, PurchaseFailureReason failureReason)
{
Debug.Log($"Purchase failed - Product: '{product.definition.id}', PurchaseFailureReason: {failureReason}");
}
public void OnPurchaseFailed(Product product, PurchaseFailureDescription failureDescription)
{
Debug.Log($"Purchase failed - Product: '{product.definition.id}'," +
$" Purchase failure reason: {failureDescription.reason}," +
$" Purchase failure details: {failureDescription.message}");
}
void AddGold()
{
m_GoldCount++;
UpdateUI();
}
void AddDiamond()
{
m_DiamondCount++;
UpdateUI();
}
void UpdateUI()
{
GoldCountText.text = $"Your Gold: {m_GoldCount}";
DiamondCountText.text = $"Your Diamonds: {m_DiamondCount}";
}
}
}