在Unity Service
窗口中开启Analytics
和In-App Purchasing
两个服务。
在开启In-App Purchasing
服务时,需要点界面上的Import
按钮,之后会自动导入几个UnityPackage
(但在2018.4.4版本中,点Import
按钮会报错,需要手动再导入Plugin
目录下导入进来的几个UnityPackage
)。
最后通过修改manifest.json
,在其中加入如下条目安装:
{
"com.github.fanhexin.easyiap": "https://github.com/fanhexin/EasyIap.git#upm"
}
只需创建InAppPurchasing
类实例,即可开始使用内购功能,流程见如下代码:
var iap = new InAppPurchasing();
// 需要在Init之前注册
iap.onPendingPurchase += id =>
{
// 未完成内购处理代码
};
iap.onPurchaseDeferred += product =>
{
// 处理ios下ask to buy
};
// 在使用其他方法前需要先初始化
// ProductDefine 存储id和ProductType,组成数组初始化多个内购商品
// 初始化成功 result 为 null,否则为具体错误原因
string result = await iap.InitAsync(new ProductDefine[n] {...});
// 购买成功 result 为 null,否则为具体错误原因
string result = await iap.BuyAsync("product id");
// 恢复内购成功 result 为 true 否则为 false
bool result = await iap.RestoreAsync();
// 通过id查询具体的product
Product product = iap.GetProduct("product id");
// 通过id获取订阅Manager类
SubscriptionManager subscriptionMgr = GetSubscription("product id");
// 根据id判断是否有收据,常用来查询去广告等NonComsumable类型内购是否已购买
bool b = iap.HasReceipt("product id");
// Init成功后该property返回true
bool iapReady = iap.isReady;
// products字段能取到所有InAppPurchasing内部的Product
foreach (var p in iap.products)
{
// do something
}
// 手动将Pending状态的product设置为complete状态
ConfirmPendingPurchase(product);
onPendingPurchase
事件在发生未完成的内购时(如点击购买并确认后应用崩溃或者玩家手动杀死应用),
重新启动应用并且InAppPurchasing
初始化完成后触发。
参数为未完成的内购id,需要根据id给玩家补充漏掉的内购内容。
BuyAsync
和RestoreAsync
两方法均可传入CancellationToken
从外部对操作进行取消,取消后对应的purchase
会处于
Pending
状态,再次启动应用会走onPendingPurchase
流程。