obsidian/笔记文件/2.笔记/Task 多任务 下载和解压.md
2025-03-26 00:02:56 +08:00

3.0 KiB

#unity/代码缓存

SDKEditor

using UnityEngine.Networking;  
using UnityEditor;  
using UnityEngine;  
using System.Threading.Tasks;  
using System.IO;  
using System.IO.Compression;  
  
public class SDKEditor : EditorWindow  
{  
    private static SDKEditor _sdkEditor;  
    
    [MenuItem("SDK/SDK编辑器",false)]  
    public static void ShowSDKEditorWindow()  
    {        
        _sdkEditor = (SDKEditor)GetWindowWithRect(typeof(SDKEditor),new Rect(0,0,550,820),false,"SDK编辑器");  
        _sdkEditor.Show();  
    }  
    
    // 假设这些是我们需要下载的文件的URL
    private string[] fileUrls = 
    {
        "http://192.168.2.154/XPackage_Data/XPackage/Library/UniTask.zip", // 替换为实际的URL
        "http://192.168.2.154/XPackage_Data/XPackage/Library/XAsset.zip",
        "http://192.168.2.154/XPackage_Data/XPackage/Library/LiteHTTP.zip",
    };

    // 下载并解压多个文件
    private async void Start()
    {
        await DownloadAndExtractFilesAsync(fileUrls);
    }

    // 异步下载并解压所有文件
    public async Task DownloadAndExtractFilesAsync(string[] urls)
    {
        // 逐个下载文件
        foreach (var url in urls)
        {
            string filePath = await DownloadFileAsync(url);
            if (filePath != null)
            {
                // 解压下载的文件
                await ExtractZipAsync(filePath);
            }
        }
    }

    // 下载文件并返回本地路径
    public async Task<string> DownloadFileAsync(string url)
    {
        string fileName = Path.GetFileName(url);
        string filePath = Path.Combine(Application.persistentDataPath, fileName);

        UnityWebRequest request = UnityWebRequest.Get(url);
        var operation = request.SendWebRequest();

        while (!operation.isDone)
        {
            await Task.Yield();  // 让任务异步等待
        }

        if (request.result == UnityWebRequest.Result.Success)
        {
            // 保存文件
            File.WriteAllBytes(filePath, request.downloadHandler.data);
            Debug.Log($"Downloaded file: {fileName}");
            return filePath;
        }
        else
        {
            Debug.LogError($"Failed to download {url}: {request.error}");
            return null;
        }
    }

    // 解压zip文件
    public async Task ExtractZipAsync(string filePath)
    {
        // 创建一个目标解压目录
        string extractPath = Path.Combine(Application.persistentDataPath, Path.GetFileNameWithoutExtension(filePath));
        if (!Directory.Exists(extractPath))
        {
            Directory.CreateDirectory(extractPath);
        }

        // 异步解压
        await Task.Run(() =>
        {
            ZipFile.ExtractToDirectory(filePath, extractPath);
            Debug.Log($"Extracted to: {extractPath}");
        });
    }
  
    private void OnGUI()  
    {        
        if (GUILayout.Button("Add", GUILayout.Width(100)))
        {
            Start();
        }  
    }
}