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本地构建完成", "确定"); } }
使用说明
- 替换代码头部的三个配置参数为实际值
- 核对表单中的文件字段名、自定义参数和服务端接口要求保持一致
- 在Unity编辑器顶部菜单点击
Assets/Create AssetBundle And Upload即可执行构建+自动上传流程
注意事项
- 如果AB包体积超过服务端单文件上传限制,可自行扩展分片上传逻辑
- 可按需添加失败重试、上传完成后本地文件清理、上传日志存储等扩展功能
- 多平台构建场景下可增加平台参数判断,上传时自动区分存储目录
内容的提问来源于stack exchange,提问作者amin khosravi
相关产品推荐
相关产品推荐

