【Unity】Unity项目转抖音小游戏(二)云数据库和云函数

ops/2024/9/20 7:36:53/ 标签: unity, 数据库, 游戏引擎, 抖音, StarkSDK, WebGL

业务需求,开始接触一下抖音小游戏相关的内容,开发过程中记录一下流程。

抖音云官方文档:https://developer.open-douyin.com/docs/resource/zh-CN/developer/tools/cloud/develop-guide/cloud-function-debug

1.开通抖音云环境

抖音云地址:https://cloud.douyin.com/
抖音云】-【小游戏】点击你要开通的小游戏
在这里插入图片描述
显示开通中即为申请成功
在这里插入图片描述

2.开启云数据库

【组件中心】-【文档型数据库】-【云数据库】。填入申请即可
在这里插入图片描述
数据库是json的形式这个和微信一样,通过了之后点击管理就可以创建数据集合了
在这里插入图片描述
在这里插入图片描述

3.创建云函数环境

【服务管理】-【服务列表】
在这里插入图片描述
点击新建后,可以服务类型选择云函数,因为抖音的文档是Ts的示例,接口的都是些Ts,这里可以先把Ts勾上。不勾的话云函数是js的。

在这里插入图片描述

4.创建云函数

进来之后,界面是一个云函数编辑器的样式
在这里插入图片描述
点击这这里可以创建新的云函数脚本
在这里插入图片描述
打勾的是已经发布的。黄色点未发布的

5.云函数调用数据库

创建云函数后已经有一个代码模板了,可以通用后面的一些方法

/** 
* @param params 调用参数,HTTP 请求下为请求体* @param context 调用上下文** @return 函数的返回数据,HTTP 场景下会作为 Response Body**/
import { dySDK } from '@open-dy/node-server-sdk';
export default async function (params: any, context: any) {return {"message": "hello",};
};function getContext(context: any) {const serviceContext = dySDK.context(context);return serviceContext.getContext();
}async function callContainer(context: any, serviceId: string,path: string,method: string,querys?: Record<string, any>,data?: any,headers?: Record<string, any>) {const serviceContext = dySDK.context(context);return serviceContext.callContainer({"serviceId": serviceId,"path": path,"method": method,"querys": querys,"data": data,"headers": headers,});
}async function openApiInvoke(context: any, url: string,method: string,querys?: Record<string, any>,data?: any,headers?: Record<string, any>) {const serviceContext = dySDK.context(context);return serviceContext.openApiInvoke({"url": url,"method": method,"querys": querys,"data": data,"headers": headers})
}

这里扩展一个加载用户数据的脚本

/** 
* @param params 调用参数,HTTP 请求下为请求体* @param context 调用上下文** @return 函数的返回数据,HTTP 场景下会作为 Response Body**/
import { dySDK } from '@open-dy/node-server-sdk';
export default async function (params: any, context: any) {const dyContext = getContext(context);const db = dySDK.database();const userdata = db.collection('UserData');let openid = 0;if (dyContext.openId == '') {//没有openId,用户没登录,这时候用传参进来的deviceID代替console.log('no logined')openid = params.deviceId;}else {console.log('logined')openid = dyContext.openId}const data = await userdata.where({openid: openid}).get();if (data.data.length == 0) {console.log("没有找到目标数据" + openid + ",," + params.deviceId) return {code: 0,openid: openid};}else {return {openid: openid,data: data.data[0],};}};function getContext(context: any) {const serviceContext = dySDK.context(context);return serviceContext.getContext();
}async function callContainer(context: any, serviceId: string,path: string,method: string,querys?: Record<string, any>,data?: any,headers?: Record<string, any>) {const serviceContext = dySDK.context(context);return serviceContext.callContainer({"serviceId": serviceId,"path": path,"method": method,"querys": querys,"data": data,"headers": headers,});
}async function openApiInvoke(context: any, url: string,method: string,querys?: Record<string, any>,data?: any,headers?: Record<string, any>) {const serviceContext = dySDK.context(context);return serviceContext.openApiInvoke({"url": url,"method": method,"querys": querys,"data": data,"headers": headers})
}

1.params为小程序调用时候上传的数据。

2.调用getContext().openId可以获得当前用户的唯一id,可以用来识别数据库的用户。但是这个openId只能在登录状况下后去,小游戏没登录的话,会是空。

3.这里可以获得一个数据叫UserData的数据集合。这样就能插入和读取数据了

  const db = dySDK.database();const userdata = db.collection('UserData');

4.可以在当前界面调试代码。console.log会输出带页面下方的调试日志当中

  1. 函数的最后return最终的返回内容
    return {code: 0,openid: openid};

6.Unity端调用

官方文档主要参考:https://developer.open-douyin.com/docs/resource/zh-CN/developer/tools/cloud/develop-guide/cloud-database/client/unity-sdk-clouddatabase

客户端主要通过这个接口实现云函数的调用

 StarkSDK.API.GetStarkDouyinCloudManager().CallContainerCallContainer(string eveId, string serviceId, string path, Options options,Action<Response> success, Action<ErrorResponse> fail);

调用代码中的eveId和ServiceId是云环境和云服务对应Path为执行的函数的文件名,可以通过这里获取
在这里插入图片描述
点击后会显示
在这里插入图片描述

这里给一个样例

/// <summary>/// 通过云函数读取存档/// </summary>/// <param name="action"></param>void LoadRecordCloudFunc(Action action){Debugger.Log($"开始获取云存档{unionID}");string json = "{"+ $"\"deviceId\":\"{unionID}\""  +"}";JsonData jsondata = JsonMapper.ToObject(json);StarkSDK.API.GetStarkDouyinCloudManager().CallContainer(DYCloudID,DYServerID,"/getUserData",new StarkDouyinCloud.Options(){Method = "POST",Data = jsondata}, (res) =>{var jsonOjbect = JsonMapper.ToObject(res.Data);// 云存档的 json 多包装了一层,需要把 data 对应的// TODO:Json设置成玩家数据 action?.Invoke();}}, (res) =>{GameSaver.Instance.Load();action?.Invoke();Debugger.LogError($"存档加载失败:{res.StatusCode}-{res.ErrMsg}");});}

StarkDouyinCloud.Options 部分比较复杂,主要是上传数据的内容Method 可以选择POST/GET,Data 上传的LitJson的JsonData,抖音的SDK会含有LitJson插件。

返回的成功回调和失败回调的参数分别长这个样子:

成功回调:

public class Response{public Dictionary<string, string> Header;public int StatusCode;public string Data;public string ErrMsg;public Response();}

云函数返回的数据在Response.Data里面。是一个Json格式的字符串

失败回调:

   public class ErrorResponse{public int StatusCode;public string ErrMsg;public ErrorResponse();}

开发过程中遇到一个问题:
SDK自己打出来的日志显示云函数返回的结果是正确的,抖音云函数也执行正常,但是Response.Data是空的。问了SDK的技术人员之后发现是
LitJson的JsonData.cs下的OptGetString函数有问题

出错的SDK版本是这样的:
在这里插入图片描述
回退版本之后,正常的函数是长这个样子

区别是判断到是Object不是String之后,返回了一个空字符串了。
有遇到的朋友可以注意一下。


http://www.ppmy.cn/ops/40808.html

相关文章

【springboot】整合oauth2.0和security,使用图形验证码和邮箱验证码登录

思路 当使用OAuth和Security框架(如Spring Security)进行登录,并且不使用密码而使用验证码时,生成Token的过程通常涉及以下几个步骤: 1.验证码生成与验证: 首先,系统会生成一个图形验证码并将其展示给用户。 用户输入他们看到的验证码。 系统验证用户输入的验证码是否…

docker的使用

docker的使用 1.首先&#xff0c;拉取一个镜像&#xff0c;如 docker pull 镜像名称 # 官方镜像 docker image pull 镜像名称 # 或简写为 docker pull 镜像名称 # 比如 docker pull ubuntu docker pull ubuntu:16.04# 个人镜像 docker pull 仓库名称/镜像名称 docker pull …

Linux sndconfig命令教程:如何在Linux下设置声卡(附实例详解和注意事项)

Linux sndconfig命令介绍 sndconfig&#xff08;Sound Configuration&#xff09;是一个用于设置声卡的命令。它支持即插即用&#xff08;Plug and Play&#xff0c;PnP&#xff09;设置&#xff0c;可以自动检测并设置PnP声卡。sndconfig命令可以帮助用户在Linux系统中配置声…

如何提高自己的全局视野?

以下是一些可以帮助提高全局视野的方法&#xff1a; 1. 广泛学习不同领域知识&#xff1a;包括但不限于技术相关的各个领域、业务知识、行业动态等&#xff0c;拓宽知识面。 2. 参与大型项目&#xff1a;积极投身到复杂的、规模较大的项目中&#xff0c;在实践中感受和理解系…

计算机毕业设计hadoop+spark+hive知识图谱bilibili视频数据分析可视化大屏 视频推荐系统 预测系统 实时计算 离线计算 数据仓库

研究意义 随着互联网的快速发展&#xff0c;人们面临着海量的视频内容&#xff0c;如何从这些繁杂的视频中找到自己感兴趣的内容成为一个重要的问题[1]。推荐系统作为一种解决信息过载问题的重要工具&#xff0c;能够根据用户的历史行为和偏好&#xff0c;预测用户可能感兴趣的…

nginx 负载均衡配置详解

基于 ${nginx_home}/conf/nginx.conf 文件配置实现&#xff0c;如下&#xff1a; http {# 定义server地址upstream server_group {server 192.168.xxx.1:8080;server 192.168.xxx.2:8080;server 192.168.xxx.3:8080;}server {listen 80;location / {root html;index …

Spring框架概述

目录 1. Spring框架的起源 2. Spring框架的构成 3. Spring的发展历程 4. Spring的开发环境 4.1. Maven安装与配置 &#xff08;1&#xff09;Maven的下载与安装 &#xff08;2&#xff09;配置Maven的环境变量 &#xff08;3&#xff09;本地仓库的配置 &#xff08;4…

变频器通过Modbus转Profinet网关接电机与PLC通讯在自动化的应用

Modbus转Profinet网关&#xff08;XD-MDPN100/300/600&#xff09;的作用是将Modbus协议转换为Profinet协议&#xff0c;支持Modbus RTU主站/从站&#xff0c;并且Modbus转Profinet网关设备自带网口和串口&#xff0c;既可以实现协议转换的同时&#xff0c;也可以实现接口的转换…

通过EXCEL控制PLC启停电机的一种方法

概述 本例将介绍用微软EXCEL电子表格控制西门子S7-1200 PLC实现电机启停的一种方法。 第1步&#xff1a; 添加PLC设备&#xff0c;选择西门子S7-1214C CPU&#xff0c;设置IP地址&#xff1a;192.168.18.18&#xff0c;子网掩码&#xff1a;255.255.255.0。 第2步&#xff1a…

企业开发基础-JDBC(SQL注入)

JDBC概论 1、JDBC是什么&#xff1f; Java DataBase Connectivity&#xff08;Java语言连接数据库&#xff09; 2、JDBC的本质是什么&#xff1f; JDBC是SUN公司制定的一套接口&#xff08;interface&#xff09; java.sql.*; (这个软件包下有很多接口。) 接…

防火墙技术基础篇:什么是包过滤技术

什么是防火墙包过滤技术 当数据在网络中传输时&#xff0c;它们被分割成小的单元&#xff0c;称为数据包。防火墙的包过滤是一种基本的网络安全技术&#xff0c;用于检查这些数据包并根据预定义的规则决定是否允许它们通过防火墙。 防火墙包过滤是一种关键的网络安全技术&am…

MySQL————创建存储过程函数

存储过程使用大纲 无参数传递 delimiter $$ 声明一个名称为get_student_introduce CREATE PROCEDURE gei_student_introduce() 开始操作 BEGIN 撰写真正在操作DMLDQL都行 SET userName张三; select introduce 简介 from student WHERE userNameuserName; end $$ delimit…

关于我个人的编码规范(C/C++)

文章目录 前言一、文件结构1. 版权和版本声明&#xff08;不是必须&#xff0c;但是我建议看看&#xff09;2. 头文件结构3. 源文件结构 二、排版&#xff08;以 K&R 风格为主&#xff09;1. 缩进与左花括号的位置2. 空行的插入3. 该分行就分行4. 花括号5. 长语句分段6. 空…

跨境网络为何离不开海外静态住宅IP

在全球化日益加深的今天&#xff0c;跨境网络活动已成为商业和个人交流的常态。无论是远程办公、跨境电商还是国际社交&#xff0c;网络连接的稳定性和安全性都至关重要。而海外静态住宅IP作为连接不同国家和地区网络的关键元素&#xff0c;其重要性日益凸显。本文将深入探讨跨…

RabbitMQ 如何使用延迟队列

RabbitMQ 如何使用延迟队列 目录 前置条件场景描述RabbitMQ 延迟队列机制实现步骤 1. 安装 RabbitMQ 延迟队列插件2. 创建延迟队列和交换机3. 发布延迟消息4. 消费延迟消息 示例代码 1. 延迟队列配置2. 发布消息的 Producer 代码3. 消费消息的 Consumer 代码 注意事项 前置条…

代码随想录算法训练营第二十七天|​回溯法理论基础​、第77题. 组合

理论基础 回溯法基本介绍 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。 回溯是递归的副产品&#xff0c;只要有递归就会有回溯。递归函数的下面就是回溯的逻辑 因为回溯的本质是穷举&#xff0c;穷举所有可能&#xff08;暴力法&#xff09;&#xff0c;然…

【机器学习】LoFTR:革命性图像特征批评技术等领跑者

LoFTR&#xff1a;革命性图像特征匹配技术的领跑者 一、引言二、LoFTR技术的创新之处三、LoFTR技术的实现原理四、LoFTR技术的代码实例五、结语 一、引言 在3D计算机视觉领域&#xff0c;图像特征匹配技术一直是研究的热点和难点。随着技术的不断发展&#xff0c;传统的特征检…

【简单探索微软Edge】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

基础ArkTS组件:二维码,滚动条与滑动条,多选框与多选框群组(HarmonyOS学习第三课【3.4】)

二维码组件 QRCode 子组件 无 接口 QRCode(value: string) 参数: 参数名 参数类型 必填 参数描述 value string 是 二维码内容字符串。最大支持256个字符&#xff0c;若超出&#xff0c;则截取前256个字符。 说明&#xff1a; 该字符串内容确保有效&#xff0c;不支…

一个基于servlet的MVC项目-登录验证

一、MVC的概念 MVC是Model、View、Controller的缩写&#xff0c;分别代表 Web 应用程序中的3种职责1 模型:用于存储数据以及处理用户请求的业务逻辑。 2视图:向控制器提交数据&#xff0c;显示模型中的数据。 3控制器:根据视图提出的请求&#xff0c;判断将请求和数据交给哪个…