【专栏精选】实战:使用LeanCloud实现玩家注册

本文节选自洪流学堂公众号技术专栏《大话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中创建应用

  1. 注册LeanCloud账号:https://leancloud.cn/
  2. 创建应用:
  3. 创建完应用后,可以看到APP ID和APP Key,后面代码中需要用到。

注册登录

使用RESTful的方式时,不需要在Unity工程中导入任何的插件,我们只需要两样东西:

下面我们就开始喽。

注册

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的朋友,也许能够帮到他。”

推荐阅读


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

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

PC端入口:https://edu.hongliu.cc

发布了138 篇原创文章 · 获赞 72 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/zhenghongzhi6/article/details/90634283