using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace TModule.Runtime { public class DownloadManager : MonoBehaviour { private List _downloadRoutines = new List(); private Queue downloadFiles = new Queue(); /// /// 最大下载器数量 /// public int m_maxCount = 5; private void Awake() { for (int i = 0; i < m_maxCount; i++) { _downloadRoutines.Add(new DownloadRoutine()); } } /// /// 暂停下载 /// /// /// public void StopDownload(string url, string savePath) { _downloadRoutines.Find(p => p.DownLoadUrl == url && p.FileSavePath == savePath)?.StopDownload(); } /// /// 暂停下载 /// /// public void StopDownload(DownloadFileInfo fileInfo) { StopDownload(fileInfo.m_url, fileInfo.m_savePath); } /// /// 暂停所有下载 /// public void StopAllDownload() { foreach (var item in _downloadRoutines) { if (!item.IsLeisure) item.StopDownload(); } } /// /// 开始下载 /// /// /// /// /// /// public void StartDownload(string url,string savePath,ActiononProgress=null,Action onOver=null,Action onError=null) { StartDownload(new DownloadFileInfo { m_savePath = savePath, m_url = url, onErroe = onError, onOver = onOver, onProgress = onProgress }); } /// /// 开始下载 /// /// public void StartDownload(DownloadFileInfo fileInfo) { DownloadRoutine routine = GetLeisureDownloadRoutine(); if (routine == null) downloadFiles.Enqueue(fileInfo); else { routine.onProgress = fileInfo.onProgress; routine.onDownloadOver = ()=> { fileInfo.onOver?.Invoke(); CheckIsOver();}; routine.onError = fileInfo.onErroe; routine.StartDownload(fileInfo.m_url, fileInfo.m_savePath); } } /// /// 批量下载 /// /// public void BatchDownload(IEnumerable fileInfos) { foreach (var item in fileInfos) { StartDownload(item); } } /// /// 继续下载 /// /// /// public void ContinueDownload(string url,string savePath) { _downloadRoutines.Find(p => p.DownLoadUrl == url && p.FileSavePath == savePath)?.ContinueDownload(); } /// /// 继续下载 /// /// public void ContinueDownload(DownloadFileInfo fileInfo) { ContinueDownload(fileInfo.m_url, fileInfo.m_savePath); } /// /// 全部继续下载 /// public void ContinueAllDownload() { foreach (var item in _downloadRoutines) { if (!item.IsLeisure && item.IsStop) item.ContinueDownload(); } } private void CheckIsOver() { lock(downloadFiles) { if (downloadFiles.Count > 0) { StartDownload(downloadFiles.Dequeue()); } } } /// /// 获取空闲下载器 /// /// private DownloadRoutine GetLeisureDownloadRoutine() { return _downloadRoutines.Find(p => p.IsLeisure); } } }