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

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

抖音云官方文档: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.hqwc.cn/news/691135.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024自动化测试市场分析

大家都说2024年软件测试讲会卷的更厉害,从原来的功能测试到现在自动化测试,那么2024年是否可以学习自动化冲一把,我们先看一下2023年自动化测试在测试行业中的分析: 1.市场需求增长&#xff1a; 随着技术的进步和企业对软件质量的要求日益提高&#xff0c;自动化测试在测试行…

设计模式-结构型-适配器模式-Adapter

地址类 public class Address {public void street() {System.out.println("普通的街道");}public void zip() {System.out.println("普通的邮政编码");}public void city() {System.out.println("普通的城市");} } 荷兰地址类 public class …

Python 开发 框架安全:Django SQL注入漏洞测试.(CVE-2021-35042)

什么是 Django 框架 Django 是一个用 Python 编写的 Web 应用程序框架。它提供了许多工具和库&#xff0c;使得开发 Web 应用程序变得更加容易和高效。Django 遵循了“MTV”&#xff08;模型-模板-视图&#xff09;的设计模式&#xff0c;将应用程序的不同组件分离开来&#x…

软件测试用例

测试用例的目的&#xff1a;为了实施测试面向测试系统提供的一组集合&#xff0c;这组集合包含&#xff1a;测试环境&#xff0c;操作步骤&#xff0c;测试数据&#xff0c;预期结果等要素 注&#xff1a;测试用例覆盖率越高&#xff0c;说明测试质量越高 测试用例覆盖率越低&…

排序算法及实现(上)

稳定性的判断&#xff1a;如果两个相同大小的元素也进行了交换就是不稳定&#xff0c;否则稳定 1.直接插入排序&#xff1a; 当插入第 i 位置元素时&#xff0c;前面 0 到 i-1 位置的元素已经各自有序。 此时将i 再次从i-1到0位置依次进行比较。找到合适位置将其插入&#x…

唤醒手腕 Go 语言 并发编程、Channel通道、Context 详细教程(更新中)

并发编程概述 ​ 一个进程可以包含多个线程&#xff0c;这些线程运行的一定是同一个程序&#xff08;进程程序&#xff09;&#xff0c;且都由当前进程中已经存在的线程通过系统调用的方式创建出来。进程是资源分配的基本单位&#xff0c;线程是调度运行的基本单位&#xff0c…

算法提高之字串变换

算法提高之字串变换 核心思想&#xff1a;双向广搜 双向bfs 建立两个队列 一起bfs到中间态 #include <iostream>#include <cstring>#include <algorithm>#include <queue>#include <unordered_map>using namespace std;const int N 6;int n;…

车载测试和传统测试有什么区别

搞清楚车载测试和传统应用测试的区别,就可以大胆冲冲冲! 车载测试随着市场的需求量增加又火来一波,一直’遥遥领先’的我们一定要告诉大家一个事实:车载测试和传统的应用测试是有很大区别的. 测试对象不一样 传统测试:测试的对象无非就是各种应用,比如电脑端的web系统(使用浏…

Xilinx 千兆以太网TEMAC IP核 AXI4-Lite接口信号

在AX4总线标准中&#xff0c;AXI4-Lite主要由向她址映射型通信。TEMAC的管理法口采用AXI4-Lite标准接口&#xff0c;TEMAC核的AX14-Lite接口信号如表1所示&#xff0c;根据AX14-Lite标准&#xff0c;接口角色分为主接口(Maser Interface)和从接口(Slave Interface)。主接口为通…

手写Windows文件路径获取小工具

手写Windows文件路径获取小工具 目的 给Windows右键增加功能&#xff0c;右键任何文件&#xff08;夹&#xff09;显示复制文件路径的扩展。 效果展示 实现思路 右键调用&#xff0c;自身会把文件路径传递给被调用文件&#xff0c;被调用文件内只需将路径参数复制到剪贴板即…

linux下的进程通信

进程通信 进程为什么需要通信呢&#xff1f;进程通信的技术背景进程通信本质 进程通信分类管道匿名管道pipe匿名管道原理管道特点 命名管道创建命名管道命名管道原理 System V IPC管道与 System V的区别共享内存函数ftok()shmget() shmat()shmdt()shmctl()删除共享内存System V…

linux系统(ubuntu)调用科大讯飞SDK实现语音识别

1. 科大讯飞官网 登录注册实名制 2. 点击控制台&#xff0c;创建应用 点击左侧的语音听写&#xff0c;右边下滑选择Linux&#xff0c;点击下载 选择Linux平台&#xff0c;普通版本&#xff0c;语音听写&#xff0c;SDK下载 此时将得到一个压缩包&#xff0c;选择的功能不…