跳到主要内容

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"

publisher account 6

代码示例:

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}";
}
}
}