Unity3D 转换微信小游戏指引系列(第五期 完结)
广告
在小程序后台页面找到推广->流量主
开通条件如下:
开通之后,需要接入广告组件。
调用创建广告组件的接口时,需要传入参数 adUnitId
,这个是开通流量主之后可以获得的。
注意:广告组件是一个单例,仅需创建一次,监听事件也仅需注册一次,否则会有多次回调。
可以创建一个 WXAdManager
,提供初始化、显示广告的接口,关闭广告时,判断广告是否完整播放,并调用奖励回调。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using WeChatWASM;public class WXAdManager : MonoBehaviour
{static WXAdManager instance;public static WXAdManager Instance{get { return instance; }}WXRewardedVideoAd ad; // 广告单例Action rewardCallback; // 奖励回调void Awake(){if (instance != null){Destroy(gameObject);}else{instance = this;}}public void Init(){ad = WX.CreateRewardedVideoAd(new WXCreateRewardedVideoAdParam(){adUnitId = "..." // 自己申请的广告单元 ID});ad.OnLoad((res) =>{Debug.Log($"广告加载 = {res.errMsg}");});ad.OnError((res) =>{Debug.Log($"广告错误 = {res.errMsg}");});ad.OnClose((res) =>{Debug.Log($"广告关闭 是否看完 = {res.isEnded}");OnPlayEnd(res.isEnded);});}/// <summary>/// 显示广告/// </summary>/// <param name="callback">看完广告后的回调</param>public void ShowAd(Action callback){Debug.Log("显示广告");ad.Show();rewardCallback = callback;}/// <summary>/// 广告看完回调/// </summary>/// <param name="isEnd">是否看完</param>void OnPlayEnd(bool isEnd){if (isEnd){Debug.Log("完整看完广告");rewardCallback?.Invoke();}else{Debug.Log("没有看完广告");}}
}
使用时,先进行初始化,要在微信 SDK 初始化之后调用。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using WeChatWASM;public class WXDemo : MonoBehaviour
{void Start(){WX.InitSDK((int code)=>{Debug.Log("微信 SDK 初始化");WXAdManager.Instance.Init();GameInit();});}void GameInit(){Debug.Log("游戏主逻辑初始化");}
}
在具体逻辑的位置,调用显示广告的接口,并传入奖励回调函数。
WXAdManager.Instance.ShowAd(()=>
{// 奖励回调Debug.Log("广告完整播放,发放奖励");
});
内购
在小程序后台页面找到功能->虚拟支付
开通条件如下:
开通之后,可以接入米大师安卓支付,iOS 系统暂时不支持。
可以创建一个 IAPManager
,提供购买的接口,支付成功时,根据产品 ID 发放奖励,也可以调用奖励回调。
这里需要判断运行平台
platform
是安卓,如何获取platform
参数,可以参考之前的文章《Unity3D 转换微信小游戏指引 03 微信SDK》里面的获取系统参数部分。
在调用支付接口时,参数 offerId
是开通虚拟支付后可以获得的。
需要特别注意的是,参数 buyQuantity
是有限制的,具体限制可以参考 buyQuantity 限制说明。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using WeChatWASM;public class IAPManager : MonoBehaviour
{static IAPManager instance;public static IAPManager Instance{get { return instance; }}public string platform; // 运行平台public int buyQuantityMul = 10; // 购买数量的倍数Action rewardCallback; // 奖励回调void Awake(){if (instance != null){Destroy(gameObject);}else{instance = this;}}/// <summary>/// 发起支付/// </summary>/// <param name="productID">产品 ID</param>/// <param name="callback">支付成功的回调函数</param>public void Purchase(string productID, Action callback){rewardCallback = callback;// 安卓平台if ("android".Equals(platform)){// 价格需要读表,此处只做演示double price = 1;// 规则:buyQuantity * 游戏币单价(0.1元) = 限定的价格等级// 例如:购买价格为 1 元,需要乘以 10,计算出 buyQuantity = 10// 此时 buyQuantity = 10 满足上述规则,即 10 * 0.1 = 1(限定的价格等级)double quantity = price * buyQuantityMul;// 米大师支付WX.RequestMidasPayment(new RequestMidasPaymentOption(){currencyType = "CNY", // 币种mode = "game", // 类型offerId = "...", // 在米大师侧申请的应用 idbuyQuantity = quantity, // 购买数量 mode=game 时必填env = 0, // 0: 米大师正式环境 1: 米大师沙箱环境success = (res) =>{PurchaseSuccessful(productID);},fail = (res) =>{Debug.Log($"购买失败 = {res.errMsg}");}});}else{Debug.Log("暂不支持内购");}}/// <summary>/// 购买成功/// </summary>/// <param name="productID">产品 ID</param>void PurchaseSuccessful(string productID){Debug.Log($"购买 {productID} 成功,发放奖励");rewardCallback?.Invoke();}
}
在具体逻辑的位置,调用发起支付的接口,并传入支付成功的回调函数。
IAPManager.Instance.Purchase("1001", ()=>
{// 奖励回调Debug.Log("支付成功,发放奖励");
});