UnityWebRequest前后端交互实现过程解析
作者:liulaoc 发布时间:2021-09-07 01:24:42
标签:Unity,Web,Request,前后端,交互
一、技术概述
1、描述这个技术是做什么?
是Unity一套网络工具库,用于进行Http请求
2、学习该技术的原因?
项目需要,防止使用C#原生的网络库,加快开发速度
3、技术的难点在哪里
Unity仅提供了基础的功能,如何把这些功能构造成一个能够稳定业务开发的流程是一个比较难处理的问题
二、技术详情
描述你是如何实现和使用该技术的,要求配合代码和流程图详细描述。
HttpCenter类:封装Get、Post、Put、Delete,维护一个请求队列
///Get方法例举
private IEnumerator StartGet(HttpRequest request)
{
var url = request.Url + "?";
//反射用来填充Url
Type type = Type.GetType(request.MsgName);
var Msg = Convert.ChangeType(request.Msg, type);
PropertyInfo[] properties = Msg.GetType().GetProperties();
for (int i = 0; i < properties.Length; i++)
{
url += $"{properties[i].Name}={properties[i].GetValue(Msg)}";
if (i != properties.Length - 1)
url += "&";
}
request.Url = url;
using (UnityWebRequest www = UnityWebRequest.Get(request.Url))
{
www.certificateHandler = new AcceptAllCertificatesSignedWithASpecificKeyPublicKey();
www.downloadHandler = new DownloadHandlerBuffer();
www.SetRequestHeader("Content-Type", "application/json");
www.SetRequestHeader("token", token);
yield return www.SendWebRequest();
DealResult(www, request);
}
工程中如何使用:封装请求、数据,注册委托,调用委托并添加回调
//部分封装
public Action<LoginMsg, Action<HttpResponds>> NetLogin;
public class LoginMsg : BaseMsg
{
public LoginMsg(string username, string password)
{
this.username = username;
this.password = password;
}
public string username { get; set; }
public string password { get; set; }
}
public class HttpResponds
{
public string data;
public RespondsResult Result;
public string token;
}
//注册委托
AddListener(ref MsgManager.Instance.NetMsgCenter.NetLogin, Method.Post, "User/login");
private void AddListener<T>(ref Action<T,Action<HttpResponds>> registerEvent,Method methodType,string url) where T:BaseMsg
{
registerEvent += (request, callback) =>
{
HttpRequest httpRequest = new HttpRequest()
{
Msg = request,
HttpMethod = Method.Post,
Url = HttpCenter.path + url,
Handler = (responds) =>
{
if (responds.Result == RespondsResult.Succ)
{
try
{
callback(responds);
}
catch(Exception ex)
{
Debug.Log("窗口已销毁");
if(nowScene == 0)
{
SceneManager.LoadScene(1);
}
else
{
SceneManager.LoadScene(0);
}
}
}
}
};
HttpCenter.Instance.Send(httpRequest);
};
}
///调用,添加回调
MsgManager.Instance.NetMsgCenter.NetLogin(msg, (responds) =>
{
HttpCenter.Instance.token = responds.token;
GetUserMsg userMsg = new GetUserMsg(accountField.text);
MsgManager.Instance.NetMsgCenter.NetGetUser(userMsg, (getUserResponds) =>
{
NetDataManager.Instance.user = JsonHelper.DeserializeObject<User>(getUserResponds.data);
UIMgr.Instance.CreateFrame("PersonalFrame");
});
});
三、技术使用中遇到的问题和解决过程
关于WebRequest中有个奇怪的问题,至今未搞懂,但是有暂时的解决方法。问题是Post方法直接设置失效,需要先声明为Put,之后再www.method = UnityWebRequest.kHttpVerbPOST;
四、总结
主要是基于UnityWebRequest做了一些封装、利用反射、委托等特性来实现一些基本的功能
来源:https://www.cnblogs.com/liulaoc/p/13190963.html


猜你喜欢
- 前言:什么是JDBCJava 数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户
- Spring Security简介:Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块
- 环境:VS2019+Qt5.121. CLR库安装 &nb
- 1. 开方:Math.sqrt(x);2. x的a方:Math.pow(x,a);3. 绝对值:Math.abs(x);4. BigInte
- 一直想练习下java多线程抓取数据。有天被我发现,铃声多多的官网(http://www.shoujiduoduo.com/main/)有大量
- 插入排序原理①把所有元素分成已排序和未排序两组②找到未排序组的第一个元素,向已经排序的组中进行插入③倒序遍历已经排好的元素,依次和待插入的元
- PS:用了一下个推.感觉实现第三方应用的推送功能还是比较简单的.官方文档写的也非常的明确.学习内容:1.使用个推实现第三方应用的推送.所有的
- 我们要使用java来操作redis什么是Jedis?什么是Jedis 是Redis官方推荐的java连接开发工具!使用Java操作Redis
- 补充使用Spring Cloud Config加密功能需要下载JCE扩展,用于生成无限长度的密文。链接:http://www.oracle.
- java Swing基础教程之图形化实例代码与多线程、泛型等不同,Swing主要在于使用。 下面主要放代码和注释,少说话。(一)
- idea去掉不想commit的文件我们项目在每次commit代码时,有时候会有一些不想提交又不能删除的代码,怎么做呢?此方法亲测最方便!!!
- 1 在图片上用鼠标进行操作,opencv主要用到setMouseCallback()函数。winname 窗口名称onMouse 鼠标事件的
- 出现乱码请修改为BufferedReader br = new BufferedReader(new InputStreamReader(n
- 静态代理第一种实现(基于接口):1》接口public interface Hello { void say(String msg);}2》目
- 引言在上一节Android进阶宝典 -- NestedScroll嵌套滑动机制实现吸顶效果 中,我们通过自定义View的形式完成了TabBa
- 一. 多维数组1. 概念多维数组可以看成是数组的数组。 比如二维数组就是一个特殊的一维数组,它的每个元素都是一个一维数组。其他多维数组的概念
- 前言现在的项目一般是拆分成一个个独立的模块,当在其他项目中想要使用独立出来的这些模块,只需要在其pom.xml使用<dependenc
- 昨天看了一段android配置aspectj实现AOP的直播视频,就试着自己配置了一下,可能是因为我自己的AndroidStudio环境的问
- 一、采用Object.toString()toString方法是java.lang.Object对象的一个public方法。在java中任何
- DOM4可以读取和添加XML文件的属性或者元素读取属性:public static void ReadAttributes() throws