You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中如何将Asset Bundle直接上传至远程服务器

Unity AssetBundle 构建后自动上传远程服务器实现方案

前置要求

远程服务器需先部署支持multipart/form-data格式的文件上传POST接口,提前准备好接口地址、鉴权信息(如有)。

实现逻辑

  • 先执行本地AssetBundle构建,校验构建结果是否成功
  • 遍历构建输出目录下的所有AB文件,过滤不需要上传的manifest、meta文件
  • 构造POST表单请求,携带文件、平台、版本等自定义信息上传至服务器
  • 增加进度提示、错误弹窗,方便在编辑器中操作

完整实现代码

using System.IO;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.Networking;

public class AssetBundleCreate : Editor
{
    // 配置参数,可根据自身需求修改
    private const string AB_OUTPUT_PATH = @"C:\Users\Heisenberg\Desktop\AssetBundle";
    private const string UPLOAD_API_URL = "替换为远程服务器接收文件的POST接口地址";
    // 接口需要鉴权则填写Token,不需要则留空
    private const string UPLOAD_AUTH_TOKEN = "替换为你的接口鉴权Token(无则留空)";

    [MenuItem("Assets/Create AssetBundle And Upload")]
    static void CreateAssetBundleAndUpload()
    {
        // 1. 执行AssetBundle本地构建
        AssetBundleManifest manifest = BuildPipeline.BuildAssetBundles(AB_OUTPUT_PATH, BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.StandaloneWindows64);
        
        if (manifest == null)
        {
            EditorUtility.DisplayDialog("错误", "AssetBundle构建失败,请检查控制台构建日志", "确定");
            return;
        }

        // 2. 遍历输出目录下的所有文件
        string[] allABFiles = Directory.GetFiles(AB_OUTPUT_PATH, "*.*", SearchOption.TopDirectoryOnly);
        int totalCount = allABFiles.Length;
        int uploadedCount = 0;

        foreach (string filePath in allABFiles)
        {
            // 过滤不需要上传的文件,可按需调整规则
            if (filePath.EndsWith(".manifest") || filePath.EndsWith(".meta"))
            {
                uploadedCount++;
                continue;
            }

            EditorUtility.DisplayProgressBar("上传AB包", $"正在上传:{Path.GetFileName(filePath)}", (float)uploadedCount / totalCount);

            // 3. 构造POST上传请求
            using (UnityWebRequest request = new UnityWebRequest(UPLOAD_API_URL, UnityWebRequest.kHttpVerbPOST))
            {
                List<IMultipartFormSection> formData = new List<IMultipartFormSection>();
                // 第一个参数为服务端接收文件的字段名,需和接口要求保持一致
                formData.Add(new MultipartFormFileSection("file", File.ReadAllBytes(filePath), Path.GetFileName(filePath), "application/octet-stream"));
                // 可按需添加自定义参数,比如平台、版本号等
                formData.Add(new MultipartFormDataSection("platform", "StandaloneWindows64"));
                formData.Add(new MultipartFormDataSection("app_version", Application.version));

                request.SetRequestHeader("Content-Type", "multipart/form-data; boundary=" + MultipartFormDataSection.GetDefaultBoundary());
                // 鉴权请求头,不需要可删除
                if (!string.IsNullOrEmpty(UPLOAD_AUTH_TOKEN))
                {
                    request.SetRequestHeader("Authorization", $"Bearer {UPLOAD_AUTH_TOKEN}");
                }

                request.uploadHandler = new UploadHandlerRaw(MultipartFormDataSection.SerializeSections(formData));
                request.downloadHandler = new DownloadHandlerBuffer();

                // 等待请求完成
                var asyncOp = request.SendWebRequest();
                while (!asyncOp.isDone) {}

                if (request.result != UnityWebRequest.Result.Success)
                {
                    EditorUtility.ClearProgressBar();
                    EditorUtility.DisplayDialog("上传失败", $"文件{Path.GetFileName(filePath)}上传失败:{request.error}", "确定");
                    return;
                }
            }

            uploadedCount++;
        }

        EditorUtility.ClearProgressBar();
        EditorUtility.DisplayDialog("完成", "所有AssetBundle已成功上传至远程服务器", "确定");
    }

    // 保留原仅本地构建菜单,方便调试
    [MenuItem("Assets/Create AssetBundle (Only Local)")]
    static void CreateAssetBundleOnlyLocal()
    {
        BuildPipeline.BuildAssetBundles(AB_OUTPUT_PATH,BuildAssetBundleOptions.ChunkBasedCompression,BuildTarget.StandaloneWindows64);
        EditorUtility.DisplayDialog("完成", "AssetBundle本地构建完成", "确定");
    }
}

使用说明

  1. 替换代码头部的三个配置参数为实际值
  2. 核对表单中的文件字段名、自定义参数和服务端接口要求保持一致
  3. 在Unity编辑器顶部菜单点击Assets/Create AssetBundle And Upload即可执行构建+自动上传流程

注意事项

  • 如果AB包体积超过服务端单文件上传限制,可自行扩展分片上传逻辑
  • 可按需添加失败重试、上传完成后本地文件清理、上传日志存储等扩展功能
  • 多平台构建场景下可增加平台参数判断,上传时自动区分存储目录

内容的提问来源于stack exchange,提问作者amin khosravi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:18:02