Unity3D 转换微信小游戏指引 05 广告内购

news2024/11/17 10:57:34

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 = "...",           // 在米大师侧申请的应用 id
                buyQuantity = 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("支付成功,发放奖励");
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1956042.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

等保测评练习卷20

等级保护初级测评师试题20 姓名&#xff1a; 成绩&#xff1a; 判断题&#xff08;10110分&#xff09; 1. 应根据资产的危害程度对资产进行标识管理&#xff0c;根据资产的价值选择相应的管理措施&#xff08;F&#xff09;不是危…

十七、操作符详解(2)

1.操作符 &#xff08;1&#xff09;按位取反~ C语言中&#xff0c;0的符号位是0。 例&#xff1a;int a 0; ~a -1 按二进制补码取反&#xff0c;符号位也要取反&#xff0c;打印的是原码。 把一个数的二进制位的第n位变成1&#xff1a;a a | (1<<n-1) 应用场合 把…

猫头虎分享:图文创作者发布文章之前需要预览哪些内容?

&#x1f4dd; 猫头虎分享&#xff1a;作为创作者发布文章之前&#xff0c;需要预览哪些内容&#xff1f; 摘要 在发布一篇文章之前&#xff0c;预览是一个至关重要的步骤。确保文章的结构完整性、内容的连贯性以及读者的阅读体验&#xff0c;都是我们需要关注的重点。本文将…

OSPF动态路由协议实验

首先地址划分 一个骨干网段分成三个&#xff0c;r1&#xff0c;r2&#xff0c;r5三个环回网段 &#xff0c;总共要四个网段 192.168.1.0/24 192.168.1.0/26---骨干网段 192.168.1.0/28 192.168.1.16/28 192.168.1.32/28 备用 192.168.1.64/28 192.168.1.64/26---r1环回 192.1…

2024 Java 高分面试宝典 一站式搞定技术面

前言 每年9月和10月&#xff0c;被业界称为“金九银十”&#xff0c;这是人才市场一年中最活跃的时期。此时&#xff0c;企业为了来年的业务扩展&#xff0c;纷纷加大招聘力度&#xff0c;空缺岗位众多&#xff0c;招聘需求集中。同时&#xff0c;初秋的招聘活动也避开酷暑&am…

物理数据库迁移到云上

物理数据库迁移到云上 物理数据库迁移到云上通常需要以下步骤: 评估和规划 评估物理数据库的需求和约束条件&#xff0c;确定迁移的目标。考虑数据库大小、性能要求、数据复杂性等因素&#xff0c;选择合适的云服务提供商和服务模式。 设置云环境 在云平台上创建适当的虚拟…

特朗普比特币演讲:“梭哈”比特币,“抵制”数字美元!懂王新晋喊单王:比特币冲上月球,永远不要出售比特币!

2024年7月28日&#xff0c;在比特币大会(Bitcoin 2024)上&#xff0c;前总统特朗普发表了一场激情澎湃的演讲&#xff0c;放出了一系列令人振奋的政策诺言&#xff0c;引发了全场加密货币支持者的热烈掌声。特朗普表示&#xff0c;如果再次当选总统&#xff0c;他将采取一系列强…

前端框架 element-plus 发布 2.7.8

更新日志 功能 组件 [级联选择器 (cascader)] 添加持久化属性以提升性能 (#17526 by 0song)[日期选择器 (date-picker)] 类型添加月份参数 (#17342 by Panzer-Jack)[级联选择器 (cascader)] 添加标签效果属性 (#17443 by ntnyq)[加载 (loading)] 补充加载属性 (#17174 by zhixi…

Python数值计算(3)

这次说一说构造均分向量的操作。 1. 造轮子 在数值计算中 &#xff0c;我们通常要在区间[a,b]之间产生指定步长或者给定采样点的一组等差数列&#xff08;或者说是一个向量&#xff09;&#xff0c;例如MATLAB中的linspace函数&#xff0c;linspace(a,b,n)在区间[a,b]之间产生…

【神经网络】正则化缓解过拟合-Dropout

文章目录 1、简介2、Dropout 层的原理和使用3、小结 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&#xff0c;初步涉猎人工智能和前端开发。 &#…

C#中的wpf基础

在WPF中&#xff0c;Grid 是一种非常强大的布局控件&#xff0c;用于创建网格布局。它允许你将界面划分为行和列&#xff0c;并将控件放置在这些行和列中。 以下是一些关键点和示例&#xff0c;帮助你理解 WPF 中的 Grid&#xff1a; 基本属性 RowDefinitions&#xff1a;定义…

AI 抠图工具 | 鲜艺AI抠图 v2.1 绿色版

&#x1f389;&#x1f389; 各位小伙伴们&#xff0c;你们是不是还在为抠图烦恼&#xff1f;别担心&#xff0c;鲜艺AI抠图神器来拯救你啦&#xff01;基于RMBG-1.4黑科技开发&#xff0c;免费使用&#xff0c;本地操作&#xff0c;告别繁琐登录和联网困扰&#xff01;&#x…

【数据结构进阶】AVL树

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; C || 数据结构 目录 &#x1f308;前言&#x1f525;AVL树的概念&#x1f525;AVL树的自实现AVL树结点的定义AVL树需实现的函数接口AVL树的插入AVL树的旋转右单旋左单旋左右双旋右左双旋…

【Docker虚拟机】在极空间上快速部署智能家居自动化平台『Home Assistant 』

【Docker&虚拟机】在极空间上快速部署智能家居自动化平台『Home Assistant 』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 前段时间被粉丝问到怎么在极空间上部署Home Assistant&#xff0c;之前只是使用命令在威联通上部署过&#xff0c;所以最近正好有时间&#xff0c;在…

Ethernet

目录 1. Physical Layer(PHY)2. MAC2.1. MAC帧格式2.2. MAC地址与IP地址3. RGMII接口FPGA实现以太网(一)——以太网简介 以太网(Ethernet)是指遵守 IEEE 802.3 标准组成的局域网通信标准, IEEE 802.3 标准规定的主要是OSI参考模型中的物理层(PHY)和数据链路层中的介质访问控…

搭建DNS正向解析,反向解析+搭建DNS主从架构+搭建DNS多区域+时间同步

主要在局域网中配置&#xff0c;不存在外网 正向解析&#xff1a;域名解析为IP named.conf 解决权限 named.rfc1912.zones 解决解析方式 环境准备&#xff1a;三台机器都做下面的操作 基础配置&#xff1a;网络配置&#xff0c;关闭安全架构&#xff0c;关闭防火墙&#x…

Linux进程控制——进程等待

文章目录 进程等待进程等待的必要性进程等待的方法status参数option参数 进程等待 进程等待的过程其实是父进程等待子进程死亡的过程 进程等待的必要性 如果子进程退出&#xff0c;父进程不进行处理&#xff0c;子进程会变成僵尸进程&#xff0c;有内存泄漏的风险 僵尸进程…

docker容器cuda不可用,怎么解决?

通过Docker 构建的镜像中,启动之后,发现容器内部读取不到显卡驱动nvidia-smi 1、设置 NVIDIA Docker 存储库 distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add

超逼真AI生成电影来了!《泰坦尼克号》AI重生!浙大阿里发布MovieDreamer,纯AI生成电影引爆热议!

视频生成领域的最新进展主要利用了短时内容的扩散模型。然而&#xff0c;这些方法往往无法对复杂的叙事进行建模&#xff0c;也无法在较长时间内保持角色的一致性&#xff0c;而这对于电影等长篇视频制作至关重要。 对此&#xff0c;浙大&阿里发布了一种新颖的分层框架Mov…

Kafka知识总结(选举机制+控制器+幂等性)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 选举机制 控制器&#xff08;Broker&#xff09;选举 控制器就是…