ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Unity打包Windows后交付指南:文件结构、安装包制作与避坑

Unity打包Windows后交付指南:文件结构、安装包制作与避坑 每次在 Unity 里点完 Build然后跑到输出文件夹里一看新手基本都会愣一下说好的“双击就能用的单个 exe”呢怎么是一堆文件夹、一堆 DLL主程序那个 exe 夹在中间看起来就像代码写崩了没清理垃圾文件。这个画面我见过太多次了团队里新来的同事十个有九个都会在这个环节懵掉紧接着就是灵魂拷问“这玩意怎么发给客户总不能让人家下载一个 500MB 的文件夹吧。”这篇就把“Unity 打包 Windows 后如何交付给客户”这件事彻底讲透打包产物里每个文件是干嘛的、打包前哪些设置会直接影响交付体验、怎么把这一堆文件整理成客户能直接用的 zip 或安装包以及客户真机上最常见的几个坑。不管你是第一次打包发给朋友试玩还是要给企业客户做正式交付这篇内容都适用照着做基本不会再出大问题。1. 先搞懂Unity 打包出来的“文件全家福”到底是什么1.1 每个文件都是干什么的Unity 为 Windows 生成的标准产物大致长这样MyGame.exe MyGame_Data/ boot.config globalgamemanagers level0 resources.assets Managed/ StreamingAssets/ UnityPlayer.dll il2cpp_data/ 或者 MonoBleedingEdge/ MonoBleedingEdge/ UnityCrashHandler64.exe UnityCrashHandler64_Data/逐个拆开看其实不复杂。那个MyGame.exe本身非常小通常只有 1MB 左右它本质上是一个启动引导器bootstrap负责把引擎运行时加载起来、定位_Data目录、初始化游戏主循环。真正干活的是MyGame_Data文件夹里的UnityPlayer.dll这是整个 Unity 引擎在 Windows 上的运行时主体。你在编辑器里加的所有组件、写的所有 C# 逻辑、用的所有物理和渲染功能最后都会通过这个 DLL 来驱动。MyGame_Data里的globalgamemanagers、level0、resources.assets这些都是 Unity 自己的序列化资源文件游戏中所有场景、预设、资源包索引都在里面只是扩展名看起来不认识本质上是 Unity 的二进制资源格式。Managed文件夹Mono 模式或il2cpp_data文件夹IL2CPP 模式存放的是你项目里 C# 代码的编译产物。如果你用的是 Mono 后端就是一堆DLL文件如果你用了 IL2CPP则是原生代码和各平台的桥接数据这也是 IL2CPP 打包体积明显更大的原因。MonoBleedingEdge是 Unity 自带的 Mono 运行时目录它负责在 Mono 模式下提供 .NET 兼容层。UnityCrashHandler64.exe和它对应的_Data文件夹则是一个崩溃监控程序当游戏进程意外崩溃时它会收集错误信息并在后台生成日志。在正式交付时UnityCrashHandler.exe看情况可以保留也可以删除但严格来说它并不影响主程序运行。1.2 为什么 Unity 拒绝“一个文件打天下”很多开发者第一次看到产物之后都会抱怨“为什么不能像 PyInstaller 那样给 Python 脚本打包成一个 exeUnity 这么成熟的引擎为什么不做单文件发布”其实 Unity 官方在 Windows 平台上一直不提供“单 exe 发布”的选项这背后是架构设计上的取舍。原因要从引擎的模块化说起。Unity 的运行时由原生层C 实现的引擎核心和托管层C# 逻辑组成两者通过平台桥接层通信。如果把所有资源、DLL、配置文件都塞进一个 exe那么程序启动时就必须把所有内容全部载入内存加载速度会被拖慢内存占用也会上升。更麻烦的是游戏资源在磁盘上往往是按需加载的分开存放能让引擎按需读取单个资源文件这在实际项目中能明显降低加载延迟和 IO 压力。从发布流程来看分开存放也更利于局部更新。客户端的某个资源文件坏了可以只传输替换单个文件而不用重新下载整个游戏。对于需要后续热更新、DLC 或者补丁的项目来说这种结构几乎是必需的。顺便说一句很多独立游戏开发者想做的事——比如“把整个游戏装进一个 exe发给朋友双击就跑”——Unity 本身并不反对但官方不直接支持必须借助第三方的自解压或安装包工具来处理这个我们后面会详细讲。所以拿到这一堆文件不用慌它不是打包出错了而是 Unity 的正常产物。你要做的事是“整理和包装”而不是“修改文件结构”。最忌讳的是把_Data文件夹随意改名或者把 exe 单独拷出来发给别人那样一定跑不起来。2. 打包之前这些开关直接决定交付体验2.1 从 Build Profiles 看懂平台切换到了 Unity 6 之后原来的 Build Settings 窗口改名为 Build Profiles但核心操作逻辑没有本质变化。你需要做的第一步仍然是确认目标平台是 Windows。在 Build Profiles或旧版 Unity 的 Build Settings里新建一个 Windows 平台配置然后检查场景列表。场景列表里勾选了哪些场景最终 exe 启动时就会加载第一个场景作为入口。这里有个非常容易踩的坑如果场景列表为空或者第一个场景不是主菜单客户双击 exe 之后看到的是黑屏你会误以为是程序 bug实际上只是打包时的场景顺序没排对。另一个值得关注的是 Target Platform。现在主流是 x86_64如果你的客户群体里还有大量老旧 32 位 Windows 系统才需要考虑 x86。但现实情况是2024 年之后基本所有 PC 都是 64 位系统了x86 版本既不必要还会因为架构差异多出一份编译成本所以默认选 x86_64 就可以。2.2 三个必须确认的关键参数在 Player Settings 里有几个参数会直接影响交付包的体积、运行稳定性和代码安全这里单独拿出来说。第一个是 Scripting Backend。下拉框里通常是 Mono 和 IL2CPP 两个选项。Mono 编译速度快、打包体积小、调试方便但生成的 DLL 很容易被反编译而且运行时依赖 Mono 的跨平台层某些性能敏感场景会有额外开销。IL2CPP 会把 C# 代码转换成 C 然后编译成原生机器码性能和代码保护都更好但代价是打包时间明显变长体积也会增大不少。我的经验是如果只是发给朋友玩内测用 Mono 就够了改代码调 bug 效率高一旦是商业项目交付必须用 IL2CPP否则你的客户端代码在别人眼里等于透明。第二个是 Compression Method。压缩算法有三个选项Disabled、LZ4、LZ4HC。Disabled 不压缩加载最快但体积最大基本没人用于最终发布。LZ4 是快速压缩启动加载速度不错压缩率一般。LZ4HC 在高压缩模式下打包体积最小但打包时间会长一些。对最终交付来说我一般选 LZ4HC毕竟打包多等几分钟客户下载时能省几 MB 甚至几十 MB这个时间花得值。第三个是 Development Build 开关。这个勾选框非常阴险很多人不留意就带着它发布了。勾选 Development Build 后程序会包含调试数据和 profiling 能力运行速度和稳定性都会下降甚至在极端情况下会出现编辑器相关的错误弹窗。发布给客户的版本必须把这个开关关掉同时建议打开“Script Debugging”旁边的开关让它保持关闭状态。下面整理成表格方便对照参数内测/调试建议正式交付建议原因Scripting BackendMonoIL2CPPMono 调试快IL2CPP 性能好、难反编译Compression MethodLZ4LZ4HCLZ4 打包快LZ4HC 体积小Development Build开启关闭开启会拖慢性能且带有调试信息Target Platformx86_64x86_6432 位系统已基本淘汰2.3 产品名、图标和版本号影响客户第一印象在 Player Settings 的 Windows 平台页签里有公司名Company Name、产品名Product Name、默认图标Default Icon和版本号。很多人嫌麻烦不填结果打包出来的 exe 图标是 Unity 默认的方块右键属性里品牌信息也是空的客户看到第一眼就觉得“不专业”。这里的坑在于公司名和产品名一旦定下来尽量不要在后续版本里变化因为它们会直接决定 Player.log 的存储路径——C:\Users\用户名\AppData\LocalLow\CompanyName\ProductName\Player.log。如果中途改了产品名早期版本留下的日志和存档路径就找不到了后续做问题定位会变得很麻烦。同时建议在 Project Settings 的 Player 里把分辨率设置也过一遍特别是“Fullscreen Mode”这里。有的项目默认是 Windowed 带边框客户双击出来后窗口很小有的项目默认全屏结果在分辨率比较怪异的机器上显示异常。通常我给客户交付的版本会选择 Fullscreen Window也就是无边框全屏窗口它不会像独占全屏那样因为切换分辨率导致黑屏也能用 AltTab 正常切换窗口客户观感最稳妥。3. 把“一堆文件”整理成一份能直接发给客户的交付包3.1 exe 和 _Data 文件夹必须“同名捆绑”打包产物整理的第一条铁律是exe 主程序文件比如MyGame.exe和对应的数据文件夹MyGame_Data必须同名并且必须放在同一个层级目录下。这是 Unity Windows 运行时查找资源的硬性规则——exe 启动时会去找“exe文件名_Data”这个目录路径拼不上就会直接退出。很多人手动改过 exe 的名字比如把MyGame.exe改成最新版本.exe或大富翁客户端.exe但_Data文件夹名字没跟着变双击后什么都没发生。正确处理方式是先整体复制一份到新文件夹在文件夹层面同时修改 exe 和对应_Data的文件夹名确保前者加了.exe后和后者基础名完全一致。改完之后最好双击运行一次确认能进主界面再拿这个文件夹去打包。在这个环节还需要留意StreamingAssets。如果你的游戏在运行时读取了外部文件比如配置表、视频、模型文件这些文件通常放在MyGame_Data/StreamingAssets目录下。在整理交付包时不要误以为它是多余的缓存文件而删掉。我见过有人为了给客户减少体积把StreamingAssets当成“旧的临时文件”删了结果游戏里的对话音频全没了。3.2 方案一打成 zip / 7z 压缩包绿色版最简单直接的交付方式就是把整个构建产物目录压缩成一个 zip 或 7z 压缩包客户下载后解压到本地双击 exe 就能玩。这里有一个非常重要的建议千万不要在打包前把解压路径设定成 Desktop 之类的真实路径压缩包里应该是一个顶层文件夹里面再放 exe 和_Data。比如压缩包内结构应该是MyGame_v1.0.0.zip MyGame_v1.0.0/ MyGame.exe MyGame_Data/ ...这样客户解压后得到一个独立文件夹不会把一堆 DLL 和资源文件直接撒在桌面上。压缩算法上如果客户大多用 Windows 自带解压就选择 zip 格式如果客户能接受安装 7-Zip7z 格式用 LZMA2 算法能多压出 5% 到 10% 的空间。zip 的好处在于兼容性Windows 资源管理器直接双击就能解压7z 的好处在于压缩率取舍看你的客户群画像。压缩完成后建议用工具算一个 SHA-256 校验码发布时连同压缩包一起发出去。客户如果解压后运行报错可以先让它校验一下文件哈希确认不是下载过程中文件损坏能少扯很多皮。校验命令在 PowerShell 里是Get-FileHash .\MyGame_v1.0.0.zip -Algorithm SHA256绿色版交付最大的意义是“零安装成本”客户拿到就能用但也意味着系统不会帮你管理快捷方式、卸载信息和文件关联所有东西都得你自己想办法。如果你客户中有大量非技术型使用者直接给绿色版压缩包其实不是最佳选择他们很容易解压后找不到 exe或者双击后杀毒软件弹窗就慌了。3.3 方案二用 Inno Setup 制作安装程序商务正经版给企业客户、非技术型客户交付时我更推荐做成安装包让客户运行 setup 程序、一路点 Next自动安装到 Program Files、自动生成桌面快捷方式和卸载入口。这才是“正式交付”的样子。Unity 项目最适合搭配的 Windows 安装包工具是 Inno Setup免费、轻量、脚本语法简单打包出来的安装程序比 NSIS 的界面精致还支持多语言、卸载功能、注册表操作。用 Inno Setup 编译 Unity 项目的典型脚本模板大致如下#define MyAppName MyGame #define MyAppVersion 1.0.0 #define MyAppExeName MyGame.exe [Setup] AppId{{8F6B3A21-9C4D-4E6F-A2D3-3B7D1C5E9A10} AppName{#MyAppName} AppVersion{#MyAppVersion} DefaultDirName{autopf}\{#MyAppName} DefaultGroupName{#MyAppName} UninstallDisplayIcon{app}\{#MyAppExeName} OutputDirinstaller_output OutputBaseFilenameMyGame_Setup_v1.0.0 Compressionlzma2 SolidCompressionyes [Files] Source: build_output\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs [Icons] Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName} Name: {autodesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: desktopicon [Tasks] Name: desktopicon; Description: Create a desktop shortcut; GroupDescription: Additional icons:这段脚本的核心逻辑是把所有构建产物递归地装到{app}默认是 Program Files 下目录然后创建开始菜单和桌面快捷方式。有几个参数值得注意Compressionlzma2是 LZMA2 高压缩安装包体积会明显小于原始文件SolidCompressionyes能让压缩率再提升一点但解压时需要占用少量临时磁盘空间ArchitecturesAllowedx64compatible可以限定只允许 64 位系统安装减少兼容性问题。Inno Setup 生成的安装包有一个好处安装时它会自动向系统注册卸载信息客户在“设置-应用”里能看到这个程序的名称、版本号卸载时也能全部清理干净。这一点在软件采购流程比较规范的企业客户那里几乎是硬指标他们对“绿色版”比对“病毒”还敏感。3.4 方案三自解压单文件类“单 exe”效果如果客户明确问“能不能给我一个单文件 exe”Unity 官方没有直接支持但可以用“自解压压缩包”的形式做出接近的效果。思路也很简单把整个构建目录压成一个自解压包客户双击后自动解压到临时目录并运行 exe。用 7-Zip 做这件事很成熟。先把构建目录用 7z 压缩再准备一个文本配置文件用于自解压行为指定;!Install!UTF-8! RunProgramMyGame.exe ;!InstallEnd!然后用命令行工具把 sfx 模块、配置文件和压缩包拼起来copy /b 7z.sfx config.txt MyGame.7z MyGame.exe这样得到的 MyGame.exe 双击后会自动把内部压缩包解压到临时目录、运行MyGame.exe整个过程看起来就像单文件程序。这种做法有个明显的缺点运行时它需要在临时目录释放几百 MB 文件启动速度会慢而且某些杀毒软件对“自解压并运行”这种特性非常敏感误报率比普通安装包和绿色版高得多。我的建议是这种形式只适合向朋友、内测玩家或技术型用户交付给正式客户用还是优先安装包。4. 一个自动化交付脚本的完整实操4.1 用 bat 脚本一键整理打包产物每次打包完手动去整理文件、删掉多余项、复制到发布目录很容易漏掉细节。一旦项目发布频率变高比如一周发两个内测版手工操作一定会出错。我自己的做法是把整个整理过程写成批处理脚本打包完成后双击一下几秒钟得到干净整齐的交付目录。先建一个prepare_release.bat内容大致如下echo off setlocal enabledelayedexpansion set /p VERSIONEnter version (e.g. 1.0.0): set SOURCEbuild_windows set TARGETrelease\MyGame_v%VERSION% if exist %TARGET% rmdir /s /q %TARGET% mkdir %TARGET% xcopy %SOURCE% %TARGET% /e /i /y del %TARGET%\UnityCrashHandler64.exe del %TARGET%\UnityCrashHandler64_Data /q /s echo Release folder prepared: %TARGET%这个脚本会先删除旧的发布目录、拷贝最新的构建产物、再顺手清理掉UnityCrashHandler64相关内容。脚本里的set /p会提示你输入版本号这样最终交付目录会带上清晰版本标识不至于全是“最终版”“最终版2”“打死也不改了版”这种命名车祸现场。如果你不想保留 UnityCrashHandler删掉确实可以减小一点体积但注意它本身不是关键运行文件删了不影响游戏。我只是为了尽量减少“多余文件”所以会在整理脚本里清理掉。4.2 用 PowerShell 自动生成 zip整理完目录之后压缩这一步也可以自动化。在同一个批处理里调用 PowerShell 的Compress-Archive或者直接写独立的 PowerShell 脚本都能实现一键打包param( [Parameter(Mandatory$true)] [string]$Version ) $source release\MyGame_v$Version $dest release\MyGame_v$Version.zip if (Test-Path $dest) { Remove-Item $dest -Force } Compress-Archive -Path $source -DestinationPath $dest -CompressionLevel Optimal Get-FileHash $dest -Algorithm SHA256 | Select-Object Hash | Out-File $dest.sha256 Write-Host Zip created: $destCompress-Archive 是 Windows 10/11 自带的命令不需要额外安装工具缺点是压缩率一般压缩速度也不够快。如果对压缩率有要求可以在脚本里调用 7-Zip 的命令行工具7z.exe a -t7z -mx9效果会更好。我个人的习惯是内测版用 PowerShell 自带 zip正式版用 7z LZMA2 出包。对了压缩完一定要顺手生成 SHA-256 校验文件这个习惯能解决非常多“文件损坏”“下载不完整”的扯皮问题。客户有任何启动异常先比一下哈希不符合就是文件问题符合才轮到你的代码背锅。4.3 给客户一份什么都写明白的 README交付包整理的最后一环不是压缩而是写说明文档。尤其是给非技术型客户一份包含系统要求、运行方法、常见问题、联系方式/更新记录的 README能让你售后工作量直接减半。README 不需要多长但几个关键项必须写清楚最低系统要求操作系统版本Windows 10 19041 以上等、内存至少多少、显卡有没有特殊要求运行方法解压后双击哪个文件夹里的哪个 exe安装版就写“运行 Setup.exe一路下一步”常见问题打不开怎么办、黑屏怎么办、杀毒软件拦截怎么办版本记录版本号、更新日期、本次改了什么我个人还会在 README 开头加一句醒目的“首次运行前请关闭杀毒软件实时监控如弹出拦截请选择允许”这句话能挡住 70% 的启动失败咨询因为 Unity 生成的 exe 在部分杀软眼里就是“未知程序”尤其是用 IL2CPP 编译的大体量可执行文件。提前告诉客户该点哪里比事后远程指导要省力得多。5. 客户机器上的常见问题与排查技巧5.1 双击 exe 闪退怎么看日志客户环境下最头疼的问题就是闪退。你的机器上跑得好好的客户一双击就闪退而且没有任何弹窗这种情况排查起来像大海捞针。第一步永远是把 Unity 的 Player.log 拿回来。日志路径在客户机器上是这样的C:\Users\用户名\AppData\LocalLow\CompanyName\ProductName\Player.log拿到日志后重点搜关键词Exception、Error、Failed to load。最常见的闪退原因有以下几类打包机器和客户机器的 VC 运行库版本不一致显卡驱动太旧导致渲染接口初始化失败系统语言环境导致的中文字体/区域设置问题以及少部分杀毒软件把依赖的 DLL 隔离了。这里有个小技巧闪退问题基本都是二进制文件被杀毒软件隔离导致的可以在客户机器上打开“Windows Defender 保护历史记录”看是否有文件被查杀。如果是恢复文件后添加白名单目录再启动游戏。很多杀毒软件对 Unity 的UnityPlayer.dll误报率其实不高但对 IL2CPP 生成的GameAssembly.dll有过真实误报案例遇到这种情况只能向杀软厂商提交误报申诉或者购买代码签名证书。5.2 提示缺少 VCRUNTIME140.dll 或 MSVCP140.dllUnity 打包的 Windows 程序依赖 Visual C 运行库某些精简版系统、或者从来没有装过其他软件办公电脑上会直接弹窗提示缺少VCRUNTIME140.dll或MSVCP140.dll。这个问题的标准解法是让客户安装 “Microsoft Visual C 2015-2022 Redistributable (x64)”微软官方下载中心直接搜就能找到。但注意不要指望客户自己会装。更好的做法是在安装包制作环节就把运行库打包进去——Inno Setup 可以配置在安装时静默安装 VC 运行库这个功能叫VCRedistNeedsRestart或者直接在脚本里用[Run]段执行一次运行库安装器。如果走绿色版分发就在 README 里放一个下载链接让客户先装运行库再运行。这背后的原因是Unity 的 Windows 版本用 MSVC 编译生成的机器码会动态链接到系统的 VC 运行库 DLL。较新的 Windows 10/11 本身就自带了大部分用于更新系统的 VC 组件但离了大型软件的办公机器就是有可能缺这两个文件。在最终交付前我建议自己在一台“干净的虚拟机”上验证一次解压运行能有效提前暴露这类问题。5.3 中文路径和中文用户名惹的祸这是一个 Unity Windows 发布的老大难问题。客户如果解压目录路径带了中文比如C:\游戏\MyGame或者 Windows 登录用户名本身是中文比如C:\Users\张三Unity 的某些版本在加载资源时会因为路径编码问题崩溃或黑屏。这个问题在较新版本 Unity 中得到了一定程度缓解但并不能保证百分之百免疫。所以交付说明里我会明确写上“请将游戏解压到纯英文路径文件夹名不要包含中文”这条建议并把默认安装目录设为C:\Program Files\MyGame而不是C:\用户\...。为了保险Inno Setup 的默认安装目录配置如果有可能走向中文用户目录还要手动指向一个固定的C:\MyGame之类的路径。实际项目中我遇到最窝火的场景是客户把压缩包解压到桌面——Windows 的桌面路径通常包含中文用户名结果游戏闪退折腾了两天才定位到路径编码问题。最后我在所有交付文档里都加了一句“解压到英文路径比如 D:\Game\”从那以后这个问题的咨询量直接降了 90%。5.4 杀毒软件误报与数字签名Unity 打包出的 IL2CPP 程序解析度低、体积大、没有常见厂商签名很容易触发一些安全软件的“未识别程序”机制。这本身不是病毒但对客户来说就是信任危机。应对办法优先级从高到低有三个第一使用正规的数字签名证书对 exe 进行签名这能让 Windows SmartScreen 不再提示“未知发布者”商业项目强烈推荐第二向误报的杀毒软件提交误报申诉这个方法有效期不确定但值得做第三在 README 中提前说明“程序已签名/未签名首次运行若有安全提示请选择更多信息-仍要运行”。如果你是第一次做商业项目可能觉得签名证书几千块钱一年是“额外的支出”实际上它省下的客户信任成本和售后成本远远超过证书本身的价格。有个容易忽略的细节签名时对单独的exe文件签名是不够的UnityPlayer.dll、GameAssembly.dll等核心 DLL 也建议一起签名否则部分安全软件依然会对这些 DLL 产生告警。5.5 打包体积太大有没有第二次优化的空间打包完发现目录体积 2GB压缩后仍然 1.5GB客户下载体验会很差。这就要从 Unity 工程的资产管线角度做文章。IL2CPP 产物本身就有固定体积光 C 编译出来的引擎层和代码层就可能占 100MB 以上这一块很难再压缩。主要的压缩空间来自资源纹理、音频、模型。打开 Project Settings 里每个资源的 Import Settings把纹理从 RGBA32 格式的 2K 改成 ASTC/DXT 压缩格式把音频改成 ADPCM 或 Vorbis 压缩模型在导入时开启 Mesh Compression整体体积往往能掉 30% 到 50%。还有一个很多人不知道的选项“Player Settings - Managed Stripping Level”里选择 High以及 IL2CPP 模式下开启 “Strip Engine Code”。启用后 Unity 会在最终构建时裁剪掉未使用的引擎模块代码这能显著减少 IL2CPP 产物体积但有一定的风险——如果你的某个功能是通过反射或者动态加载调用的裁剪可能把用到的代码去掉导致运行时功能异常。建议开 High 级别后做一遍全功能冒烟测试再交付。如果这些都做完体积还不达标就该考虑 StreamingAssets 里是不是有不该打进包里的东西或者把后续关卡做成 AssetBundle 放到服务端按需下载。这个方向就超出本文范围了但它才是“体积问题”的终级解法。最后再分享两个实战心得第一交付流程脚本化。我从第一次手动整理 Unity 构建产物耗时二十分钟、还删错文件之后就再也不信任“手动整理”了。现在整个流程是编辑器里 Build - 运行 prepare_release.bat - 运行 make_zip.ps1 - 对比 SHA-256 - 上传到分发渠道。一套流程五分钟搞定而且不会出错。建议你也把“打包-整理-压缩-校验”这个过程沉淀成脚本哪怕是最简陋的 bat也能拦住大部分手滑事故。第二正式交付和内部测试一定要分开目录。我见过太多团队把内测 Ver 当成正式包发给客户的惨案客户玩到一半发现界面是英文、功能没更新、或者 Debug 面板还开着。把release目录和build_debug目录彻底分开交付包从 release 目录出内测包从来不会被当成候选包习惯之后会省很多心。说到底Unity 打包 Windows 的“文件全家福”不是 Bug而是设计。你需要掌握的其实是围绕“构建产物如何变成可交付物”这一套整理、打包、验证和说明的完整链路。把这个链路做顺了客户拿到手的是双击即用的安装包你收到的就是“没问题很好用”而不是“怎么打不开”的连环夺命 QQ 消息。
返回列表