[Unity学习教程] 微信小游戏云开发——云函数创建、应用、相关问题

[复制链接]
查看1510 | 回复0 | 2023-8-23 12:14:23 | 显示全部楼层 |阅读模式 来自 中国北京


目次

Unity开发微信小游戏
Unity中将游戏开发完成后,假如必要将用户在游戏中的相关数据永世存储,大概就必要用到服务器,而微信开发者工具中有“云开发”选项,此文主要解说使用云开发时碰到的一些问题及办理方法
论述的内容
一、云函数怎样创建
二、编写云函数,上传云函数,调用云函数
三、调用云函数时碰到的一些问题
一.云函数怎样创建
 1、导入项目
2、项目首页 
3、云开发控制台 
 4、云函数选项
 5、创建云函数
新人/小白创建方法与步调:
 二、编写云函数,上传云函数,调用云函数
1、编写JS代码
2、上传云函数
3、调用云函数
三、调用云函数时碰到的一些问题
问题1:不能在Unity中编辑器调用,官方专员表明: 
 问题2:云开发控制台中创建的云函数,调用失败。
 至此,云函数调试乐成,暂告一段落。
后续,可根据上述相关知识点,安排相关业务逻辑。
原创不易,转发请注明出处。



Unity开发微信小游戏

Unity中将游戏开发完成后,假如必要将用户在游戏中的相关数据永世存储,大概就必要用到服务器,而微信开发者工具中有“云开发”选项,此文主要解说使用云开发时碰到的一些问题及办理方法


论述的内容

一、云函数怎样创建

二、编写云函数,上传云函数,调用云函数

三、调用云函数时碰到的一些问题


一.云函数怎样创建

 1、导入项目



假如AppID已经注册云开发,则微信开发者工具主动启用,无须手动点击,如上图所示 
2、项目首页 

点击确定后,进入项目首页展示

3、云开发控制台 

点击“云开发”按纽,进入云开发控制台 因之前创建过云函数,调用过,以是表现了相关信息,初次进入应该均为0
 4、云函数选项

此时在控制台中可以看到“云函数”选项,点击进入

首次进入或从未创建过,云函数列表选项为空,因之前我已经创建,以是表现条目中有2个云函数,并表现了一些相关信息 
 5、创建云函数

注意:此时会有很多人以为(包罗我),点击控制台中的“新建云函数”按纽,输入相关信息,创建就行了呗,殊不知此方法是可以创建,但之后的设置对新人/小白(包罗我)来讲,将是恶梦的开始。高手/大佬可以无视

    缘故原由:因后续在同步云函数、下载云函数、编辑云函数时你会发现,始终只有一个云函数的文件,即:index.js云函数入口文件,网上查资源时,人家的阐明中却不但是这一个文件,另有诸如:package.json等文件,固然了,这些文件可以手动创建,但不懂JS语法,不懂设置,将会是一场恶梦的开始,必要恶补javascript及其nodeJS相关知识,耗费诸多时间与精神。
    新人/小白创建方法与步调:

  步调1:在项目中新建一个文件夹,定名为cloudfunctions(名称恣意,自己知道与云函数相关即可),固然创建了,但此时它只是一个文件夹而已,就这么放着是不起任何作用的。
步调2:文件夹固然创建了,但假如要在项目中可以或许正确辨认并启用,须要找到项目中的project.config.json文件,在此中添加相关参数才行(查阅了诸多文档得知),否则,在此文件夹上鼠标右键,表现的也只是寻常文件夹该有的信息,和云函数相关的信息根本就没有,网上查阅的资料中说什么这个谁人的,一概没有。如下图:

步调3:设置project.config.json
点击此文件,在右侧面板表现的内容中找到最反面一行,如下图表现:

 "cloudfunctionTemplateRoot": "cloudfunctionTemplate/",注意,此行代码仅为官方示例,不起任何作用,我们必要将此中的参数修改为我们刚刚创建的文件夹名称才行。大概直接删除,新建一行,这里是有代码提示的。新建时,输入cloud字样,会有提示,选择“cloudfunctionRoot”,反面的双引号""中输入斜杠 /,会表现当前项目中可用的文件夹,选择刚刚创建的cloudfunctions即可。注意格式:上一行参数的结尾要有逗号,最后一行不能有逗号。
    新建后的参数,如下图:
  
 

注意:此时参数添加了,但没有保存,是不起作用的,ctrl+s保存后,会发生一些变化,如图 

 至此,云函数文件夹创建与相关设置完成。
这只中创建云函数的第一步
步调4:新建云函数
此时右键我们创建的文件夹,就会表现云函数相关的内容选项

 点击新建Node.js云函数,输入自界说函数名称,回车。

   创建完成后,稍等半晌,微信开发者工具会主动上传云函数到云端。
  此时创建出的云函数,就不但是一个index.js入口文件了,相应的设置文件config.json、package.json也会一并创建,云函数名称表现绿色图标。

    packgage.json文件内容展示:
  

假如你是业界大佬,全然知晓怎样设置此文件,那固然无所谓,但对我等小白而言,简直就是恶梦,还是按步就班,一步一步来吧。(不懂后端,不会JS,表现很伤心 -_-)
   此方法创建的云函数,不会产生情况依靠问题
  此时,云控制台中“云函数”选项中,也相应的出现了我们刚刚创建的云函数名称

至此,云函数才算正式创建乐成。只不外入口文件index.js中只有示例代码,大概没有我们想要的业务逻辑而已,后续就是自己编写相关业务逻辑。哎,还得写JS代码。 -_-

 二、编写云函数,上传云函数,调用云函数

上面我们只是将云函数创建出来了,此中的代码逻辑大概不是我们想要的,以是还要修改原有JS代码,以符合我们的业务逻辑。
1、编写JS代码

想要调用云函数,起首我们要有写好的JS代码,固然,示例代码也能测试,只是过于简朴而已。这里展示的是获取用户微信相关数据,并存储。此代码泉源于网络,添加了一些注释(自己意会的),仅供参考:
  1. // 云函数入口文件
  2. // require(string)用于引入腾讯为云开发提供的模块"wx-server-sdk",字符串格式
  3. const cloud = require('wx-server-sdk');
  4. // 每个云函数的开头写cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }),主要用于初始化云函数环境,参数:DYNAMIC_CURRENT_ENV 表示云函数所处环境,默认始终为第一个,即使删除第一个位置上的环境,第二个环境会变为第一个。否则只能手动修改参数,例如:cloud.init({ env: 环境名称 })
  5. cloud.init({env:cloud.DYNAMIC_CURRENT_ENV});
  6. //获取数据库的引用实例,以便操作数据
  7. const db = cloud.database();
  8. // 数据库集合"UserData"为自己在云开发控制台的数据选项中中自行创建
  9. // 步骤:开发者工具 — 云开发 — 云开发控制台 — 数据库 — 集合名称'+'
  10. // 参数名称必须,否则报错
  11. const gamedata = db.collection('UserData');
  12. // 云函数入口函数、上传用户存档数据
  13. exports.main = async (event, context) => {
  14.   const wxContext = cloud.getWXContext();// 获取微信上下文
  15.   //使用get()方法查询集合中用户是否已经保存过数据,并搭配条件语句 where() 过滤想要的数据
  16.   let _isHas = await gamedata.where({
  17.     openid: wxContext.OPENID // 需要过滤查询的内容(微信上下文OPENID数据)
  18.   }).get();
  19.   //如果按以上条件查询结果为 0,则保存此 ID 数据
  20.   if (_isHas.data.length == 0) {
  21.     let _isAdd = null; // 声明一个变量,用于存储add()的结果
  22.     let addData = {    // 声明要添加的数据(2条)
  23.       // 存储格式
  24.       openid: wxContext.OPENID, // 键:openid,  值:微信上下文中的OPENID数据
  25.       gamedata: event,          // event.gamedata unity调用直接读event
  26.     }
  27.     _isadd = await gamedata.add({
  28.       data: addData
  29.     })
  30.     return {
  31.       code: 0,
  32.       res: _isadd,
  33.       data: addData,
  34.     };
  35.   }
  36.   //如果有数据,则更新
  37.   else {
  38.     return await gamedata.where({
  39.       openid: wxContext.OPENID
  40.     }).update({
  41.       data: {
  42.         openid: wxContext.OPENID,
  43.         gamedata: event,//event.gamedata
  44.       }
  45.     })
  46.   }
  47. };
复制代码
  以上代码,来自于网络,如有侵权,请告知,本着开源精神,仅展示而已。大概逻辑不是你想的,可自行随意修改。
  以上代码,复制、粘贴到云函数入口文件index.js中,更换掉原有代码,即可。
2、上传云函数

ctrl+s保存后,记得要上传。右键点击云函数名称,上传并摆设,稍等一会儿,即可完成。

点击“上传并摆设:全部文件”时,大概会弹出提示:

点击确定。然后再点击“上传并摆设:云端安装依靠(不上传node-modules)”,稍等半晌,即可上传乐成,右侧面板中有上传提示。
    疑问:大概有人会问,我明显创建的云函数就一个,名为Test,怎么出来3个文件。实在,我们创建云函数,只不外是创建了一个云函数情况而已(个人明确),在云端是要做初始化的,明面上调用时也不是调用3个文件中的任何一个。相关参数誊写只能是我们创建的名称,例:  name : "Test",而不是3个文件中的任何一个。
  3、调用云函数

编写并上传完云函数后,接下来是调用。
步调1:上述存储数据的JS代码中,我们应该看到,它是先访问数据库中的一个聚集,聚集名称为“UserData”,这个是必要我们自己在“云开发控制台”中手动创建的,固然,聚集名称恣意,创建时是什么名称,访问时,参数中就要如实填写其名称。创建聚集,如图:

   假如数据库中没有"UserData"这个聚集,会报错,如图所示:
  

   注意:假如提示不能创建聚集,情况不可用。关闭微信开发者工具,重新打开。大概重启电脑,再重新打开工具,进入云开发控制台,再次创建即可。
  经历:本人切身经历,电脑突然断电,再次打开微信开发者工具,创建聚集,表现不可用,无法创建。继而关闭微信开发者工具,再重新打开,再次进入云开发控制台,便可以创建了。
  步调2:聚集创建完成后,下面我们开始测试云函数。
    点击刚刚创建的云函数Test,选择当地调试,如图:
  

   提示安装Node模块,确定即可。
  


步调3:当地调试
   进入当地调试首页,如图:
  

 我们选择手动触发,切换到Console控制台窗口,便于查察相关调试信息。如图:

 图中3:表现情况选择,若只有一个情况,默认大概选择自己创建的情况,结果一样,如有多个情况,需手动选择一个情况调试。注意:情况是在注册云开发时一并就创建好的。
图中4:哀求参数,即上传的数据,也就是将来游戏中触发云函数后,必要上传的游戏数据。格式为键值对情势。此时为调试,键和值可以随意填写,均须用引号包裹。
图中5:“调用”,点击后,控制台会有相关信息提示,可点击查察是否调用乐成。

   云开发控制台的数据库查察,如下图:
  

 从图中可以看出,数据上传无误,统统正常。
   至此,我们创建的云函数调用乐成。 
  三、调用云函数时碰到的一些问题

上述云函数已经创建乐成,而且调试也是乐成的,下面转入项目实战,办理在项目中现实调用云函数。本人是通过Unity开发的小游戏,在Unity中使用的是C#脚本,我们用C#脚本编写代码调用云函数。
下面代码示例,用于调用云函数:
  1. using UnityEngine;
  2. using WeChatWASM;
  3. public class SaveUserData : MonoBehaviour
  4. {
  5.     public void UploadUserData() // 点击按纽,调用此函数
  6.     {
  7.         WXBase.cloud.Init(new CallFunctionInitParam()
  8.         {
  9.             env = "自己的云函数环境ID,云开发控制台概览中可查看",
  10.             traceUser = false
  11.         });
  12.         WXBase.cloud.CallFunction(new CallFunctionParam()
  13.         {
  14.             name = "SetUserData",// 此处设置云函数名称,并非JS文件名
  15.             
  16.             data = JsonUtility.ToJson("score"),// 此处代表上传的数据,必须要有,空数据或没有此行代码,均会报错,并且须经过此方法序列化才行。括号中的数据可根据实际需求修改,可参照官方示例。
  17.             
  18.             success = (res) =>
  19.             {
  20.                 Debug.Log("success");
  21.                 Debug.Log(res.result);
  22.             },
  23.             fail = (res) =>
  24.             {
  25.                 Debug.Log("fail");
  26.                 Debug.Log(res.errMsg);
  27.             },
  28.             complete = (res) =>
  29.             {
  30.                 Debug.Log("complete");
  31.                 Debug.Log(res.result);
  32.             }
  33.         });
  34.     }
  35. }
复制代码
  上述代码中,data选项必须存在,否则报如下错误:
  


   情况ID:在云开发控制台的概览中可查察到
  


创建 SaveUserData.cs 的 C# 脚本,脚本中声明一个函数,此处为 UploadUserData,在此函数中添加相关云函数脚本,如图中所示。图中 name = "SetUserData",字符串为云函数名称,注意不要填错,否则报错。此示例,根本按照官方 Cloud.cs 文件中的示例演变,大同小异,根据自身现实情况修改即可。
   官方示例:
  

问题1:不能在Unity编辑器中调用,官方专员表明: 


 假如在Unity编辑器中调用,会报如下错误:

 以是我们只能将小游戏转换后,在微信开发者工具中调用测试,或扫描二维码,在真机上点击测试。这个问题困扰了我好久,无奈,相关文档匮乏,只能发文告急才得以明确。
 问题2:云开发控制台中创建的云函数,调用失败。

下面测试的云函数,是在“云开发控制台”中创建的,调用时报如下错误:

   缘故原由:没有相关设置文件,云函数所引用的依靠无法安装,以是云函数运行失败
  很显然,缺少wx-server-sdk依靠项,有很多人不解,明显我们在微信开发者工具中上传并摆设环节,点击的就是云端安装依靠,怎么就不可呢。这也是为什么,我在一开始就发起,创建云函数,一定要在微信开发者工具中创建,而不是在“云开发控制台”中创建,会者不难,难者不会。大佬可无视。
固然我们点击了云端安装依靠,但是没有现实的设置文件,只有一个入口文件index.js,它是不会安装什么依靠的,统统都要照单语言,没有package.json文件,统统都是无稽之谈。
在微信开发者工具中创建的云函数,数据上传是乐成的,如下图:


   在“云开发控制台”数据库中查察,已乐成添加了一条数据。如下图:
  
 

    至此,云函数调试乐成,暂告一段落。

  后续,可根据上述相关知识点,安排相关业务逻辑。

  原创不易,转发请注明出处。

  增补:用户授权代码分享

  1.     /// <summary>
  2.     /// 获取用户授权信息,GetSetting和GetUserInfo全局最好调用一次,频繁调用,会被官方限制或关闭接口。
  3.     /// 原因:两个接口均为官方限频接口,调用次数不能大于 PV 的 2 倍  ( PV = 打开游戏的次数 )
  4.     /// </summary>
  5.     private void UserAuthorize()
  6.     {
  7.         // 通过 wx.createUserInfoButton 接口创建透明按纽,发起授权,授权成功,立即上传数据到云端
  8.         var systemInfo = WX.GetSystemInfoSync(); // 获取当前手机系统信息
  9.         // Debug.Log("当前手机系统信息:" + systemInfo);
  10.         // Debug.Log("当前手机设备像素比:" + systemInfo.pixelRatio);
  11.         canvasWidth = (int) (systemInfo.screenWidth * systemInfo.pixelRatio); // 画布宽度
  12.         canvasHeight = (int) (systemInfo.screenHeight * systemInfo.pixelRatio); //画布高度
  13.         buttonHeight = (int) (canvasWidth / 1080f * 300f); // 按纽高度
  14.         _btn = WXBase.CreateUserInfoButton(0, canvasHeight - buttonHeight, canvasWidth, buttonHeight,
  15.             "zh_CN", false); // 生成按纽实例,并显示,此时为透明按纽
  16.         print("当前屏幕画布宽度:" + canvasWidth);
  17.         print("当前屏幕画布高度:" + canvasHeight);
  18.         print("按纽高度:" + buttonHeight);
  19.         // 用户点击授权按纽回调,response.errCode:0 成功,1 失败
  20.         _btn.OnTap(response =>
  21.         {
  22.             if (response.errCode == 0) //用户同意授权  0为成功,非零为失败
  23.             {
  24.                 _btn.Destroy(); // 同意授权,销毁授权按纽
  25.                 print($"用户同意授权,按纽销毁。response.errCode={response.errCode}");
  26.                 // 用户同意授权,获取用户信息
  27.                 WX.GetUserInfo(new GetUserInfoOption()
  28.                 {
  29.                     // 是否带上登录态信息
  30.                     // 尚未过期,此时返回的数据会包含 encryptedData, iv 等敏感信息;当withCredentials 为 false 时,
  31.                     // 不要求有登录态,返回的数据不包含 encryptedData, iv 等敏感信息。
  32.                     // 当 withCredentials 为 true 时,要求此前有调用过 wx.login 且登录态
  33.                     withCredentials = false,
  34.                     lang = "zh_CN", // 显示用户信息的语言
  35.                     success = result =>
  36.                     {
  37.                         // 将获取到的结果存入自定义数据类
  38.                         _authorizeData.nickname = result.userInfo.nickName;
  39.                         _authorizeData.avatarUrl = result.userInfo.avatarUrl;
  40.                                             
  41.                         print(result.userInfo.nickName);
  42.                         print(result.userInfo.avatarUrl);
  43.                     },
  44.                     fail = result => { print(result.errMsg); },
  45.                     // complete = result => { print("result.errMsg); }
  46.                 });
  47.             }
  48.             else // 拒绝授权  弹窗提示授权用途
  49.             {
  50.                 // 通用显示模板——模态对话框
  51.                 WX.ShowModal(new ShowModalOption()
  52.                 {
  53.                     title = "温馨提示",
  54.                     content = "《***》是一个休闲小游戏。",
  55.                     success = result =>
  56.                     {
  57.                         if (result.confirm) // 为 true 时,表示用户点击了确定按钮
  58.                         {
  59.                             print($"用户拒绝授权,WX.ShowModal——result.confirm={result.confirm},关闭弹窗。");
  60.                         }
  61.                     }
  62.                 });
  63.                 _btn.Destroy(); // 点击拒绝,销毁授权按纽
  64.             }
  65.         });
  66.     }
复制代码


来源:https://blog.csdn.net/lcjok9/article/details/128466527
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则