云开发让 Unity 微信小游戏实时聊起来

image

写在最前

本故事是《How Can Unity+腾讯云开发=微信小游戏?》的续篇,主要聊的是在使用 Unity 开发微信小游戏过程中,如何使用云开发来给小游戏增添一抹实时互动的亮色(比如实时聊天)

温馨提示:各家的云开发功能各具特色,本文的云开发特指腾讯云云开发

云开发,哪个服务可实现实时聊天?

丹尼尔:蛋兄,我又来了。上次跟你聊完(请看上集《How Can Unity+腾讯云开发=微信小游戏?》)后,我已经在 Unity 微信小游戏中用上云开发的数据模型了,云函数也顺手捎上了

蛋先生:不错,挺速度的嘛

丹尼尔:这些一来一回的后端接口,使用数据模型和云函数,唰唰唰一下就搞定了,别提多爽

蛋先生:是的,对于后端接口的搭建,这些服务确实可以大大简化你的工作,让你聚焦你的业务

丹尼尔:但我现在又遇到问题了

蛋先生:我就知道,无事不登三宝殿

丹尼尔:瞧您说的,主要是来看看您,顺便问下问题啦 (′▽`〃)

蛋先生:直说吧,啥问题

丹尼尔:我的小游戏里,玩家之间是可以聊天的,但我没发现云开发有 WebSocket 相关的服务

蛋先生:据我所知,云开发目前是没有提供这种纯粹的服务的。但是,云数据库有实时推送的功能,用它来实现你的需求应该是木有问题的

丹尼尔:啊~,在云数据库这啊,藏得够深的,How?

Unity 如何用上云数据库?

蛋先生:首先,咱们得让 Unity 能用上云数据库,你需要……

(丹尼尔打断了蛋先生的讲话)

丹尼尔:我懂我懂,这跟《How Can Unity+腾讯云开发=微信小游戏?》提到的数据模型是一个套路的

蛋先生:那你先去撸代码

image

丹尼尔:蛋兄,搞不定 (o_ _)ノ。这云数据库的 API 不像数据模型那么简单,我实在想不出如何用一个万能 JS 函数搞定

蛋先生:咳咳~。那咱们先把云数据库增删查改的调用示例整理出来,如下

var db = app.database();

db.collection("hello").add({
   ...})
db.collection("hello").doc("...").remove()
db.collection("hello").where({
   ...}).remove()
db.collection("hello").doc("...").get()
db.collection("hello").where({
   ...}).get()
db.collection("hello").get()
db.collection("hello").doc("...").update({
   ...})
db.collection("hello").doc("...").set({
   ...})
db.collection("hello").where({
   ...}).update({
   ...})

你看出什么门道了没?

丹尼尔:都有 collection?都是链式调用?

蛋先生:说到重点了,链式调用。链式调用就像是一串糖葫芦,一步接一步:方法名,入参,方法名,入参…

丹尼尔:然后呢?

蛋先生:根据这个规律,我们可以定一个 chainList 入参来实现 JS 函数,每一项就是一个方法名和方法入参。代码如下

Database_API: async function (callbackId, params) {
   
    ...
    const {
    collectionName, chainList } = asmLibraryArg
        .Utils()
        .parseInputParams(params);
    ...
    let db;

    if (platform === constants.PLATFROM.WX) {
   
        db = wx.cloud.database();
    } else if (platform === constants.PLATFROM.WEB) {
   
        db = app.database();
    }

    let chainObj = db.collection(collectionName);
    chainList.forEach((chainItem) => {
   
        const method = chainItem.method;
        const optionsStr = chainItem.optionsStr;
        let options = optionsStr ? JSON.parse(optionsStr) : "";
        ...
        chainObj = chainObj[method](options);
    });
    const data = await chainObj;
    asmLibraryArg.Utils().sendMessage(callbackId, data.data || data);
}

丹尼尔:你他 * 的真是个人才

蛋先生:夸人可以,但要文明

丹尼尔:嘻嘻,接下来就是 Unity 实现了

蛋先生:我们可以把刚刚整理的调用示例发给 GPT,让它帮咱们生成初步的接口定义和类实现,我们再调整一下即可。大概的 Prompt 如下

JS 是这么调用的
var db = app.database();
db.collection("hello").add({})
...

我希望在 Unity 也能这样调用,请帮我设计相应的类或接口

丹尼尔:可以啊,AI 用得溜溜的

蛋先生:基操而已。接下来我们来填补真正的实现细节

丹尼尔:好咧~

(温馨提醒:请参考下边的【代码块一】进行阅读)

蛋先生:对于每一个链式调用,我们只需实现最后的方法

比如 db.collection("hello").where({...}).get(),要填补实现的方法就是 QueryHandlerGet<T> 方法

而它的实现仅仅是提供 collection 名称(collectionName)和链式调用的方法名和入参(chainList)

公共逻辑实现 CommonHandler 跟数据模型的实现基本一致,这里就不作赘述

//【代码块一】

private class D
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值