Unity UnityWebRequest实现与后端的交互

简介: 一般我们与后端对接的时候会用到UnityWebRequest这里简单使用这个与后端进行交互这个是总类using UnityEngine;using System.Collections;using System.

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

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);
}
///
/// 传输数据
///
///
///
public void SendPost(EOPERATION op, Dictionary<string, string> dic)
{
//根据协议号获取完整路径
string url = ipAddress + mURLs[op];
StartCoroutine(Post(url, dic, op));
}

///
/// 获取数据
///
///
public void SendGet(EOPERATION op, string name = "")
{
string url = ipAddress + mURLs[op] + "/" + name;
StartCoroutine(Get(url, op, name));
}
///
/// 获取下载进度
///
///
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
{
_handersop;
}
};
}
}
//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
{
_handersop;
}
}
}
}
}
工具类

using System.IO;

public class FileTool
{
///
/// 创建文件
///
public static void CreateFile(string filePath,byte[]bytes)
{
using (FileStream fs = new FileStream(filePath,FileMode.Create,FileAccess.Write))
{
fs.Write(bytes, 0, bytes.Length);
}
}
}

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

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(data.text);

}
private void OnRspRegister(string name,DownloadHandler data)
{

}

private void OnRspDownLoad(string name,DownloadHandler data)
{
//data.data二进制的文件 视频 图片的信息
FileTool.CreateFile(name, data.data);
}

}

public void RegisterMsg(Dictionary<EOPERATION, Action<string,DownloadHandler>> handers)
{

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

更多unity2018的功能介绍请到paws3d爪爪学院查找。

相关文章
|
10天前
|
XML 存储 前端开发
后端程序员的前后端交互核心-Ajax
后端程序员的前后端交互核心-Ajax
31 6
后端程序员的前后端交互核心-Ajax
|
10天前
|
JSON JavaScript Java
后端程序员的前后端交互核心-JSON
后端程序员的前后端交互核心-JSON
24 6
|
5天前
|
图形学 iOS开发
Unity与IOS⭐最基础的交互演示
Unity与IOS⭐最基础的交互演示
|
1月前
|
前端开发 API UED
Python后端与前端交互新纪元:AJAX、Fetch API联手,打造极致用户体验!
【7月更文挑战第15天】Python后端(Django/Flask)与前端通过AJAX或Fetch API实现异步交互,提升Web应用体验。Python提供强大的后端支持,AJAX用于不刷新页面的数据交换,Fetch API作为现代标准,基于Promise简化HTTP请求。结合两者,构建高效、流畅的交互系统,优化响应速度和用户体验,开启Web开发新篇章。
36 5
|
2月前
|
前端开发 JavaScript API
探索现代Web开发中的动态数据交互——前端与后端整合实战
本文探讨了现代Web开发中前端与后端整合的关键技术点,通过实际案例演示了如何利用JavaScript和Node.js实现动态数据交互,全面解析从数据请求到响应的全过程。
118 18
|
2月前
|
前端开发 JavaScript Java
SSMP整合案例第六步 在前端页面上利用axios和element-ui与后端交互实现增删改
SSMP整合案例第六步 在前端页面上利用axios和element-ui与后端交互实现增删改
25 1
|
1月前
|
JavaScript
文本,前后端数据交互,简单请求,如何去给data数据赋值,在mounted()里赋值,利用axios发送的请求,res就是数据集,就是后端的数据,this.users = res.data.data
文本,前后端数据交互,简单请求,如何去给data数据赋值,在mounted()里赋值,利用axios发送的请求,res就是数据集,就是后端的数据,this.users = res.data.data
|
2月前
|
存储 图形学
【unity小技巧】unity事件系统创建通用的对象交互的功能
【unity小技巧】unity事件系统创建通用的对象交互的功能
26 0
|
3月前
|
JSON JavaScript 前端开发
服务器通信:使用WebSocket与后端实时交互
【4月更文挑战第24天】WebSocket为解决服务器与客户端实时双向通信问题而生,常用于聊天、游戏和实时通知等场景。本文通过4步教你实现WebSocket通信:1) 客户端使用JavaScript创建WebSocket连接;2) 监听`open`、`message`和`close`事件;3) 使用`send`方法发送数据;4) 使用`close`方法关闭连接。服务器端则需处理连接和数据发送,具体实现依后端技术而定。WebSocket为现代Web应用的实时交互提供了强大支持。
250 3
|
3月前
|
前端开发 JavaScript Java
web 技术中前端和后端交互过程
客户端:上网过程中,负责浏览资源的电脑,叫客户端
51 0