推荐阅读
- CSDN主页
- GitHub开源地址
- Unity3D插件分享
- 简书地址
- QQ群:398291828
大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
一、前言
【GameFramework框架】系列教程目录:
https://blog.csdn.net/q764424567/article/details/135831551
二、正文
2-1、介绍
Web请求(Web Request)
提供使用短连接的功能,可以使用Get或者Post方法向服务器发送请求并响应数据,可以指定几个Web请求器进行同时请求。
2-2、使用说明
使用也很方便,增加请求WebRequest.AddWebRequest
,设置监听事件,下面是一个示例代码:
using System;
using GameFramework;
using UnityGameFramework.Runtime;
using GameFramework.Event;
using ProcedureOwner = GameFramework.Fsm.IFsm<GameFramework.Procedure.IProcedureManager>;
namespace StarForce
{
public class ProcedureWeb : ProcedureBase
{
public override bool UseNativeDialog => throw new NotImplementedException();
protected override void OnEnter(ProcedureOwner procedureOwner)
{
base.OnEnter(procedureOwner);
GameEntry.Event.Subscribe(WebRequestSuccessEventArgs.EventId, OnWebRequestSuccess);
GameEntry.Event.Subscribe(WebRequestFailureEventArgs.EventId, OnWebRequestFailure);
string url = "https://blog.csdn.net/q764424567";
GameEntry.WebRequest.AddWebRequest(url, this);
}
protected override void OnLeave(ProcedureOwner procedureOwner, bool isShutdown)
{
base.OnLeave(procedureOwner, isShutdown);
GameEntry.Event.Unsubscribe(WebRequestSuccessEventArgs.EventId, OnWebRequestSuccess);
GameEntry.Event.Unsubscribe(WebRequestFailureEventArgs.EventId, OnWebRequestFailure);
}
private void OnWebRequestSuccess(object sender, GameEventArgs e)
{
WebRequestSuccessEventArgs ne = (WebRequestSuccessEventArgs)e;
// 获取回应的数据
string responseJson = Utility.Converter.GetString(ne.GetWebResponseBytes());
Log.Debug("responseJson:" + responseJson);
}
private void OnWebRequestFailure(object sender, GameEventArgs e)
{
Log.Warning("请求失败");
}
}
}
设置流程:
给Game Framework对象添加GameEntry.cs脚本组件:
运行程序:
2-3、实现及代码分析
(1)WebRequestComponent.cs
WebRequest
组件,对GameFramework
框架的WebRequestManager
的封装,负责WebRequestManager
初始化和方法的封装调用:
using GameFramework;
using GameFramework.WebRequest;
using System.Collections.Generic;
using UnityEngine;
namespace UnityGameFramework.Runtime
{
/// <summary>
/// Web 请求组件。
/// </summary>
[DisallowMultipleComponent]
[AddComponentMenu("Game Framework/Web Request")]
public sealed class WebRequestComponent : GameFrameworkComponent
{
// WebRequestManager Web请求管理器
private IWebRequestManager m_WebRequestManager = null;
// 事件组件
private EventComponent m_EventComponent = null;
// WebRequest的AgentHelper
[SerializeField]
private WebRequestAgentHelperBase m_CustomWebRequestAgentHelper = null;
/// <summary>
/// 增加 Web 请求任务。
/// </summary>
/// <param name="webRequestUri">Web 请求地址。</param>
/// <returns>新增 Web 请求任务的序列编号。</returns>
public int AddWebRequest(string webRequestUri){}
}
}
(2)WebRequestManager.cs
WebRequestManager
是WebRequest
的总管理器,负责WebRequest
请求的增加、清理、设置代理辅助器等。
using System;
using System.Collections.Generic;
namespace GameFramework.WebRequest
{
/// <summary>
/// Web 请求管理器。
/// </summary>
internal sealed partial class WebRequestManager : GameFrameworkModule, IWebRequestManager
{
// 任务池
private readonly TaskPool<WebRequestTask> m_TaskPool;
private float m_Timeout;
private EventHandler<WebRequestStartEventArgs> m_WebRequestStartEventHandler;
private EventHandler<WebRequestSuccessEventArgs> m_WebRequestSuccessEventHandler;
private EventHandler<WebRequestFailureEventArgs> m_WebRequestFailureEventHandler;
/// <summary>
/// Web 请求开始事件。
/// </summary>
public event EventHandler<WebRequestStartEventArgs> WebRequestStart{}
/// <summary>
/// Web 请求成功事件。
/// </summary>
public event EventHandler<WebRequestSuccessEventArgs> WebRequestSuccess{}
/// <summary>
/// Web 请求失败事件。
/// </summary>
public event EventHandler<WebRequestFailureEventArgs> WebRequestFailure{}
/// <summary>
/// Web 请求管理器轮询。
/// </summary>
/// <param name="elapseSeconds">逻辑流逝时间,以秒为单位。</param>
/// <param name="realElapseSeconds">真实流逝时间,以秒为单位。</param>
internal override void Update(float elapseSeconds, float realElapseSeconds)
{
m_TaskPool.Update(elapseSeconds, realElapseSeconds);
}
/// <summary>
/// 关闭并清理 Web 请求管理器。
/// </summary>
internal override void Shutdown()
{
m_TaskPool.Shutdown();
}
/// <summary>
/// 增加 Web 请求代理辅助器。
/// </summary>
/// <param name="webRequestAgentHelper">要增加的 Web 请求代理辅助器。</param>
public void AddWebRequestAgentHelper(IWebRequestAgentHelper webRequestAgentHelper)
{
WebRequestAgent agent = new WebRequestAgent(webRequestAgentHelper);
agent.WebRequestAgentStart += OnWebRequestAgentStart;
agent.WebRequestAgentSuccess += OnWebRequestAgentSuccess;
agent.WebRequestAgentFailure += OnWebRequestAgentFailure;
m_TaskPool.AddAgent(agent);
}
/// <summary>
/// 增加 Web 请求任务。
/// </summary>
/// <param name="webRequestUri">Web 请求地址。</param>
/// <returns>新增 Web 请求任务的序列编号。</returns>
public int AddWebRequest(string webRequestUri)
{
return AddWebRequest(webRequestUri, null, null, Constant.DefaultPriority, null);
}
/// <summary>
/// 增加 Web 请求任务。
/// </summary>
/// <param name="webRequestUri">Web 请求地址。</param>
/// <param name="postData">要发送的数据流。</param>
/// <param name="tag">Web 请求任务的标签。</param>
/// <param name="priority">Web 请求任务的优先级。</param>
/// <param name="userData">用户自定义数据。</param>
/// <returns>新增 Web 请求任务的序列编号。</returns>
public int AddWebRequest(string webRequestUri, byte[] postData, string tag, int priority, object userData)
{
if (string.IsNullOrEmpty(webRequestUri))
{
throw new GameFrameworkException("Web request uri is invalid.");
}
if (TotalAgentCount <= 0)
{
throw new GameFrameworkException("You must add web request agent first.");
}
WebRequestTask webRequestTask = WebRequestTask.Create(webRequestUri, postData, tag, priority, m_Timeout, userData);
m_TaskPool.AddTask(webRequestTask);
return webRequestTask.SerialId;
}
}
}
总结一下:
当我们使用WebRequest
组件请求一个地址的时候,会先将这个任务添加到任务池TaskPool
中,然后等待任务池执行任务。
设置监听事件,回调成功或者失败的消息。
三、后记
如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多Unity干货文章。
你的点赞就是对博主的支持,有问题记得留言:
博主主页有联系方式。
博主还有跟多宝藏文章等待你的发掘哦:
专栏 | 方向 | 简介 |
---|---|---|
Unity3D开发小游戏 | 小游戏开发教程 | 分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。 |
Unity3D从入门到进阶 | 入门 | 从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。 |
Unity3D之UGUI | UGUI | Unity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。 |
Unity3D之读取数据 | 文件读取 | 使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。 |
Unity3D之数据集合 | 数据集合 | 数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。 |
Unity3D之VR/AR(虚拟仿真)开发 | 虚拟仿真 | 总结博主工作常见的虚拟仿真需求进行案例讲解。 |
Unity3D之插件 | 插件 | 主要分享在Unity开发中用到的一些插件使用方法,插件介绍等 |
Unity3D之日常开发 | 日常记录 | 主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等 |
Unity3D之日常BUG | 日常记录 | 记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。 |