在Unity中使用UnityWebRequest和LitJson

记录工作中第一个Unity项目用到的知识点,使用UnityWebRequest和LitJson

进入新公司已经一个月了,终于接到了第一个项目:需求也比较简单,把之前做好的一个桌面端的项目迁移到网页端,也就是WebGL端。主要解决的问题是改变存档的保存方式,之前是保存在本地,而网页端需要存储在服务器上。记录下所用到的几个知识点

UnityWebRequest

之前只用过.Net的HttpWebRequest方法来做HTTP请求,说实话有点麻烦。Unity倒是提供了稍微简单一些的工具类,之前公司用的是比较旧的WWW,查了下好像已经弃用了。于是使用了比较新的UnityWebRequest,话不多说贴个简单的请求案例:
该例中,在存档界面向服务器发送Get请求,然后保存收到的存档数据

public awake(){
    //由于是异步操作 所以通过协程调用
    StartCoroutine(GetUserData());
}


public static IEnumerator GetUserData()
{
    //创建UnityWebRequest对象 设置请求方式和请求地址,该例中加了userid作为参数
    UnityWebRequest uwr = UnityWebRequest.Get("http://127.0.0.1:80/user/data/" + Global.UserID );

    //等待消息发送成功
    yield return uwr.SendWebRequest();                         

    //请求失败,或是网络错误 如404
    if (uwr.isHttpError || uwr.isNetworkError)                       
    {
        Debug.Log(uwr.error); //打印错误原因
    }
    else //请求成功 一般是200
    {
        //uwr.downloadHandler.text 收到的string类型数据,转换为json
        JsonData data  = JsonMapper.ToObject(uwr.downloadHandler.text);
        int code = int.Parse(data["code"].ToString());

        //用code标识请求是否出错,例如没有该userid
        if (code > 0)
        {
            Debug.Log("Post:请求用户存档失败:" + data["msg"].ToString());
        }
        else
        {
            Debug.Log("Post:请求用户存档成功");
            //进行数据保存业务
        }
    }
}

LitJson

一般C#项目中可能会使用Newtonsoft.Json,据说是LitJson对Web端兼容性好就选择了LitJson作为json解析工具。和一般的json类似,LitJson可以把string类型的json数据和对象之间互相转换,也提供默认的解析对象供使用,总体来说体验还不错,但是要注意WebGL端LitJson对于json解析的错误判定更严格。

其实任何涉及前后端的项目都会遇到json解析的问题,我在测试环境下,使用Go语言作为后端,可以轻松解析json或者form数据。但是在公司的生产环境下,却一直不能解析我发过去的json数据,最后无奈选择了form,不过LitJson倒是可以正常解析收到的数据。

简单用法:

//基础用法一
//JsonMapper.ToObject(string text) 解析string字符串 — 转换为JsonData对象(包里默认提供的解析类)
JsonData data  = JsonMapper.ToObject(uwr.downloadHandler.text);

//通过JsonData[key]的方式可以层层读取数据,可以使用遍历
Debug.Log(data["name"].ToString());

//基础用法二
//JsonMapper.ToObject<T A>(string text) 解析string类型的json数据 — 转换为任意对象
A a  = JsonMapper.ToObject<A>(uwr.downloadHandler.text);

//自定义类要和string中的json结构匹配
Debug.Log(a.name);


//基础用法三
//JsonMapper.ToJson(A a) 解析对象 — string类型的json数据
A a = new A();
a.name = "liu";
string json  = JsonMapper.ToJson(a);

//生成类似{"id":7,"userid":54,"name":"liu"}的json数据
Debug.Log(json);

简单总结

其实虽然是个看似简单的迁移工作,因为项目比较大(主要是脚本写的有点乱。。。)迁移过程中出现了很多BUG:如UI偏移、字体消失、以及一些逻辑错误。也遇到了一些困难:比如生成实验报告在新的html中打开等,经历了大概一周的工作,算是比较好的完成了这次工作,也从中学习积累了一些经验知识,于我而言是一个好的开始。

Licensed under CC BY-NC-SA 4.0
加载中...
感谢Jimmy 隐私政策