我是靠谱客的博主 贤惠鸡翅,这篇文章主要介绍Unity UnityWebRequest实现与后端的交互,现在分享给大家,希望可以做个参考。

一般我们与后端对接的时候会用到UnityWebRequest
这里简单使用这个与后端进行交互
这个是总类

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
using UnityEngine; using System.Collections; using System.Collections.Generic; using System; using UnityEngine.Networking; public enum EOPERATION { LOGIN = 0,//登录 REGISTER,//注册 COLLEGELIST, //学院 MAJORLIST, //专业 CLASSLIST,//班级 EXISTMAIL,//邮箱重复验证 EXISTNUMBER, //学号重复验证 GETPASSWORD,//忘记密码 ADDSCORE,//添加成绩 DownLoad, } public class CallBackUser { public bool success; public string msg; public User obj; } public class WebWork : MonoBehaviour { Dictionary<EOPERATION, Action<string, DownloadHandler>> _handers = new Dictionary<EOPERATION, Action<string, DownloadHandler>>(); private string filepath; bool isStartDownload; UnityWebRequest request; //根据协议号获取地址后缀 Dictionary<EOPERATION, string> mURLs = new Dictionary<EOPERATION, string>{ { EOPERATION.LOGIN,"webapi/login" }, { EOPERATION.REGISTER,"webapi/register"}, { EOPERATION.COLLEGELIST,"user/college/list_combo"}, { EOPERATION.MAJORLIST,"user/major/list_combo"}, { EOPERATION.CLASSLIST,"user/class/list_combo"}, { EOPERATION.EXISTMAIL,"webapi/existemail"}, { EOPERATION.EXISTNUMBER,"webapi/existnumber"}, {EOPERATION.GETPASSWORD, "webapi/forget_pass"}, {EOPERATION.ADDSCORE,"webapi/add_score"}, {EOPERATION.DownLoad,"" } }; private string ipAddress = "http://192.168.40.153:8000/"; AccountHander accountHander = new AccountHander(); public object JsonConvert { get; private set; } //在这里注册消息返回后分发处理 public void Init() { accountHander.RegisterMsg(_handers); DontDestroyOnLoad(this); } /// <summary> /// 传输数据 /// </summary> /// <param name="dic"></param> /// <param name="op"></param> public void SendPost(EOPERATION op, Dictionary<string, string> dic) { //根据协议号获取完整路径 string url = ipAddress + mURLs[op]; StartCoroutine(Post(url, dic, op)); } /// <summary> /// 获取数据 /// </summary> /// <param name="op"></param> public void SendGet(EOPERATION op, string name = "") { string url = ipAddress + mURLs[op] + "/" + name; StartCoroutine(Get(url, op, name)); } /// <summary> /// 获取下载进度 /// </summary> /// <returns></returns> public float GetProgress() { if (request == null || !isStartDownload) return 0; return request.downloadProgress; } private IEnumerator Get(string url, EOPERATION op, string name) { if (!string.IsNullOrEmpty(url)) { using (request = UnityWebRequest.Get(url)) { isStartDownload = true; //设置超时 链接超时返回 且isNetworkError为true request.timeout = 30; yield return request.SendWebRequest(); isStartDownload = false; //结果回传给具体实现 if (request.isHttpError || request.isNetworkError) { Debug.Log(request.error); } else { _handers[op](name, request.downloadHandler); } }; } } //private WWW http; private IEnumerator Post(string url, Dictionary<string, string> dic, EOPERATION op) { if (!string.IsNullOrEmpty(url)) { WWWForm form = new WWWForm(); foreach (var item in dic) { form.AddField(item.Key, item.Value); } using (request = UnityWebRequest.Post(url, form)) { yield return request.SendWebRequest(); //结果回传给具体实现 if (request.isHttpError || request.isNetworkError) { Debug.Log(request.error); } else { _handers[op](name, request.downloadHandler); } } } } }

工具类

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System.IO; public class FileTool { /// <summary> /// 创建文件 /// </summary> public static void CreateFile(string filePath,byte[]bytes) { using (FileStream fs = new FileStream(filePath,FileMode.Create,FileAccess.Write)) { fs.Write(bytes, 0, bytes.Length); } } }

消息返回处理类 这只是一个分类

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using Newtonsoft.Json; using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; public class AccountHander { public void RegisterMsg(Dictionary<EOPERATION, Action<string,DownloadHandler>> handers) { handers.Add(EOPERATION.LOGIN, OnRspLogin); handers.Add(EOPERATION.REGISTER, OnRspRegister); handers.Add(EOPERATION.DownLoad, OnRspDownLoad); } private void OnRspLogin(string name,DownloadHandler data) { //用Json转化为类内部数据 JsonConvert.DeserializeObject<CallBackUser>(data.text); } private void OnRspRegister(string name,DownloadHandler data) { } private void OnRspDownLoad(string name,DownloadHandler data) { //data.data二进制的文件 视频 图片的信息 FileTool.CreateFile(name, data.data); } }
复制代码
1
2
3
4
5
public void RegisterMsg(Dictionary<EOPERATION, Action<string,DownloadHandler>> handers) { }

如果想添加一个新的就在主类Init里注册 然后新类写一个注册方法就行了 这样会自动根据枚举转到相应的处理函数
然后name的话只是为了区分下载文件起码要改名吧 不然不知道名字 如果只是传数据可以无视name不调用
来用一个demo使用下

更多unity2018的功能介绍请到paws3d爪爪学院查找。链接https://www.paws3d.com/,也可以加入unity学习讨论群935714213

近期更有资深开发人士直播分享unity开发经验,详情请进入官网或加入QQ群了解
 

最后

以上就是贤惠鸡翅最近收集整理的关于Unity UnityWebRequest实现与后端的交互的全部内容,更多相关Unity内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(76)

评论列表共有 0 条评论

立即
投稿
返回
顶部