本文节选自洪流学堂公众号技术专栏《大话Unity2019》,未经允许不可转载。

洪流学堂公众号回复专栏,查看更多专栏文章。

洪流学堂,让你快人几步。你好,我是郑洪智。

小新:“有了用户登录后,我们总要拿来做点什么事情吧?”
大智:“有了用户登陆信息之后,就可以针对用户来存储他自己的信息了,比如说装备、个人数据、闯关信息等等。”
小新:“是不是类似本地的存档,只不过存到了服务器上?”
大智:“可以这么理解,今天我们来尝试下存储玩家的最高分,并且获取全服的排行榜。”

LeanCloud存储玩家分数

LeanCloud中存储数据的需要用到“对象”,文档在这里:https://leancloud.cn/docs/rest_api.html#hash735965996

如果你熟悉数据库的话,对象类似数据库中的一个表,但是这个对象没有固定的字段,不需要提前标注每个对象上有哪些 key,你你只需要随意设置键值对就可以,后端会保存它。

创建LeanCloud对象

要想使用LeanCloud的对象,可以先在LeanCloud网站的控制台创建对象,也可以不事先创建对象,而通过代码创建。

事先创建的话,可以设置权限:

写入LeanCloud对象

写入LeanCloud对象直接上代码喽:

using System;
using System.Collections;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
using Random = UnityEngine.Random;// 上传分数的Score类,用于序列化成json
[Serializable]
public class Score
{public int score;
}// 用于解析登陆后的token,这个token用来代表已登录的用户
[Serializable]
public class LoginToken{public string sessionToken;
}public class LeanCloudUser : MonoBehaviour
{public string AppId;public string AppKey;public InputField Username;public InputField Password;private string Token;public void Reg(){var jsonObj = new RegJson(){username = Username.text,password = Password.text};var json = JsonUtility.ToJson(jsonObj);Debug.Log(json);StartCoroutine(Request("/users", json));}public void Login(){var jsonObj = new RegJson(){username = Username.text,password = Password.text};var json = JsonUtility.ToJson(jsonObj);Debug.Log(json);StartCoroutine(Request("/login", json, text =>{var obj = JsonUtility.FromJson<LoginToken>(text);Token = obj.sessionToken;UploadMyScore(Random.Range(1, 100));}));}// 重构了请求的类,现在可以更好地适用各种请求IEnumerator Request(string path, string json, Action<string> cb = null){var url = "https://5jmvfx9e.api.lncld.net/1.1" + path;var www = UnityWebRequest.Put(url, json);www.method = "POST";www.SetRequestHeader("X-LC-Id", AppId);www.SetRequestHeader("X-LC-Key", AppKey);www.SetRequestHeader("Content-Type", "application/json");if (!string.IsNullOrEmpty(Token)) www.SetRequestHeader("X-LC-Session", Token);yield return www.SendWebRequest();if (www.isHttpError || www.isNetworkError){Debug.LogError(www.error);Debug.LogError(www.downloadHandler.text);}else{Debug.Log(www.downloadHandler.text);if (cb != null) cb(www.downloadHandler.text);}}// 上传分数的方法private void UploadMyScore(int score){var json = JsonUtility.ToJson(new Score(){score = score});StartCoroutine(Request("/classes/Score", json));}
}

上面的代码是基于昨天小新重构后的代码又进行了一次重构,现在可以更好地满足不同的请求了。

执行后,就可以在后台看到上传上去的分数了。

LeanCloud排行榜

现在我们有了分数了,怎么获取到排行榜的数据呢?这就需要用到LeanCloud中的对象查询。

文档在这:https://leancloud.cn/docs/rest_api.html#hash860317

排行榜的查询呢,会稍微有一些复杂, 因为我们需要根据玩家的分数进行倒序排列,并取出前10个。

由于取数据使用的HTTP方法是GET,所以需要对代码进行不小的重构,最后代码如下:

using System;
using System.Collections;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
using Random = UnityEngine.Random;// 上传分数的Score类,用于序列化成json
[Serializable]
public class Score
{public string username;public string userId;public int score;
}// 用于解析登陆后的token,这个token用来代表已登录的用户
[Serializable]
public class UserInfo{public string sessionToken;public string username;public string objectId;
}public class LeanCloudUser : MonoBehaviour
{public string AppId;public string AppKey;public InputField Username;public InputField Password;private UserInfo User;public void Reg(){var jsonObj = new RegJson(){username = Username.text,password = Password.text};var json = JsonUtility.ToJson(jsonObj);Debug.Log(json);StartCoroutine(Request("/users", "POST", json));}public void Login(){var jsonObj = new RegJson(){username = Username.text,password = Password.text};var json = JsonUtility.ToJson(jsonObj);Debug.Log(json);StartCoroutine(Request("/login", "POST", json, text =>{var obj = JsonUtility.FromJson<UserInfo>(text);User = obj;UploadMyScore(Random.Range(1, 100));}));}// 重构了请求的类,现在可以更好地适用各种请求IEnumerator Request(string path, string method = "POST", string data = "", Action<string> cb = null){var url = "https://5jmvfx9e.api.lncld.net/1.1" + path;var downloadHandler = new DownloadHandlerBuffer();UploadHandlerRaw uploadHandler = null;if (!string.IsNullOrEmpty(data))uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(data));var www = new UnityWebRequest(url, method, downloadHandler, uploadHandler);www.SetRequestHeader("X-LC-Id", AppId);www.SetRequestHeader("X-LC-Key", AppKey);www.SetRequestHeader("Content-Type", "application/json");yield return www.SendWebRequest();if (www.isHttpError || www.isNetworkError){Debug.LogError(www.error);Debug.LogError(www.downloadHandler.text);}else{Debug.Log(www.downloadHandler.text);if (cb != null) cb(www.downloadHandler.text);}}// 上传分数的方法private void UploadMyScore(int score){var json = JsonUtility.ToJson(new Score(){score = score,username = User.username,userId = User.objectId});StartCoroutine(Request("/classes/Score", "POST", json, _=>{GetLeaderboard();}));}public void GetLeaderboard(){var path = "/classes/Score?";path += "order=-score&limit=10";StartCoroutine(Request(path, "GET"));}
}

在这由于取出排行榜中的数据要用GET,终于我们没办法使用取巧的请求方式了,老老实实地改回来正常的请求方法。

总结

小新:“其实代码看下来,请求的方式都是类似的,比较重要的是先好好看懂LeanCloud的文档,然后构造相应的请求就可以了。”
大智:“没错,读文档的能力是很重要的,以后写出一份好文档的能力是更重要的。”

思考题

大智:“取到排行榜的数据以后,看看能不能显示到UI上面?”
小新:“好嘞!”
大智:“收获别忘了分享出来!也别忘了分享给你学Unity的朋友,也许能够帮到他。”

推荐阅读

  • 使用LeanCloud实现玩家注册
  • 使用LeanCloud实现玩家登陆
  • Unity开发《一起来捉妖》教程 | 1.陀螺仪控制相机
  • Unity开发《一起来捉妖》教程 | 2.用摄像头图像做背景
  • Unity2019更新规划速览,将有官方的可视化编程!
    洪流学堂公众号回复专栏,查看更多专栏文章。

《大话Unity2019》,大智带小新学Unity2019的有趣经历,让你学Unity更简单。

【专栏精选】实战:使用LeanCloud上传玩家分数,实现排行榜相关推荐

  1. Django2 Web 实战03-文件上传

    作者:Hubery 时间:2018.10.31 接上文:接上文:Django2 Web 实战02-用户注册登录退出 视频是一种可视化媒介,因此视频数据库至少应该存储图像.让用户上传文件是个很大的隐患, ...

  2. 安鸾渗透实战平台(文件上传)—— Nginx解析漏洞 (100分)

    漏洞环境 安鸾渗透实战平台 图片.一句话木马 中国蚁剑(webshell管理工具) 题目 情况分析 根据提示,是nginx解析漏洞,查一下漏洞的对应信息,发现只要在源文件后缀后加上.php即可把图片文 ...

  3. Go语言实战-通过gin上传文件到七牛云OSS

    上传到文件到七牛云的两种上传方式: 1. 客户端上传到服务器,服务器再上传到七牛云 2.客户端直接通过ajax上传到七牛云 前者:需要上传到服务器,这个过程需要消耗不少带宽,也给服务器带来不小压力,但 ...

  4. Django实战之文件上传下载

    项目介绍 最近学习django,通过文件上传下载这个小项目,总结下常用的知识点. 做这个案例我有以下需求: 1.要支持一次上传多个文件 2.支持上传后记录上传的数据以及列表展示 3.支持下载和删除文件 ...

  5. leancloud上传php源码部署,部署灵动云商到LeanCloud[图解]

    首先创建一个LeanCloud账号 常见问题 1.提示404错误 检查是不是没有将LeanCloud数据请求的域名添加小程序后台白名单,白名单设置教程参见:https://leancloud.cn/d ...

  6. python与seo实战课程百度云,第三期Python与seo实战课程已上传到B站

    ", web_code:"/怄火", style:"icon_smiley_94" },{ id:95, cn:"[转圈]", h ...

  7. 文件上传保姆级教程(原理,大小马,CTF,防御,绕狗一句话,upload-labs)

    文章目录 文件上传漏洞简历 产生原因 危害 容易出现文件上传漏洞的地方 概括 环境搭建 一句话马 一句话木马原理 webshell常用的一句话 图片一句话 小马与大马的区别 webshell管理工具 ...

  8. Javaweb_文件上传

    多看视频,自己看一遍代码,跑一遍代码,最后跟着老师的思路在理一理,最主要就学会使用! [狂神说Java]JavaWeb入门到实战_文件上传 目录 文件下载:HttpServletResponse可以实 ...

  9. 项目_功能模块_基于Spring Boot的文件上传下载功能的设计与实现

    文章目录 基于Spring Boot的文件上传下载功能模块的设计与实现 1.前言 2.技术栈 3.关键源码 4.实现效果 4.1.登录 4.2.文件列表 4.3.上传文件测试 4.3.1.测试图片 4 ...

最新文章

  1. 【Linux入门到精通系列讲解】.bashrc 文件作用
  2. JSP传递值给servlet的方式
  3. python爬虫表格中清除空格_爬虫清洗:python strip()函数 去空格\n\r\t函数的用法
  4. Effective Java之考虑自定义的序列化模式(七十五)
  5. HTML form的一些属性(第一版)
  6. python 数据类_python数据类
  7. 海归|94年的高校女博导,自曝曾两次想退学,如今获国家60万资助!
  8. 中国5G标准专利数量遥遥领先:不卖产品也获利
  9. 使用multiprocessing时的DictProxy object, typeid 'dict' at ; '__str__()' failed
  10. 使用MyEclipse开发Java EE应用:用XDoclet创建EJB 2 Session Bean项目(二)
  11. 再谈代码生成器,xml+xslt,结合扩展,用上设计模式。
  12. [收藏]判断文本框中的内容必须全为数字
  13. c# xaml语言教程,Xamarin XAML语言教程XAML文件结构与解析XAML
  14. Java基础入门,Java完全自学手册下载
  15. 精心收集17套电子课件
  16. 支付宝交易行为数据分析
  17. win10系统优化---持续整理中
  18. ArcEngine 10.2 画圆形
  19. wordpress文章页面添加版权信息的四种方法
  20. 【C++】十进制转化二进制,二进制转化十进制

热门文章

  1. 一、开始动手开发网球平台
  2. android studio 修改文件后出现类型转换错误
  3. 训练代码_无需一行代码,完成模型训练和部署,这个AI工具开始公测
  4. python数据分析多久能学会_周末深夜,学妹说她想做Python数据分析师....
  5. java esclient query_elasticsearch 口水篇(4)java客户端 - 原生esClient
  6. 本地下载mysql数据库_本地Windows上安装 MySQL数据库
  7. 斜视术后融合训练方法_做斜视手术两年后又复发了怎么办?
  8. 插画素材 | 圣诞节设计离不了!
  9. 让你的原创设计作品展示给世界|设计师的舞台
  10. 手机移动端APP引导界面设计模板素材,分层可临摹