本文节选自洪流学堂公众号技术专栏《大话Unity2019》,未经允许不可转载。
洪流学堂公众号回复专栏
,查看更多专栏文章。
洪流学堂,让你快人几步。你好,我是郑洪智。
小新:“今天我们是不是该学习登陆了?”
大智:“没错,不过登陆我不准备给你讲,你自己学,有啥问题再问我。”
小新:“好的吧,正好考验下我自己这么多天学习的成果。”
LeanCloud的登陆
大智:“开始写代码之前,你先思考下这个问题应该如何解决,基本步骤是什么?”
小新:“我觉得按照智哥这么久对我的熏陶来说,步骤大概是这样的”
- 阅读文档,登陆的文档在这里https://leancloud.cn/docs/rest_api.html#hash964666
- 按照文档写代码,先设计个简单的UI,然后写逻辑代码
大智:“嗯,不错不错,那就开干吧”
小新阅读完文档,打开Unity。
设计UI
小新:“这个UI和昨天的注册UI是差不多一样的呢”
大智:“不错,你这审美比我好不少呢,哈哈哈”
登陆的代码
using System;
using System.Collections;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
public class LeanCloudLogin : MonoBehaviour
{
public string AppId;
public string AppKey;
public InputField Username;
public InputField Password;
public void Login()
{
StartCoroutine(LoginCo());
}
IEnumerator LoginCo(){
var jsonObj = new RegJson()
{
username = Username.text,
password = Password.text
};
// 从文档获取的url
var url = "https://5jmvfx9e.api.lncld.net/1.1/login";
var json = JsonUtility.ToJson(jsonObj);
Debug.Log(json);
// 采用昨天大智讲的取巧的办法POST json数据
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");
yield return www.SendWebRequest();
if (www.isHttpError || www.isNetworkError)
{
Debug.LogError(www.error);
Debug.LogError(www.downloadHandler.text);
}
else{
Debug.Log(www.downloadHandler.text);
}
}
}
小新:“大智,我这代码里用了你昨天说的取巧的办法来POST数据。”
得到如下结果,就说明登陆成功啦。{"sessionToken":"cc5rvs6nj5u297m6tiso5b380","updatedAt":"2019-03-24T10:35:07.212Z","objectId":"5c975d5b42cda600722b942e","username":"test","createdAt":"2019-03-24T10:35:07.212Z","emailVerified":false,"mobilePhoneVerified":false}
优化代码
大智:“你有没有发现这里有很多地方的代码,和昨天的注册是重复的?”
小新:“确实是”
大智:“那你尝试下能不能把登录和注册合并到一起,让整个流程更符合正常游戏的流程,代码也能更简洁。”
优化UI
UI改成这样,就能注册和登陆一体了。
优化代码
using System;
using System.Collections;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
public class LeanCloudUser : MonoBehaviour
{
public string AppId;
public string AppKey;
public InputField Username;
public InputField Password;
public void Reg()
{
StartCoroutine(UserCo("/users"));
}
public void Login(){
StartCoroutine(UserCo("/login"));
}
IEnumerator UserCo(string path){
var jsonObj = new RegJson()
{
username = Username.text,
password = Password.text
};
var url = "https://5jmvfx9e.api.lncld.net/1.1" + path;
var json = JsonUtility.ToJson(jsonObj);
Debug.Log(json);
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");
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的路径提取了出来,这样就可以复用绝大多数代码了,你看怎么样?”
大智:“嗯,不错不错,架构的演进是随着需求来的,所以需要不断地重构代码才能保持代码的整洁。现在代码这样就足够了,但是加入需求以后,可能这就不是最优的代码结构了。”
思考题
大智:“你再想想还能如何抽象、封装,让这个代码复用程度更高呢?”
小新:“好嘞!”
大智:“收获别忘了分享出来!也别忘了分享给你学Unity的朋友,也许能够帮到他。”
洪流学堂公众号回复专栏
,查看更多专栏文章。
《大话Unity2019》,大智带小新学Unity2019的有趣经历,让你学Unity更简单。