bilibili 哔哩哔哩小游戏SDK接入

小游戏的文档 简介 · bilibili小游戏bilibili小游戏具有便捷、轻量、免安装的特点。游戏包由云端托管,在哔哩哔哩APP内投放和运行,体验流畅,安全可靠。icon-default.png?t=O83Ahttps://miniapp.bilibili.com/small-game-doc/guide/intro/

没想过接入这个sdk比ios还难,ios不让用插屏广告与原生广告,被打回来了一次,去掉就行,还有截图必须是当前游戏的,不要糊弄。

哔哩哔哩官方目前的api还是有点乱的,官方自己都还在整合中。

必接项目如下:

1.检查并添加游戏启动埋点,否则可能无法通过审核。

上报小游戏启动成功埋点。 需要在游戏首页成功渲染时调用。不是每个版本都需要调用这个接口

laya 从 v2.6 - v2.13 版本,可以通过 layaIDE 支持直接导出 bilibili 小游戏,无需其他修改。

其他的引擎不同版本还是根据官方API修改。

2.小游戏配置 game.json 分包也在这里,后面还有那个实名认证。

{
    "version": "1.0.0",
    "appId": "biligameccxxxxxxxxxxxxxxa4",
    "deviceOrientation": "portrait",
    "networkTimeout": {
        "request": 5000,
        "connectSocket": 5000,
        "uploadFile": 5000,
        "downloadFile": 5000
    },
    "subpackages": [
        {
            "name": "Scene",
            "root": "res/Scene/"
        }
    ]
}

3.音频必须做适配 切换前后台 音频的中断与恢复,被打回过

//背景音乐脚本
export default class GameSoundManager {
    //播放
    static playMusic(musicName) {
        if (window.bl) {
            if (!GameSoundManager.bgm) { 
                GameSoundManager.bgm = bl.createInnerAudioContext();
            }
            // GameSoundManager.bgm.stop();
            GameSoundManager.bgm.src = "Sound/" + musicName + ".mp3";
            GameSoundManager.bgm.autoplay = true;
            GameSoundManager.bgm.loop = true;
            GameSoundManager.bgm.play();
        } else { 
            Laya.SoundManager.playMusic("Sound/" + musicName + ".mp3", 0);
        }
    }
    //暂停
    static pauseMusic() { 
        if (window.bl) {
            if (!GameSoundManager.bgm) { 
                GameSoundManager.bgm = bl.createInnerAudioContext();
            }
            GameSoundManager.bgm.pause();
        }
    }
}

 音效没必要的,主要针对背景音乐。在合适的地方调用,cocos的话,放在常驻节点上。

if (window.bl) {
    bl.onShow(res => {
        GameSoundManager.playMusic("BGM");
    });
    bl.onHide(res => {
        GameSoundManager.pauseMusic();
    });
}

4.侧边栏 必接

侧边栏礼包必须每天都可领取,同游戏内签到礼包。

 先看看官方的API,侧边栏、桌面快捷方式等都会用到场景值。

小游戏开发者可以在 bl.getLaunchOptionsSync 和 bl.onShow 中获取上述场景值

场景值

类型

含义

10001

string

我的(首页Tab)-小游戏中心

10002

string

手机设备桌面快捷入口

10003

string

各分享渠道

021036

string

从侧边栏进入小游戏

侧边栏的步骤:

步骤

解释

步骤一:

启动监听,判断是否展示奖励入口

1. 游戏启动时通过bl.onShow监听启动信息;​

【请确保在游戏启动时机(game.js运行时机)同步监听bl.onShow,若时机太晚收不到回调,会导致用户按操作从侧边栏返回游戏后,无法领取到奖励,造成用户客诉!

2. 通过bl.checkScene判断当前宿主是否支持跳转侧边栏:​

  • 返回字段isExist=true时,展示奖励入口,进入步骤二​
  • 返回字段isExist=false时,不展示奖励入口​

步骤二:

奖励展示

1. 用户点击奖励入口时,通过获取bl.onShow最新启动状态,判断当前用户是否从侧边栏启动:​

  • 侧边栏启动:奖励按钮显示「领取奖励」​
  • 非侧边栏启动:奖励按钮显示未完成,进入第2步​

【判断是否从侧边栏启动时,应使用bl.onShow的最新返回值,否则用户从侧边栏热启动小游戏时,会由于返回值未更新而无法领取到奖励,造成用户客诉!

2. 自动跳转侧边栏:可增加一个跳转按钮,按钮点击回调事件设置为:关闭当前奖励界面并调用bl.navigateToScene(能力已全量开放,无需配置白名单)。用户点击按钮时会自动跳转到侧边栏。​

平台强烈建议接入「自动跳转侧边栏」能力,可大幅度降低用户跳出小游戏后的流失率。】​

步骤三:

测试,上线

开发者需在测试环境下完整跑通从侧边栏启动后领取奖励的链路,测试通过确认无误后发布上线。

第一步:监听是否可以显示桌面侧边栏按钮,这个与抖音api差不多
bl.onShow(res => {
    //兼容 与基础版本做对比 CompareVersion()这个方法就不写了,以前文章应该有的
    if (SdkUtil.CompareVersion(bl.getSystemInfoSync().SDKVersion, '3.99.5') >= 0) {
        console.log("检测版本号");
        bl.checkScene({
            scene: "sidebar",
            success: (res) => {
                if (res.isExist) {
                    //显示入口有奖按钮
                    this.goldButton.visible = true;
                } else {
                    //隐藏入口有奖按钮
                    this.goldButton.visible = false;
                }
            },
            fail: (res) => {
                //隐藏入口有奖按钮
                this.goldButton.visible = false;
            }
        });
    } else {
        //隐藏入口有奖按钮
        this.goldButton.visible = false;
    }
});
第二步:监听场景值是否从侧边栏进入。getUserData这个是我的读取本地存储的方法。
bl.onShow(res => {
    const scene = res.scene;
    if (scene == '021036' || bl.getLaunchOptionsSync().scene === "021036") {
        // 记住,合适的地方移除这个本地存储.
        // Laya.LocalStorage.removeItem("sidebar");
        // 从侧边栏进入,显示侧边栏奖励界面的领奖按钮
        Laya.LocalStorage.setItem("sidebar", "sidebar");
        if (this.enterPanel.visible) {
            //侧边栏奖励领取时间,在这里初始化一下,方便在其他地方调用到
            this.offlineSliderTime = PlayerData.getUserData("rewardSliderDate");
            this.offlineSliderTime = Date.now() - this.offlineSliderTime;
            this.offlineSliderTime = this.offlineSliderTime / 1000;
            const sidebar = Laya.LocalStorage.getItem("sidebar");
            if (sidebar) {
                this.getBtn.visible = true;//领奖按钮
                this.enterBtn.visible = false;//侧边栏跳转按钮
            } else {
                this.getBtn.visible = false;//领奖按钮
                this.enterBtn.visible = true;//侧边栏跳转按钮
            }
        }
    }
});
//当打开侧边栏界面的时候,打开侧边栏按钮事件。
openSiderBarPanel(){
    this.enterPanel.visible = true;
    //侧边栏奖励领取时间,在这里初始化一下,方便在其他地方调用到
    this.offlineSliderTime = PlayerData.getUserData("rewardSliderDate");
    this.offlineSliderTime = Date.now() - this.offlineSliderTime;
    this.offlineSliderTime = this.offlineSliderTime / 1000;
    const sidebar = Laya.LocalStorage.getItem("sidebar");
    if (sidebar) {
        this.getBtn.visible = true;//领奖按钮
        this.enterBtn.visible = false;//侧边栏跳转按钮
    } else {
        this.getBtn.visible = false;//领奖按钮
        this.enterBtn.visible = true;//侧边栏跳转按钮
    }
}
第二步:跳转侧边栏,按钮事件
navigateToScene() {
   if (window.bl) {
       bl.navigateToScene({
           scene: "sidebar",
           success: (res) => { },
           fail: (res) => { },
       });
   }
}
第三步:领取奖励,按钮事件
getReward(){
    if (this.offlineSliderTime < 60 * 60 * 24) {
        SdkUtil.ShowToast("今日奖励已经领取");
        return;
    }
    //保存领取奖励时间
    var offlineSliderTime = this.getDayZeroTime();
    PlayerData.setUserData("rewardSliderDate", offlineSliderTime);
    //保存用户领取的奖励
    PlayerData.setUserData("gold", PlayerData.getUserData("gold") + 2000);
    PlayerData.saveData();
    //弹窗提示
    SdkUtil.ShowToast("获取金币 +200");
    this.enterPanel.visible = false;
    //刷新你的奖励
    this.refreshXXX();//刷新界面
}
//13位时间戳,用于对比领奖时间
getDayZeroTime() {
    var nowDay = new Date();
    nowDay.setHours(0);
    nowDay.setMinutes(0);
    nowDay.setSeconds(0);
    nowDay.setMilliseconds(0);
    var nowDayTime = nowDay.getTime();
    return nowDayTime;
}

 至于实名认证与桌面快捷方式的每日领奖,可以按着上面来写。

5.分包 哔哩哔哩工具上传的是zip的压缩包

整个小游戏所有分包大小不超过 20M

单个分包/主包大小不能超过 4M

也就是不压缩的实际包体吗,一般情况下,不用考虑远程问题。

6.实名认证 必接 只支持安卓

根据规定,所有游戏用户必须完成实名认证才能继续访问和参与游戏。

属性

类型

默认值

必填

说明

title

string

提示的标题

content

string

提示的内容

giftImgUrl

string

提示的礼包图片(支持gif)

cancelText

string

'取消'

取消按钮的文字,最多 5 个字符

confirmText

string

'确定'

确认按钮的文字,最多 5 个字符

giftImgUrl我使用的站内图片地址,后台会配置好的,官方也给了远程的API,本地的不知道能用不,没尝试。

7.激励视频埋点上报,官方没说是否必须,放置万一吧。

// 用户点击观看视频广告时上报

bl.reportScene({sceneId:1007});

rewardedVideoAd.load().then(() => {

  return rewardedVideoAd.show();

});

8.添加到桌面礼包「必接」。      侧边栏打开礼包「必接」上方写过了

按钮事件调用,主要是针对ios的,被打回过。

if (window.bl) {
    if (SdkUtil.CompareVersion(bl.getSystemInfoSync().SDKVersion, '3.99.4') >= 0) {
        //bl.checkShortcut接口只支持android平台
        if (bl.getSystemInfoSync().platform.toLowerCase().indexOf("android") != -1) {
            //检测桌面快捷方式是否存在
            bl.checkShortcut({
                success(res) {
                    console.log("检查快捷方式"), console.log(res.status);
                    if (res.status.exist) {
                        //弹窗桌面礼包奖励界面
                        UIManager.ShowUIPanel("Desk", false);
                    } else {
                        bl.addShortcut({
                            success() {
                                console.log("添加桌面成功");
                            }, fail(err) {
                                SdkUtil.ShowToast("从桌面ICON进入领取每日奖励");
                                console.log("添加桌面失败", err.errMsg);
                            },
                        });
                    }
                },
                fail(res) {
                    SdkUtil.ShowToast("从桌面ICON进入领取每日奖励");
                    console.log("检查快捷方式失败", res.errMsg);
                },
            });
        } else {
            //从手机设备桌面快捷入口启动的场景值
            if (bl.getLaunchOptionsSync().scene === "10002" || this.open_desk === true) {
                //弹出桌面礼包奖励页面
                UIManager.ShowUIPanel("Desk", false);
            } else {
                bl.addShortcut({
                    success() {
                        SdkUtil.ShowToast("从桌面ICON进入领取每日奖励");
                        console.log("添加桌面成功");
                    }, fail(err) {
                        SdkUtil.ShowToast("从桌面ICON进入领取每日奖励");
                        console.log("添加桌面失败", err.errMsg);
                    },
                });
            }
        }
    } else {
        SdkUtil.ShowToast("请升级最新版本");
    }
}
//场景值吗,在两个地方可以拿到,最好还是判断一下
bl.onShow(res => {
    if (scene == '10002') {
        this.open_desk = true;
    }
});

9.埋点上报【主要防止万一】

bl.reportScene({});

sceneId

说明

7

游戏可玩,比如进入游戏大厅

10

游戏新手教程完成

1007

激励视频广告,用户点击看广告

 10.首屏渲染 index.js中,这个只正对哔哩哔哩小游戏,其它小游戏不要用【API中看到的】

var testRender = function () {
    var GameConfig = {};
    GameConfig.width = 640;
    GameConfig.height = 1136;
    GameConfig.scaleMode = "fixedwidth";
    GameConfig.screenMode = "none";
    GameConfig.alignV = "top";
    GameConfig.alignH = "left";

    Laya3D.init(GameConfig.width, GameConfig.height);
    Laya["Physics"] && Laya["Physics"].enable();
    Laya["DebugPanel"] && Laya["DebugPanel"].enable();
    Laya.stage.scaleMode = GameConfig.scaleMode;
    Laya.stage.screenMode = GameConfig.screenMode;
    Laya.stage.alignV = GameConfig.alignV;
    Laya.stage.alignH = GameConfig.alignH;

    var logoSprite = new Laya.Sprite();
    Laya.stage.addChild(logoSprite);
    logoSprite.y = 300;
    var handler = Laya.Handler.create(null, function () {
        logoSprite.removeSelf();
    });
    logoSprite.loadImage("First/logo.png", handler);

    var tTestText = new Laya.Text();
    tTestText.autoSize = true;
    tTestText.text = "正在努力加载中 ...";
    tTestText.bold = true;
    tTestText.font = "Microsoft YaHei";
    tTestText.color = "#FFFFFF";
    tTestText.fontSize = 20;
    tTestText.x = 300;
    tTestText.y = 700;
    Laya.stage.addChild(tTestText);
    //合理时间移除
    setTimeout(() => {
        tTestText.removeSelf();
    }, 2000);
};

testRender();

11.分享功能

自定义图片路径,支持 PNG 及 JPG。建议图片分辨率 750*750
1、小游戏包内相对路径
2、blfile:// 协议路径
3、https:// 网络图片路径(暂不支持非 bilibili 图片服务器资源地址)
//SDK初始化时候调用
bundleShareActive() {
    if (window.bl) {
        bl.onShareAppMessage(() => {
            return {
                title: '啊啊啊啊',
                subTitle: '啊啊啊啊啊',
                imageUrl: 'XXXX'
            };
        });
    }
}
//分享按钮点击时候调用
bl.shareAppMessage({
    title: '啊啊啊啊',
    subTitle: '啊啊啊啊啊',
    imageUrl: 'xxxxxxxxxxxxx',
    biliContent: '一款超好玩得小游戏,快来和我一起玩吧!',
    success() {
        console.log('分享视频成功');
        if (callback != null) {
            callback(1);
            callback = null;
        }
    },
    fail(e) {
        console.log('分享视频失败' + JSON.stringify(e));
        if (callback != null) {
            callback(0);
            callback = null;
        }
    }
}

12.录制视频,暂时不需要接入,存在问题,也非必须。被打回过。

不用接入,视频分享存在问题,以后可能会必须接入,像抖音一样。

13.如果存在输入 需要敏感词检测

bl.sensitiveWordCheck(Object object)

14.震动

bl.vibrateShort({})

15.版权是必要的

16.隐私协议等,非必须。

其他一些api

bl.showLoading({
  title: '加载中',
})
setTimeout(function () {
  bl.hideLoading()
}, 2000)

bl.showModal({
  title: '提示',
  content: '这是一个模态弹窗',
  success(res) {
    if (res.confirm) {
      console.log('用户点击确定')
    } else if (res.cancel) {
      console.log('用户点击取消')
    }
  }
})

bl.exitMiniProgram({})
bl.getSystemInfoSync() 异步

bl.getAppBaseInfo
0	哔哩哔哩	 
1	高能通	 
2	哔哩哔哩漫画	

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年中国新能源汽车用车发展怎么样 PaperGPT(二)

用车趋势深入分析 接上文&#xff0c;2024年中国新能源汽车用车发展怎么样 PaperGPT&#xff08;一&#xff09;-CSDN博客本文将继续深入探讨新能源汽车的用车强度、充电行为以及充电设施的现状。 用车强度 月均行驶里程&#xff1a;2024年纯电车辆月均行驶超过1500公里&…

自从学会Git,感觉打开了一扇新大门

“同事让我用 Git 提交代码&#xff0c;我居然直接把项目文件压缩发过去了……”相信很多初学者都经历过类似的窘境。而当你真正掌握 Git 时&#xff0c;才会发现它就像一本魔法书&#xff0c;轻松解决代码管理的种种难题。 为什么 Git 能成为程序员的标配工具&#xff1f;它究…

简易屏幕共享工具-基于WebSocket

前面写了两个简单的屏幕共享工具&#xff0c;不过那只是为了验证通过截屏的方式是否可行&#xff0c;因为通常手动截屏的频率很低&#xff0c;而对于视频来说它的帧率要求就很高了&#xff0c;至少要一秒30帧率左右。所以&#xff0c;经过实际的截屏工具验证&#xff0c;我了解…

yakit-靶场-高级前端加解密与验签实战(for嵌套纯享版)

高级前端加解密与验签实战 一、前端验证签名&#xff08;验签&#xff09;表单&#xff1a;HMAC-SHA256 使用hmac-sha256的十六进制key值可以加密 与页面加密后的值相同 热加载&#xff1a; encryptData func(p) { //sha256key值key codec.DecodeHex("313233343132333…

嵌入式入门Day35

网络编程 Day2 套接字socket基于TCP通信的流程服务器端客户端TCP通信API 基于UDP通信的流程服务器端客户端 作业 套接字socket socket套接字本质是一个特殊的文件&#xff0c;在原始的Linux中&#xff0c;它和管道&#xff0c;消息队列&#xff0c;共享内存&#xff0c;信号等…

模仿微信小程序wx.showModal自定义弹窗,内容可以修改

实现以下弹框样式功能 1.在components新建一个文件showModel.wpy作为组件&#xff0c;复制下面代码 <style lang"less" scoped> .bg_model {display: flex;justify-content: center;align-items: center;// 弹框背景.bg_hui {width: 100%;height: 100%;posi…

如何在 Ubuntu 22.04 上安装并开始使用 RabbitMQ

简介 消息代理是中间应用程序&#xff0c;在不同服务之间提供可靠和稳定的通信方面发挥着关键作用。它们可以将传入的请求存储在队列中&#xff0c;并逐个提供给接收服务。通过以这种方式解耦服务&#xff0c;你可以使其更具可扩展性和性能。 RabbitMQ 是一种流行的开源消息代…

分布式系统架构6:链路追踪

这是小卷对分布式系统架构学习的第6篇文章&#xff0c;关于链路追踪&#xff0c;之前写过traceId的相关内容&#xff1a;https://juejin.cn/post/7135611432808218661&#xff0c;不过之前写的太浅了&#xff0c;且不成系统&#xff0c;只是简单的理解&#xff0c;今天来捋一下…

python opencv的orb特征检测(Oriented FAST and Rotated BRIEF)

官方文档&#xff1a;https://docs.opencv.org/4.10.0/d1/d89/tutorial_py_orb.html SIFT/SURF/ORB对比 https://www.bilibili.com/video/BV1Yw411S7hH?spm_id_from333.788.player.switch&vd_source26bb43d70f463acac2b0cce092be2eaa&p80 ORB代码 import numpy a…

蓝桥杯JAVA刷题--001

文章目录 题目需求2.代码3.总结 题目需求 2.代码 class Solution {public String convertDateToBinary(String date) {if (date null || date.length() ! 10 || date.charAt(4) ! - || date.charAt(7) ! -) {throw new IllegalArgumentException("输入的日期格式不正确&…

WebRTC的线程事件处理

1. 不同平台下处理事件的API&#xff1a; Linux系统下&#xff0c;处理事件的API是epoll或者select&#xff1b;Windows系统下&#xff0c;处理事件的API是WSAEventSelect&#xff0c;完全端口&#xff1b;Mac系统下&#xff0c;kqueue 2. WebRTC下的事件处理类&#xff1a; …

zentao ubuntu上安装

#下载ZenTaoPMS-21.2-zbox_amd64.tar.gz&#xff08;https://www.zentao.net/downloads.html&#xff09; https://dl.zentao.net/zentao/21.2/ZenTaoPMS-21.2-zbox_amd64.tar.gzcd /opt tar -zxvf ZenTaoPMS-21.2-zbox_amd64.tar.gz#启动 /opt/zbox/zbox start /opt/zbox/zbox…

LeetCode算法题——有序数组的平方

题目描述 给你一个按非递减顺序排序的整数数组nums&#xff0c;返回每个数字的平方组成的新数组&#xff0c;要求也按非递减顺序排序。 题解 解法一&#xff1a;暴力解法 思路&#xff1a; 该题目可通过暴力解法解决&#xff0c;即利用for循环遍历数组&#xff0c;对数组每…

vue v-for 数据增加页面不刷新

<div style"float:left;border:1px solid red;height:100px;width:600px;"><el-form-item label"多语言配置" style"width:700px;" prop"validTanleHead"><el-input style"width: 180px" placeholder"请…

前端-动画库Lottie 3分钟学会使用

目录 1. Lottie地址 2. 使用html实操 3. 也可以选择其他的语言 1. Lottie地址 LottieFiles: Download Free lightweight animations for website & apps.Effortlessly bring the smallest, free, ready-to-use motion graphics for the web, app, social, and designs.…

汇编环境搭建

学习视频 将MASM所在目录 指定为C盘

Flutter:打包apk,详细图文介绍(一)

困扰了一天&#xff0c;终于能正常打包apk安装了&#xff0c;记录下打包的流程。建议参考我这篇文章时&#xff0c;同时看下官网的构建说明。 官网构建并发布 Android 应用详情 1、AS创建Flutter项目 2、cmd执行命令 生成一个sunluyi.jks的文件&#xff0c;可以自行把sunluyi替…

单个变量a的妙用

一道清华大学复试上机题 问题&#xff1a;为什么只需要定义一个整数变量a&#xff0c;而不是定义一个数组a[]&#xff1f; 回答 在这段代码中&#xff0c;只需要定义一个整数变量 a&#xff0c;而不是一个数组 a[]&#xff0c;是因为程序的逻辑是逐个处理输入的整数并立即输出…

【YOLOv8模型网络结构图理解】

YOLOv8模型网络结构图理解 1 YOLOv8的yaml配置文件2 YOLOv8网络结构2.1 Conv2.2 C3与C2f2.3 SPPF2.4 Upsample2.5 Detect层 1 YOLOv8的yaml配置文件 YOLOv8的配置文件定义了模型的关键参数和结构&#xff0c;包括类别数、模型尺寸、骨干&#xff08;backbone&#xff09;和头部…

手机租赁平台开发助力智能设备租赁新模式

内容概要 手机租赁平台开发&#xff0c;简单说就是让你用得起高大上的智能设备&#xff0c;不管是最新款的手机、平板&#xff0c;还是那些炫酷的智能耳机&#xff0c;这个平台应有尽有。想要体验但又不希望花大钱&#xff1f;那你就找对地方了&#xff01;通过灵活的租赁方案…