//------------------------------------------------------------ // Game Framework // Copyright © 2013-2021 loyalsoft. All rights reserved. // Homepage: http://www.game7000.com/ // Feedback: http://www.game7000.com/ //------------------------------------------------------------ using GameFramework; using GameFramework.Download; using System.Collections.Generic; using UnityEngine; namespace UnityGameFramework.Runtime { /// /// 下载组件。 /// [DisallowMultipleComponent] [AddComponentMenu("Game Framework/Download")] public sealed class DownloadComponent : GameFrameworkComponent { private const int DefaultPriority = 0; private const int OneMegaBytes = 1024 * 1024; private IDownloadManager m_DownloadManager = null; private EventComponent m_EventComponent = null; [SerializeField] private Transform m_InstanceRoot = null; [SerializeField] private string m_DownloadAgentHelperTypeName = "UnityGameFramework.Runtime.UnityWebRequestDownloadAgentHelper"; [SerializeField] private DownloadAgentHelperBase m_CustomDownloadAgentHelper = null; [SerializeField] private int m_DownloadAgentHelperCount = 3; [SerializeField] private float m_Timeout = 30f; [SerializeField] private int m_FlushSize = OneMegaBytes; /// /// 获取或设置下载是否被暂停。 /// public bool Paused { get { return m_DownloadManager.Paused; } set { m_DownloadManager.Paused = value; } } /// /// 获取下载代理总数量。 /// public int TotalAgentCount { get { return m_DownloadManager.TotalAgentCount; } } /// /// 获取可用下载代理数量。 /// public int FreeAgentCount { get { return m_DownloadManager.FreeAgentCount; } } /// /// 获取工作中下载代理数量。 /// public int WorkingAgentCount { get { return m_DownloadManager.WorkingAgentCount; } } /// /// 获取等待下载任务数量。 /// public int WaitingTaskCount { get { return m_DownloadManager.WaitingTaskCount; } } /// /// 获取或设置下载超时时长,以秒为单位。 /// public float Timeout { get { return m_DownloadManager.Timeout; } set { m_DownloadManager.Timeout = m_Timeout = value; } } /// /// 获取或设置将缓冲区写入磁盘的临界大小,仅当开启断点续传时有效。 /// public int FlushSize { get { return m_DownloadManager.FlushSize; } set { m_DownloadManager.FlushSize = m_FlushSize = value; } } /// /// 获取当前下载速度。 /// public float CurrentSpeed { get { return m_DownloadManager.CurrentSpeed; } } /// /// 游戏框架组件初始化。 /// protected override void Awake() { base.Awake(); m_DownloadManager = GameFrameworkEntry.GetModule(); if (m_DownloadManager == null) { Log.Fatal("Download manager is invalid."); return; } m_DownloadManager.DownloadStart += OnDownloadStart; m_DownloadManager.DownloadUpdate += OnDownloadUpdate; m_DownloadManager.DownloadSuccess += OnDownloadSuccess; m_DownloadManager.DownloadFailure += OnDownloadFailure; m_DownloadManager.FlushSize = m_FlushSize; m_DownloadManager.Timeout = m_Timeout; } private void Start() { m_EventComponent = GameEntry.GetComponent(); if (m_EventComponent == null) { Log.Fatal("Event component is invalid."); return; } if (m_InstanceRoot == null) { m_InstanceRoot = new GameObject("Download Agent Instances").transform; m_InstanceRoot.SetParent(gameObject.transform); m_InstanceRoot.localScale = Vector3.one; } for (int i = 0; i < m_DownloadAgentHelperCount; i++) { AddDownloadAgentHelper(i); } } /// /// 根据下载任务的序列编号获取下载任务的信息。 /// /// 要获取信息的下载任务的序列编号。 /// 下载任务的信息。 public GameFramework.TaskInfo GetDownloadInfo(int serialId) { return m_DownloadManager.GetDownloadInfo(serialId); } /// /// 根据下载任务的标签获取下载任务的信息。 /// /// 要获取信息的下载任务的标签。 /// 下载任务的信息。 public GameFramework.TaskInfo[] GetDownloadInfos(string tag) { return m_DownloadManager.GetDownloadInfos(tag); } /// /// 根据下载任务的标签获取下载任务的信息。 /// /// 要获取信息的下载任务的标签。 /// 下载任务的信息。 public void GetDownloadInfos(string tag, List results) { m_DownloadManager.GetDownloadInfos(tag, results); } /// /// 获取所有下载任务的信息。 /// /// 所有下载任务的信息。 public GameFramework.TaskInfo[] GetAllDownloadInfos() { return m_DownloadManager.GetAllDownloadInfos(); } /// /// 获取所有下载任务的信息。 /// /// 所有下载任务的信息。 public void GetAllDownloadInfos(List results) { m_DownloadManager.GetAllDownloadInfos(results); } /// /// 增加下载任务。 /// /// 下载后存放路径。 /// 原始下载地址。 /// 新增下载任务的序列编号。 public int AddDownload(string downloadPath, string downloadUri) { return AddDownload(downloadPath, downloadUri, null, DefaultPriority, null); } /// /// 增加下载任务。 /// /// 下载后存放路径。 /// 原始下载地址。 /// 下载任务的标签。 /// 新增下载任务的序列编号。 public int AddDownload(string downloadPath, string downloadUri, string tag) { return AddDownload(downloadPath, downloadUri, tag, DefaultPriority, null); } /// /// 增加下载任务。 /// /// 下载后存放路径。 /// 原始下载地址。 /// 下载任务的优先级。 /// 新增下载任务的序列编号。 public int AddDownload(string downloadPath, string downloadUri, int priority) { return AddDownload(downloadPath, downloadUri, null, priority, null); } /// /// 增加下载任务。 /// /// 下载后存放路径。 /// 原始下载地址。 /// 用户自定义数据。 /// 新增下载任务的序列编号。 public int AddDownload(string downloadPath, string downloadUri, object userData) { return AddDownload(downloadPath, downloadUri, null, DefaultPriority, userData); } /// /// 增加下载任务。 /// /// 下载后存放路径。 /// 原始下载地址。 /// 下载任务的标签。 /// 下载任务的优先级。 /// 新增下载任务的序列编号。 public int AddDownload(string downloadPath, string downloadUri, string tag, int priority) { return AddDownload(downloadPath, downloadUri, tag, priority, null); } /// /// 增加下载任务。 /// /// 下载后存放路径。 /// 原始下载地址。 /// 下载任务的标签。 /// 用户自定义数据。 /// 新增下载任务的序列编号。 public int AddDownload(string downloadPath, string downloadUri, string tag, object userData) { return AddDownload(downloadPath, downloadUri, tag, DefaultPriority, userData); } /// /// 增加下载任务。 /// /// 下载后存放路径。 /// 原始下载地址。 /// 下载任务的优先级。 /// 用户自定义数据。 /// 新增下载任务的序列编号。 public int AddDownload(string downloadPath, string downloadUri, int priority, object userData) { return AddDownload(downloadPath, downloadUri, null, priority, userData); } /// /// 增加下载任务。 /// /// 下载后存放路径。 /// 原始下载地址。 /// 下载任务的标签。 /// 下载任务的优先级。 /// 用户自定义数据。 /// 新增下载任务的序列编号。 public int AddDownload(string downloadPath, string downloadUri, string tag, int priority, object userData) { return m_DownloadManager.AddDownload(downloadPath, downloadUri, tag, priority, userData); } /// /// 根据下载任务的序列编号移除下载任务。 /// /// 要移除下载任务的序列编号。 /// 是否移除下载任务成功。 public bool RemoveDownload(int serialId) { return m_DownloadManager.RemoveDownload(serialId); } /// /// 根据下载任务的标签移除下载任务。 /// /// 要移除下载任务的标签。 /// 移除下载任务的数量。 public int RemoveDownloads(string tag) { return m_DownloadManager.RemoveDownloads(tag); } /// /// 移除所有下载任务。 /// /// 移除下载任务的数量。 public int RemoveAllDownloads() { return m_DownloadManager.RemoveAllDownloads(); } /// /// 增加下载代理辅助器。 /// /// 下载代理辅助器索引。 private void AddDownloadAgentHelper(int index) { DownloadAgentHelperBase downloadAgentHelper = Helper.CreateHelper(m_DownloadAgentHelperTypeName, m_CustomDownloadAgentHelper, index); if (downloadAgentHelper == null) { Log.Error("Can not create download agent helper."); return; } downloadAgentHelper.name = Utility.Text.Format("Download Agent Helper - {0}", index.ToString()); Transform transform = downloadAgentHelper.transform; transform.SetParent(m_InstanceRoot); transform.localScale = Vector3.one; m_DownloadManager.AddDownloadAgentHelper(downloadAgentHelper); } private void OnDownloadStart(object sender, GameFramework.Download.DownloadStartEventArgs e) { m_EventComponent.Fire(this, DownloadStartEventArgs.Create(e)); } private void OnDownloadUpdate(object sender, GameFramework.Download.DownloadUpdateEventArgs e) { m_EventComponent.Fire(this, DownloadUpdateEventArgs.Create(e)); } private void OnDownloadSuccess(object sender, GameFramework.Download.DownloadSuccessEventArgs e) { m_EventComponent.Fire(this, DownloadSuccessEventArgs.Create(e)); } private void OnDownloadFailure(object sender, GameFramework.Download.DownloadFailureEventArgs e) { Log.Warning("Download failure, download serial id '{0}', download path '{1}', download uri '{2}', error message '{3}'.", e.SerialId.ToString(), e.DownloadPath, e.DownloadUri, e.ErrorMessage); m_EventComponent.Fire(this, DownloadFailureEventArgs.Create(e)); } } }