php作为unity的后端,UnityWebRequest进行前后端交互(示例代码)

一、技术概述

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> 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(ref Action> 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(getUserResponds.data);

UIMgr.Instance.CreateFrame("PersonalFrame");

});

});

三、技术使用中遇到的问题和解决过程

关于WebRequest中有个奇怪的问题,至今未搞懂,但是有暂时的解决方法。问题是Post方法直接设置失效,需要先声明为Put,之后再www.method = UnityWebRequest.kHttpVerbPOST;

四、总结

主要是基于UnityWebRequest做了一些封装、利用反射、委托等特性来实现一些基本的功能

五、参考文献:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值