美文网首页
Cocos 3.x 微信广告接入

Cocos 3.x 微信广告接入

作者: 合肥黑 | 来源:发表于2021-11-03 16:59 被阅读0次

参考
《从0到1上线微信小游戏》第十一节 接入微信小游戏广告
《Cocos Creator游戏实战》微信小游戏激励视频接入步骤及音乐中断恢复

一、接广告要先开通流量主

登录 https://mp.weixin.qq.com 管理后台,点击“推广”-“流量主”板块

image.png
想要接入广告,你的小游戏必须有"量"。微信给出的条件是游戏累计注册用户达到1000,也就是说要有1000个人玩过你的游戏,这其实是有一定难度的。除了让朋友帮忙,或者在相关论坛上推广外,我们其实可以使用微信给我们的"量"。

登录小程序后台后,点击设置->游戏设置,再点击红框中的申请公测即可。之后微信就会给你一些量,好让你的游戏快速累积到1000个用户。以下是一些注意点:

  • 现在申请公测后是否给量好像是需要根据游戏质量来看。所以我建议大家刚开始可以自己推广,有点量之后再点击公测申请。
  • 请确保游戏正常运行后再申请公测,不要让别人玩全是bug的游戏,流失率很大。
  • 首次发布后90天内可以申请,尽量别浪费这次机会。
  • 如果发现微信没有给量,大家可以去微信开发社区https://developers.weixin.qq.com/community/minigame发帖问下管理员(有很多人都在问)。

开通流量主之后,就可以新建广告位了


image.png
二、banner广告

参考https://developers.weixin.qq.com/minigame/dev/guide/open-ability/ad/banner-ad.html

1.创建
image.png
image.png

拿到广告位ID就可以用代码创建banner广告了

let bannerAd = wx.createBannerAd({
  adUnitId: 'xxxx',
  style: {
    left: 10,
    top: 76,
    width: 320
  }
})

bannerAd.show()

在cocos中可以这样使用

onLoad () {
    this.bannerAd = null;
    this.initBannerAd();
},

initBannerAd () {
    if (typeof wx === 'undefined') {
        return;
    }
 
    let { screenWidth } = wx.getSystemInfoSync();
    let { screenHeight } = wx.getSystemInfoSync();
 
    this.bannerAd = wx.createBannerAd({
        adUnitId: '这里放你的广告ID',
        adIntervals: 30, // 自动刷新频率不能小于30秒
        style: {
            left: (screenWidth-300)/2,
            top: screenHeight-screenHeight/5,
            width: 300,
        }
    })
    
    this.bannerAd.onError(err => {
        console.log('广告显示失败')
        console.log(err)
    })
}

注意以下几点:

a. 微信要求不能让广告挡住小程序界面自带的按钮,否则会造成玩家误点。也就是说,像我这款竖屏的游戏,如果将广告放在顶上(也就是style中的top设置为0), 那么就一定会挡住小程序按钮:


image.png

由于style没有bottom属性,所以我们必须获取当前机型的宽高并进行计算,从而将广告放在底部位置。另外广告的宽度最小为300(就算是最小也会挡住)。

b. 一定要编写onError方法,如果没有编写,广告是不会显示的。你可以就简单的在里面打印一些日志,但该方法主要用来自适应UI。官方要求显示的广告不能阻碍玩家玩游戏,所以我们难免需要调整一些UI的位置好腾出空间来用于广告显示。而当广告显示失败时,我们最好将UI位置进行还原,好让界面看起来不那么别扭。

c.广告要显示全,不能放在屏幕外

2.显示隐藏

广告实例创建完毕后,我们只需要调用show和hide方法在想要的时刻显示或隐藏广告即可:

onLoad () {
    this.bannerAd = null;
    this.initBannerAd();
 
    // 这里可能做了些什么
    ....
 
    // 再显示广告
    if (this.bannerAd)
        this.bannerAd.show();
},
 
changeScene () {
    // 场景跳转
    if (this.bannerAd)
        this.bannerAd.hide();
    cc.director.loadScene('其他场景');
},
3.提前加载

参考Cocos Creator微信小游戏添加banner广告
在我们加载广告的时候,并不是直接onload出来的,是需要等待一段的加载时间。因此,如果直接创建的话,你将会等一段时间才能看到广告,特别是你需要在需要的地方才显示【.show()】,或者在不需要的时候【.hide()】,而销毁广告也是可以直接使用的,不过并不推荐在使用destroy方法的时候之前一段时间才onload广告,会造成广告还未生成但是还没destroy导致后面广告会一直出现在屏幕上方永远消不掉了。

创建广告this._bannerAd = wx.createBannerAd的时候,实际上我们最好是在创建一个common脚本然后在里面写一个bannerAd的参数并且赋值为null

export = {
    bannerAd : null,
    bannerAd2 : null,
    windowWidth : null,
    windowHeight : null,
}

接下来是加载广告,一般可以写在loading界面的onload()事件里,代码如下

var comm = require("./Common");

onload(){
  if (typeof (wx) !== "undefined") {
           // 手机屏幕信息
            let winSize = wx.getSystemInfoSync({
                success(res) {
                    comm.windowWidth = res.windowWidth;
                    comm.windowHeight = res.windowHeight;
                }
            });
            console.log(comm.windowWidth,comm.windowHeight);
            // 广告1和2
            if(comm.bannerAd == null) {
                // 广告
                comm.bannerAd = window.wx.createBannerAd({
                    adUnitId: '**********************************',
                    style: {
                        left: comm.windowWidth/2 - 150,
                        top: comm.windowHeight - 90,
                        width:  300,
                    }
                })
                comm.bannerAd.onResize(()=>{
                    comm.bannerAd.style.left = comm.windowWidth/2 - 150 + 0.1;
                    comm.bannerAd.style.top = comm.windowHeight - comm.bannerAd.style.realHeight + 0.1;
                });
                comm.bannerAd.onError(function(res){
                    console.log(res);
                })
            }
     }
}

这里有几点要说明,微信的广告是固定的大小比例,最小300的宽,宽度确定高度,所以不需要去管高度。第二点,微信的广告位置是以左上角为坐标系的,因此在计算位置的时候需要进行相对应的判断,如上代码我是让他显示在屏幕之下,+0.1则是为了考虑到苹果机型的底边条。

三、广告组件审核

当你开通流量主并接入广告组件代码后,每次上传版本审核都会触发广告组件审核:


image.png

注:此时版本审核包括代码审核和广告组件审核。如果广告组件审核失败不会影响代码审核和发布,微信只是会把你的广告给暂停显示了而已。代码审核失败的话只是不能发布新版本,之前发布的旧版本中的广告组件不会受影响,还是会正常显示。另外微信不会在审核广告组件过程中把你的广告给停了的,只有审核失败时才会。

如果广告组件审核失败,请大家去小程序后台的流量主页面查看失败原因(笔者截图的是审核通过时的样子):


image.png

如果你觉得官方审核结果不合理,可以通过"微信广告助手"将你的异议发送到后台,之后会有人工和你对接的

四、激励视频

https://developers.weixin.qq.com/minigame/dev/guide/open-ability/ad/rewarded-video-ad.html

激励视频广告组件是自动拉取广告并进行更新的。在组件创建后会拉取一次广告,用户点击 关闭广告 后会去拉取下一条广告。

cc.Class({
    extends: cc.Component,
 
    properties: {
        bgAudio: {
            default: null,
            type: cc.AudioClip
        },
 
        adResult: cc.Label
    },
 
    // LIFE-CYCLE CALLBACKS:
 
    onLoad () {
        this.videoAd = null;                // 激励视频广告
        this.initVideoAd();                 // 初始化
        this.playMusic();                   // 播放背景音乐
    },
 
    playMusic () {
        // 循环播放背景音乐
        cc.audioEngine.playMusic(this.bgAudio, true);
        cc.audioEngine.setMusicVolume(0.6);
    },
 
    initVideoAd() {
        if (typeof wx === 'undefined') {
            return;
        }
 
        // 创建激励视频广告实例,提前初始化
        this.videoAd = wx.createRewardedVideoAd({
            adUnitId: '这里放你自己的广告位ID'
        });
 
        this.videoAd .onError(err => {
            console.log('激励视频展示失败');
            console.log(err);
 
            this.adResult.string = '激励视频展示失败';
            this.adResult.node.parent.active = true;
        });
 
        this.videoAd.onClose(res => {
            // 用户点击了【关闭广告】按钮
            // 小于 2.1.0 的基础库版本,res 是一个 undefined
            if (res && res.isEnded || res === undefined) {
                // 正常播放结束,可以下发游戏奖励
                console.log('奖励已经发放');
                this.videoAd.offClose();
 
                this.adResult.string = '奖励已经发放';
                this.adResult.node.parent.active = true;
            }
            else {
                // 提前关闭广告,不发放奖励
                console.log('因播放中途退出,所以不下发游戏奖励');
                this.videoAd.offClose();
 
                this.adResult.string = '因播放中途退出,所以不下发游戏奖励';
                this.adResult.node.parent.active = true;
            }
 
            cc.audioEngine.pauseMusic();            // 先强制暂停
            cc.audioEngine.resumeMusic();           // 再恢复播放音乐
        });
    },
 
    showVideoAd() {
        if (!this.videoAd) {
            return;
        }
 
        // 用户触发广告后,显示激励视频广告
        this.videoAd.show().catch(() => {
            // 失败重试
            this.videoAd.load()
            .then(() => videoAd.show())
            .catch(err => {
                console.log(err);
                console.log('激励视频 广告显示失败');
 
                this.adResult.string = '激励视频 广告显示失败';
                this.adResult.node.parent.active = true;
            })
        });
    },
 
    closeBtn () {
        // 关掉广告结果提示板
        this.adResult.node.parent.active = false;
    }
});

激励视频广告组件默认是隐藏的,因此可以提前创建,以提前初始化组件。

请问小游戏平台createRewardedVideoAd后能不能立刻show?

相关文章

网友评论

      本文标题:Cocos 3.x 微信广告接入

      本文链接:https://www.haomeiwen.com/subject/agnyiltx.html