【GameFramework框架内置模块】5、下载(Download)

发布于:2024-02-29 ⋅ 阅读:(140) ⋅ 点赞:(0)

推荐阅读

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新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 后查看

网站公告

今日签到

点亮在社区的每一天
去签到