推荐阅读
大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
一、前言
【GameFramework框架】系列教程目录:
https://blog.csdn.net/q764424567/article/details/135831551
二、正文
2-1、介绍
下载(Download)是GF框架封装的一个UnityWebRequest下载器。
可以用来下载图片、视频、json文件等,支持断点续传,功能强大。
2-2、使用说明
示例代码:
using GameFramework.Event;
using UnityEngine;
using UnityGameFramework.Runtime;
using GameEntry = StarForce.GameEntry;
public class DownloadDemo : MonoBehaviour
{
private void OnEnable()
{
GameEntry.Event.Subscribe(DownloadStartEventArgs.EventId, OnDownloadStart);
GameEntry.Event.Subscribe(DownloadSuccessEventArgs.EventId, OnDownloadSuccess);
GameEntry.Event.Subscribe(DownloadFailureEventArgs.EventId, OnDownloadFailure);
GameEntry.Event.Subscribe(DownloadUpdateEventArgs.EventId, OnDownloadUpdate);
}
private void OnDisable()
{
GameEntry.Event.Unsubscribe(DownloadStartEventArgs.EventId, OnDownloadStart);
GameEntry.Event.Unsubscribe(DownloadSuccessEventArgs.EventId, OnDownloadSuccess);
GameEntry.Event.Unsubscribe(DownloadFailureEventArgs.EventId, OnDownloadFailure);
GameEntry.Event.Unsubscribe(DownloadUpdateEventArgs.EventId, OnDownloadUpdate);
}
private void Start()
{
DownloadTest("TestImg.png", "http://xxxx.TestImg.png");
DownloadTest("TestAudio.mp3", "http://xxxx.TestAudio.mp3");
DownloadTest("TestDat.dat", "http://xxxx.TestDat.dat");
}
protected void DownloadTest(string url, string fileName)
{
GameEntry.Download.AddDownload(Application.persistentDataPath + "/" + fileName, url);
}
private void OnDownloadStart(object sender, GameEventArgs e)
{
Debug.Log("下载开始");
}
private void OnDownloadSuccess(object sender, GameEventArgs e)
{
Debug.Log("下载成功");
}
private void OnDownloadFailure(object sender, GameEventArgs e)
{
Debug.Log("下载失败");
}
private void OnDownloadUpdate(object sender, GameEventArgs e)
{
Debug.Log("下载更新进度");
}
}
运行结果:

2-3、实现及代码分析
DownloadManager.cs
DownloadManager是下载框架的管理器,负责管理下载任务,核心实现是任务池,用来存储执行下载任务。
/// 下载管理器。
internal sealed partial class DownloadManager : GameFrameworkModule, IDownloadManager
{
private readonly TaskPool<DownloadTask> m_TaskPool;//下载任务
private readonly DownloadCounter m_DownloadCounter;//下载计数器
/// 增加下载代理辅助器。
public void AddDownloadAgentHelper(IDownloadAgentHelper downloadAgentHelper);
/// 增加下载任务。
public int AddDownload(string downloadPath, string downloadUri, int priority, object userData);
}
DownloadTask.cs
DownloadTask是单个下载任务,存储了一次下载的所有变量信息,但自身并不执行下载,而是委托给了Agent代理进行下载,是一种代理模式的实现。
/// 下载任务。
private sealed class DownloadTask : TaskBase
{
private static int s_Serial = 0;
private DownloadTaskStatus m_Status;/// 获取或设置下载任务的状态。
private string m_DownloadPath;/// 获取下载后存放路径。
private string m_DownloadUri;/// 获取原始下载地址。
private int m_FlushSize;/// 获取将缓冲区写入磁盘的临界大小。
private float m_Timeout;/// 获取下载超时时长,以秒为单位。
private object m_UserData;/// 获取用户自定义数据。
/// 创建下载任务。
public static DownloadTask Create(string downloadPath, string downloadUri, int priority, int flushSize, float timeout, object userData);
}
/// 下载代理。
private sealed class DownloadAgent : ITaskAgent<DownloadTask>, IDisposable
{
private readonly IDownloadAgentHelper m_Helper;
private DownloadTask m_Task;
/// 开始处理下载任务。
public StartTaskStatus Start(DownloadTask task)
{
m_Task = task;
m_Helper.Download(m_Task.DownloadUri, m_Task.UserData);
return StartTaskStatus.CanResume;
}
}
m_Helper.cs
m_Helper是下载服务器即UnityWebRequestDownloadAgentHelper,这个类就是GF框架让开发者可以拓展的一个类,UGF框架中封装的是一个UnityWebRequest:
/// 使用 UnityWebRequest 实现的下载代理辅助器。
public partial class UnityWebRequestDownloadAgentHelper : DownloadAgentHelperBase, IDisposable
{
private UnityWebRequest m_UnityWebRequest = null;
/// 通过下载代理辅助器下载指定地址的数据。
public override void Download(string downloadUri, object userData)
{
m_UnityWebRequest = new UnityWebRequest(downloadUri);
m_UnityWebRequest.downloadHandler = new DownloadHandler(this);
m_UnityWebRequest.SendWebRequest();
}
}
三、后记
如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多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和坑,让后来人可以有些参考。 |
本文含有隐藏内容,请 开通VIP 后查看