本文节选自洪流学堂公众号技术专栏《大话Unity2019》,未经允许不可转载。
洪流学堂公众号回复专栏
,查看更多专栏文章。
洪流学堂,让你快人几步。你好,我是郑洪智。
小新:“大智,如果像开发一个带网络的游戏,是不是客户端和服务器都得会写啊?”
大智:“没错,对于网络游戏来说,不管是强联网的多人在线游戏,还是弱联网的休闲卡牌游戏,客户端和服务器是密不可分的。”
小新:“那像我这种不会服务端开发的怎么办呢?”
大智:“这个好办,当然是学喽”
小新:“那智哥你的任务可就重喽,我可能出不了师了,嘿嘿”
大智:“咳咳,其实也有别的办法,就是使用云服务。对于一些简单的数据存储,使用云服务就足够了,但是对于特殊复杂的游戏业务和逻辑,还是需要自己来写服务器的。”
小新:“那你可不可以先教一教我怎么使用云服务?”
大智:“好,还真有这么一个云服务,直接支持Unity的,名字是LeanCloud。后面两天和你一起学注册登录和排行榜的功能,其他功能就靠你自己去探索咯。”
LeanCloud
LeanCloud(https://leancloud.cn/)是一个后端云服务,可以提供包括数据存储、文件存储与 CDN、消息推送和实时通信在内的后端云服务,同时提供支撑后端代码的云引擎和云函数等开发工具,能全面涵盖移动开发的需求;同时也提供了易于集成的全平台 SDK,支持 iOS、Android 应用和游戏开发,以及包括微信小程序在内的 web 开发。
可以帮开发者摆脱繁重的后端开发负担,最大限度地降低开发成本、缩短开发周期、加快迭代速度。
在Unity中使用
在Unity中使用LeanCloud,有两种方式:
- 使用LeanCloud提供的SDK包,简单,唯一的缺陷就是不能用于WebGL平台(原因是SDK包中使用了.Net中的Task,需要多线程支持,而WebGL不支持多线程)。
- 使用LeanCloud提供的RESTful API,不受平台限制,但是接口需要自己封装。
后面我们会使用RESTful的方式,让你更了解HTTP的请求,如果你想用SDK的方式,请参照LeanCloud的文档自行探索。
LeanCloud中创建应用
- 注册LeanCloud账号:https://leancloud.cn/
- 创建应用:
- 创建完应用后,可以看到APP ID和APP Key,后面代码中需要用到。
注册登录
使用RESTful的方式时,不需要在Unity工程中导入任何的插件,我们只需要两样东西:
- 阅读LeanCloud的文档(https://leancloud.cn/docs/rest_api.html#hash964666)
- 熟悉Unity的WebRequest
下面我们就开始喽。
注册
LeanCloud中提供了两种注册方式,一种是使用用户名+密码的方式注册(可绑定邮箱,免费),一种是使用手机号+验证码的方式注册(验证码收费)。
下面我们以用户名+密码的方式注册,手机号注册的方式你可以自行探索哦。
注册界面UI
首先设置一个简单的界面,用来填写用户名和密码。
注册的代码
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
[Serializable]
class RegJson
{
public string username;
public string password;
}
public class LeanCloudReg : MonoBehaviour
{
public string AppId;
public string AppKey;
public InputField Username;
public InputField Password;
// Update is called once per frame
public void Reg()
{
StartCoroutine(RegCo());
}
IEnumerator RegCo(){
var jsonObj = new RegJson()
{
username = Username.text,
password = Password.text
};
// 注意这个url不是通用的,每个用户不一样
var url = "https://5jmvfx9e.api.lncld.net/1.1/users";
var json = JsonUtility.ToJson(jsonObj);
Debug.Log(json);
var www = UnityWebRequest.Post(url, json);
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);
}
}
}
上面代码中有一个url,注意这个url,你的和我的是不一样的,那怎么知道你的url是什么呢?
如果你看了LeanCloud的文档,并且在看文档的时候登陆了,文档中的例子会自动显示你的应用对应的url:
上面就是整个注册流程的代码,记得在按钮上绑定这个Reg方法。
修改BUG
现在可以运行这个代码啦,不过你会发现这里面有个大坑。
{"code":107,"error":"Malformed json object. A json dictionary is expected."}
这是为什么呢?
好,现在按个暂停键,先不要往下看,建议你先自己尝试搜索解决下这个问题。
不知道你是否找到问题的原因了呢?
这个问题可以算是Unity的一个BUG,Unity的WebRequest的POST方法在设计上只能发送表单数据,也就是说无法发送上面设置的json格式内容的数据。
解决这个问题有两种办法,一种是常规办法,一种是取巧的办法。
常规的办法是用UnityWebRequest底层的API来发送请求,代码如下:
var www = new UnityWebRequest(url, "POST");
byte[] bodyRaw = Encoding.UTF8.GetBytes(json);
www.uploadHandler = new UploadHandlerRaw(bodyRaw);
www.downloadHandler = new DownloadHandlerBuffer();
www.SetRequestHeader("X-LC-Id", AppId);
www.SetRequestHeader("X-LC-Key", AppKey);
www.SetRequestHeader("Content-Type", "application/json");
yield return www.SendWebRequest();
还有一种是取巧的办法,通过PUT方法来构造请求,把请求method改为POST,代码如下:
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");
到这里,再请求就可以获取到请求的结果了。
总结
大智:“互联网上有很多云服务,可以助力我们快速地实现一些功能,如果用得好可以节省时间和成本呢。”。
思考题
大智:“试一试LeanCloud的手机注册吧。”
小新:“好嘞!”
大智:“收获别忘了分享出来!也别忘了分享给你学Unity的朋友,也许能够帮到他。”
推荐阅读
- Unity开发《一起来捉妖》教程 | 2.用摄像头图像做背景
- Unity开发《一起来捉妖》教程 | 1.陀螺仪控制相机
- Unity 2019.1 中文更新日志速览版
- Unity中编码Encoding脱坑指南
- Unity中的Git最佳实践
- Unity2019更新规划速览,将有官方的可视化编程!
- Unity运行时更新带来了什么?
- Unity2018.3新功能 | Prefab嵌套和变体
洪流学堂公众号回复专栏
,查看更多专栏文章。
《大话Unity2019》,大智带小新学Unity2019的有趣经历,让你学Unity更简单。
PC端入口:https://edu.hongliu.cc