之前做了几款单机休闲小游戏,都是上架的微信小游戏。游戏关卡都是保存的本地存储,然后经常被玩家吐槽关卡数据没了,又从第一关开始。可能是玩家主动清缓存或者从任务栏删除了吧。作为一名客户端开发,我也很无奈。还好微信提供了云开发的方案。
开始试水。
一、使用云开发的目的:很简单,就是记录玩家的当前关卡。
二、方案:一张表(playerdata),两个云函数(获取当前关卡、上报当前关卡)
三、前置工作。
微信小游戏工程,已经注册APPID,已经开启云服务(首月免费)。这里我的小游戏用的是Cocos Creator开发。
四、开工。
1、打开云开发控制台。点击微信开发工具左上角的“云开发”按钮打开控制台
2、建表。先点击控制台界面的“数据库”按钮,进入数据库界面。左边点击"+"号新建集合(表),这里我们建立了一张playerdata的表。然后再添加表的字段。
3、创建云函数。选中云函数目录,右键,弹出菜单中可以"新建Node.js云函数"。这里我们建立两个云函数
(1)获取当前关卡(getselfdata)。这里需要考虑玩家第一次玩这个游戏,数据库中没有记录,那么返回一个默认值1。
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init() // 使用当前云环境
const db = cloud.database()//引用云数据库
const playerdata = db.collection("playerdata")//引用data数据表
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
let isHas =await playerdata.where({ openId:wxContext.OPENID}).get();
if (Array.isArray(isHas.data) && isHas.data.length === 0)
{
let isAdd = null
let addData = {
openId:wxContext.OPENID,
nickname:"",
headUrl:"",
curlevel:1,
}
//把获取的数据添加到数据库
await playerdata.add({
data:addData,
success: function(res) {
console.log("add success")
console.log(res)
},
fail: function(res) {
console.log("add fail")
console.log(res)
},
complete: function(res) {
console.log("add complete")
console.log(res)
}
})
return addData//isAdd.data[0]
}else
{
return isHas.data[0]
}
}
(2)上报玩家当前关卡(updaterecord)。
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init() // 使用当前云环境
const db = cloud.database()//引用云数据库
const playerdata = db.collection("playerdata")//引用data数据表
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
let isHas =await playerdata.where({ openId:wxContext.OPENID}).get();
if (Array.isArray(isHas.data) && isHas.data.length === 0) {
let isAdd = null
let addData = {
openId:wxContext.OPENID,
nickname:"",
headUrl:"",
}
if(event.curlevel)
{
addData.curlevel = event.curlevel;
}
//把获取的数据添加到数据库
isAdd = playerdata.add({
data:addData,
success: function(res) {
console.log("add success")
console.log(res)
},
fail: function(res) {
console.log("add fail")
console.log(res)
},
complete: function(res) {
console.log("add complete")
console.log(res)
}
})
console.log("add data")
} else {
let updateData = {}
if(event.curlevel)
{
updateData.curlevel = event.curlevel;
}
if(event.nickname)
{
updateData.nickname = event.nickname;
}
if(event.headUrl)
{
updateData.headUrl = event.headUrl;
}
console.log(updateData);
let updateResult = await playerdata.doc(event._id).update(
{
data : updateData,
success: function(res) {
console.log("upadte success")
console.log(res)
},
fail: function(res) {
console.log("upadte fail")
console.log(res)
},
complete: function(res) {
console.log("upadte complete")
console.log(res)
}
})
}
return {
event,
openid: wxContext.OPENID,
appid: wxContext.APPID,
unionid: wxContext.UNIONID,
}
}
4、云函数相关操作。对于一名客户端研发,云函数操作这块还是有很多值得注意的地方。
(1)本地调试。这里我们可以输入一个json格式的输入,来调试我们创建的云函数,运行结果可以对数据库进行操作。
(2)上传并部署。当前我们建立的云函数还只是在电脑本地,云服务器上面还没有这个函数。经常会出现有人问:“本地调试有返回结果,游戏运行中却没效果”。这是因为还没将云函数部署到服务器,右键云函数,选择“上传并部署”,一般这里不上传node_modules。
(3)同步云函数列表及下载。当我们重新打包游戏客户端,云函数的目录会被清理掉。如果要继续对云函数进行调整,需要先同步云函数列表,并下载对应的云函数。
五、上线结果。
一直以为我做的渣渣游戏,20块一个月的额度完全够用。直到游戏中真的上线了云服务,我才发现套餐中20万次调用完全不够。玩家每次进入游戏会调用一次“获取当前关卡”,每次通关会调用“上报关卡”,玩家进进出出+通关,人均调用10次,日活跃一千就是1万次,20万次只够20天,还得继续买服务额度。
我的游戏中还加了世界排行榜,有时间再写一篇。需要看效果的可以扫码体验。