1. 项目概述:从“绿色版”到专业安装包的蜕变
做Unity开发的朋友,尤其是独立开发者或小团队,肯定都经历过这个阶段:辛辛苦苦在Unity编辑器里点下“Build”,生成了一个包含.exe、Data文件夹和一堆依赖文件的文件夹。然后你把这个文件夹打个压缩包,发给测试或者玩家。对方解压后,可能会遇到各种问题:“这个UnityPlayer.dll文件被杀毒软件误报了!”、“我该点哪个.exe?怎么还有两个?”、“为什么我双击没反应,是不是缺了什么运行库?”。这种分发方式,我们戏称为“绿色版”或“压缩包版”,它极度不专业,用户体验差,也显得开发者很不靠谱。
所以,我们今天要聊的,就是如何跨越这个“业余”阶段,将Unity打包出来的一堆散装文件,封装成一个标准的、专业的Windows安装程序(.exe或.msi)。这不仅仅是加了个外壳,而是涉及用户体验、软件分发、版本管理甚至商业形象的一整套工程。一个专业的安装程序,能自动处理运行库依赖、创建开始菜单和桌面快捷方式、写入必要的注册表信息、提供友好的安装向导界面,并且在卸载时能干净地移除所有文件。对于玩家或用户而言,这意味着“一键安装,开箱即用”,信任感和体验感直接拉满。
市面上制作安装程序的工具很多,从老牌的Inno Setup、NSIS,到功能强大的InstallShield、Advanced Installer,再到一些新兴的、对游戏开发者更友好的工具。它们各有优劣,选择哪个,取决于你的项目复杂度、预算以及对安装包定制程度的要求。这篇文章,我会以一个Unity开发者的视角,带你走通从Unity打包输出到最终生成安装包的全流程,重点分享我用得最多、也认为对独立开发者最友好的方案——Inno Setup,并穿插讲解其中的核心原理和避坑要点。
2. 核心思路与工具选型:为什么是Inno Setup?
在动手之前,我们先理清思路。Unity的PC平台(包括Windows、Mac、Linux)打包,本质上是将项目资源、代码和Unity运行时(Runtime)编译、整合成目标平台可执行的原生格式。对于Windows,就是生成一个主程序(.exe)和与之配套的数据文件夹(通常叫项目名_Data)。我们的任务,就是为这个“主程序+数据文件夹”的组合,制作一个安装器外壳。
为什么在众多工具中,我首推Inno Setup?原因有几个,这背后都是实打实的项目经验:
1. 完全免费且开源:这对独立开发者和学生团队是巨大的福音。没有授权费用,没有功能限制,你可以放心地用于商业项目分发。开源意味着遇到极端问题,你甚至可以自己去查源码(虽然绝大多数时候用不到)。
2. 脚本驱动,灵活强大:Inno Setup使用一种名为.iss的脚本文件来定义整个安装过程。这听起来有点技术门槛,但实际上它的脚本语法非常直观,类似于Pascal。通过脚本,你可以精确控制安装的每一个环节:复制哪些文件、创建什么目录、写入哪些注册表项、安装哪些运行库、创建哪些快捷方式、甚至执行自定义的预处理或后处理脚本。这种灵活性是很多图形化工具难以比拟的。
3. 生成的安装包小巧高效:Inno Setup编译器本身和生成的安装程序,体积都非常小,几乎没有额外的膨胀。安装包本身就是一个独立的.exe,用户下载后直接双击运行即可,无需先安装别的“安装程序生成器”。
4. 对游戏开发友好:它内置了对大型文件(如游戏资源包)的高效压缩支持,并且能很好地处理Unity打包后产生的复杂文件结构。社区有大量现成的脚本范例,专门针对Unity、Godot等引擎优化过。
5. 强大的解压和安装验证:安装过程中会自动校验文件完整性,如果下载损坏会提示用户。它还能生成卸载程序,让软件可以从Windows的“应用和功能”列表中干净地移除。
当然,它也有“缺点”:需要手写(或借助向导生成后修改)脚本文件,对完全零基础的用户有一点点学习曲线。但相信我,对于一个能搞定Unity开发的你来说,掌握Inno Setup的基础用法,可能只需要喝杯咖啡的时间。相比之下,像InstallShield这类企业级工具虽然功能更全,但价格昂贵、学习曲线陡峭;而一些过于简化的图形工具,又往往无法满足游戏安装的定制化需求。
注意:除了Inno Setup,NSIS(Nullsoft Scriptable Install System)也是一个非常流行且强大的免费选择。它同样脚本驱动、高度可定制。两者在核心功能上旗鼓相当,社区都很活跃。选择Inno Setup还是NSIS,有时更像是一种个人偏好或历史项目延续。我选择Inno Setup,是因为我觉得它的脚本语法对新手更友好一些,且默认生成的安装界面更符合现代Windows风格。你可以都了解一下,选择最适合自己的。
3. 前期准备:Unity端的关键打包设置
在打开Inno Setup之前,我们必须确保从Unity导出的“原料”是正确且优化的。很多安装包的问题,根源其实在Unity的打包设置上。
3.1 项目构建设置详解
打开File -> Build Settings,选择PC, Mac & Linux Standalone平台,确保Target Platform是Windows。点击Player Settings...进入详细的玩家设置。
- 产品名称(Product Name):这将是你的游戏在系统中显示的名字,也是默认生成的主
.exe文件名和开始菜单文件夹名。起一个清晰、无特殊字符的名字。 - 公司名称(Company Name):这个信息很重要,它会成为Windows系统里应用程序默认安装路径的一部分(例如
C:\Program Files\[CompanyName]\[ProductName]),也会被写入注册表。请使用英文或拼音,避免中文,以防某些系统路径处理出现问题。 - 默认图标(Default Icon):在这里设置你的应用程序图标。这个图标会显示在最终生成的
.exe文件上,以及安装后在桌面、开始菜单的快捷方式上。建议准备至少256x256像素的.ico格式图标文件,包含多个尺寸(如16x16, 32x32, 48x48, 256x256),以适应不同场景的显示需求。 - 分辨率与呈现(Resolution and Presentation):
- 全屏模式(Fullscreen Mode):根据你的游戏需求选择“独占全屏”、“窗口化全屏”或“窗口化”。对于安装包,通常我们打包时选择“窗口化”,让用户首次运行时自己决定。但如果你希望游戏固定为全屏,可以在这里设置。
- 允许全屏切换(Allow Fullscreen Switch):建议勾选,给玩家灵活性。
- 运行于后台(Run In Background):如果你的游戏是单机且不希望切屏时暂停,可以勾选。但对于大多数游戏,不勾选可能体验更好。
- 其他设置(Other Settings):
- 渲染管线(Rendering):根据你的项目使用的是内置管线、URP还是HDRP,确保设置正确。
- 颜色空间(Color Space):通常使用Linear以获得更真实的渲染效果,但这需要显卡支持。如果为了最大兼容性(尤其是面向集成显卡的机器),可以考虑使用Gamma。
- API兼容性级别(.NET/API Compatibility Level):确保与你项目中使用的库和插件兼容。对于较新的Unity版本和功能,通常需要
.NET Standard 2.1或.NET Framework。
3.2 至关重要的“压缩方式”选择
在Build Settings窗口中,有一个非常关键但容易被忽略的选项:压缩方式(Compression Method)。它位于平台设置的下方。
Unity提供了几种压缩方式:
- 默认(Default):不进行额外压缩,文件体积最大,但加载速度可能最快(因为无需解压)。
- LZ4:一种快速压缩算法,在压缩率和解压速度之间取得了很好的平衡。这是目前对于大多数PC游戏项目的推荐选择。它能显著减小Data文件夹中资源文件(如AssetBundle、场景等)的体积,同时运行时解压开销极小,几乎不影响加载速度。
- LZ4HC:LZ4的高压缩率变体,压缩率更高,但压缩过程更慢(只影响打包时间,不影响运行时)。如果磁盘空间是首要考虑,可以用这个。
实操心得:我强烈建议在打包PC端时选择LZ4压缩。这能让你最终的安装包体积减小很多(有时能达到30%-50%的缩减),而性能损失微乎其微。除非你的游戏对加载速度有极端要求(比如竞技类游戏),且资源本身不大,否则LZ4都是最优解。这个设置在Unity端完成,比在安装包制作时再用通用压缩算法压一次,效率要高得多,因为它是Unity运行时原生支持的。
3.3 执行打包并检查输出
设置完毕后,点击Build,选择一个空文件夹作为输出目录(例如D:\MyGameBuild)。Unity会开始编译和打包过程。
打包完成后,你会得到类似这样的文件结构:
MyGameBuild/ ├── MyGame.exe (你的游戏主程序) ├── MyGame_Data/ (游戏数据文件夹,内含资源、库文件等) ├── UnityPlayer.dll (Unity运行时库) ├── MonoBleedingEdge/ (或类似名称,.NET运行时环境) └── (可能还有其他dll,如音频、视频解码库)请仔细检查这个文件夹:
- 确保
MyGame.exe可以双击正常运行。 - 观察
MyGame_Data文件夹的大小,确认LZ4压缩已生效(相比Default会小很多)。 - 尝试将整个
MyGameBuild文件夹复制到另一台没有安装Unity编辑器的电脑上运行,测试是否缺失运行库。这是制作安装包前最重要的冒烟测试。如果在新电脑上运行失败,提示缺少MSVCRxxx.dll或.NET Framework,那么我们在制作安装包时就需要将这些依赖项打包进去。
4. 使用Inno Setup制作安装程序
现在,我们有了干净的“原料”,可以开始烹饪“安装包”这道大餐了。
4.1 安装Inno Setup并理解核心概念
首先,去Inno Setup官网下载并安装。安装过程中,建议勾选“安装预处理器”和“安装Inno Setup QuickStart Pack示例”,这些对后续学习有帮助。
安装完成后,我们主要会用到两个程序:
- Inno Setup Compiler (ISCC):这是命令行编译器,用于编译
.iss脚本生成安装包。我们通常会配合脚本编辑器使用。 - Inno Script Studio (可选但推荐):这是一个图形化的脚本编辑和预览环境。对于新手来说,用它来生成初始脚本和预览安装界面非常方便。但它不是必须的,你也可以用任何文本编辑器(如VSCode、Notepad++)编辑
.iss文件。
Inno Setup的核心是一个扩展名为.iss的脚本文件。这个脚本告诉编译器:
- 安装包元信息:软件名称、版本、出版商、官网等。
- 源文件在哪里:也就是我们刚刚Unity打包出来的那个文件夹。
- 文件要安装到哪里:通常是
{pf}\[CompanyName]\[AppName]({pf}代表Program Files目录)。 - 要创建哪些快捷方式:桌面、开始菜单。
- 安装过程中要执行哪些任务:比如安装VC++运行库、创建注册表项、检查.NET版本等。
- 安装界面的外观:图标、图片、文字等。
4.2 使用向导创建基础脚本
最快捷的方式是使用Inno Setup Compiler自带的“脚本向导”。打开Inno Setup Compiler,选择File -> New...,就会启动向导。
跟着向导一步步填写:
- 应用程序信息:填写你的游戏名称、版本、出版商(同Unity公司名)、官网。这些信息会显示在安装向导和控制面板的“程序与功能”里。
- 应用程序目录:默认的安装目录,通常保持
{pf}\[YourCompany]\[YourApp]即可。{pf}是一个常量,在32位系统上代表C:\Program Files,在64位系统上代表C:\Program Files (x86)或C:\Program Files,取决于你的安装包架构。对于现代64位Unity游戏,我们通常需要专门处理。 - 应用程序文件:这是最关键的一步!点击“添加文件”,不要只添加
MyGame.exe。而是点击“添加文件夹”,选择你Unity打包输出的整个文件夹(例如MyGameBuild)。然后,在下面的“目标目录”中,通常设置为{app},这意味着安装时会将整个文件夹的内容解压到用户选择的安装目录下。 - 应用程序图标和快捷方式:指定你的
.exe文件(主程序),并勾选创建桌面快捷方式和开始菜单快捷方式。你可以为快捷方式指定不同的图标。 - 安装文档:可以添加许可协议文件(
license.txt)、说明文档等。 - 安装语言:选择简体中文(Chinese (Simplified))和其他你需要的语言。
- 编译器设置:设置输出目录和安装包文件名。勾选“压缩安装包”以减小分发体积。
点击完成,向导会生成一个.iss脚本文件并自动打开。不要急于编译!这个脚本是基础版,我们需要根据Unity游戏的特点进行深度定制。
4.3 深度定制.iss脚本(关键步骤)
让我们打开生成的脚本,逐部分解析和修改。以下是一个针对Unity Windows游戏优化后的脚本范例,并附带了详细注释:
; 脚本由 Inno Setup 脚本向导生成! ; 请务必仔细阅读此脚本的注释,修改适合你需要的内容。 #define MyAppName "我的超级游戏" #define MyAppVersion "1.0" #define MyAppPublisher "超级游戏工作室" #define MyAppURL "https://www.myawesomegame.com" #define MyAppExeName "MyGame.exe" ; 与Unity打包出的exe文件名一致 #define MyGameBuildPath "D:\MyGameBuild" ; Unity打包输出的完整路径 [Setup] ; 注意: AppId的值为单独标识该应用程序。 ; 不要为其他安装程序使用相同的AppId值。 ; 生成新的GUID可以使用工具(例如在ISPP中使用的GUID生成器)。 AppId={{你的GUID-这里-需要-替换-成唯一的} AppName={#MyAppName} AppVersion={#MyAppVersion} AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} ; 安装目录:64位系统默认安装到 Program Files,而不是 Program Files (x86) ; 使用 {autopf} 可以自动根据系统选择,但为了明确,我们指定 {commonpf64} DefaultDirName={commonpf64}\{#MyAppPublisher}\{#MyAppName} ; 对于32位游戏,请使用 {commonpf32} ; DefaultDirName={commonpf32}\{#MyAppPublisher}\{#MyAppName} DefaultGroupName={#MyAppName} ; 卸载程序也显示在开始菜单中 UninstallDisplayIcon={app}\{#MyAppExeName} ; 输出安装包的文件名 OutputBaseFilename=MyAwesomeGame_Setup_v{#MyAppVersion} ; 安装包压缩方式,solid压缩率最高 Compression=lzma2/ultra64 SolidCompression=yes ; 使用现代Wizard界面样式 WizardStyle=modern ; 设置安装程序图标 SetupIconFile=my_setup_icon.ico ; 如果你的游戏只支持64位,可以强制64位安装模式,避免安装在32位系统上 ArchitecturesAllowed=x64 ArchitecturesInstallIn64BitMode=x64 [Languages] Name: "chinesesimp"; MessagesFile: "compiler:Languages\ChineseSimplified.isl" [Tasks] ; 创建桌面快捷方式的任务选项 Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked [Files] ; 这是核心部分,指定要安装的文件 ; 源路径:你的Unity构建文件夹。使用通配符 ** 可以包含子目录。 ; 目标路径:{app} 代表用户选择的安装目录。 ; Flags: ignoreversion 表示如果文件版本不同则覆盖(适合游戏资源); ; recursesubdirs 表示包含所有子目录; ; createallsubdirs 表示在目标位置创建所有源子目录。 Source: "{#MyGameBuildPath}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs ; 注意:不要单独为exe或dll设置,上面的通配符已经包含了所有。 ; 如果你有额外的依赖文件(如VC++运行库安装包),可以在这里添加: ; Source: "vcredist_x64.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall [Icons] ; 创建开始菜单快捷方式 Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" ; 创建卸载程序的快捷方式 Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}" ; 根据用户选择创建桌面快捷方式 Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon [Run] ; 安装完成后运行的程序(可选) ; 运行游戏主程序 Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent ; 如果需要静默安装VC++运行库,可以在这里添加(不推荐完全静默,可能需用户同意EULA) ; Filename: "{tmp}\vcredist_x64.exe"; Parameters: "/install /quiet /norestart"; StatusMsg: "正在安装 Microsoft Visual C++ 运行库..."; Check: VCRedistNeedsInstall [Code] // 这是一个Pascal脚本段,用于更高级的逻辑控制,例如检查系统环境。 // 示例:检查是否安装了特定版本的VC++运行库 function VCRedistNeedsInstall: Boolean; var Version: String; begin // 这里应写入检查特定VC++运行库版本的注册表逻辑 // 如果未安装,返回True,否则返回False // 这是一个简化示例,实际检查逻辑更复杂 if (RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64', 'Version', Version)) then begin // 已安装,检查版本是否满足要求... Result := False; end else begin Result := True; end; end;关键定制点解析:
架构与安装目录([Setup]段):
ArchitecturesAllowed=x64和ArchitecturesInstallIn64BitMode=x64:如果你的Unity项目是64位构建(现代游戏基本都是),加上这两行可以确保安装程序以64位模式运行,并将游戏安装到正确的Program Files目录,避免和32位程序混在一起。DefaultDirName={commonpf64}\...:明确指定64位程序文件目录。{commonpf64}常量会解析为C:\Program Files(在64位系统上)。
文件复制([Files]段):
Source: "...\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs:这一行是精髓。它使用通配符*和recursesubdirs标志,将整个Unity构建文件夹(包括所有子目录和文件)原样复制到安装目录{app}下。ignoreversion对于游戏资源非常合适,因为我们通常不依赖Windows的文件版本控制来管理资产。
运行库依赖([Files]和[Run]段):
- 这是最大的一个坑。Unity构建的Windows游戏,通常依赖Microsoft Visual C++ Redistributable运行库。如果用户电脑上没有,游戏会启动失败,提示缺少
VCRUNTIME140.dll等。 - 解决方案:将对应的VC++运行库安装包(如
vcredist_x64.exe)打包进你的安装程序(放在[Files]段复制到临时目录{tmp}),然后在[Run]段执行它。 - 重要提示:不要总是静默安装。最好先检查是否已安装(通过
[Code]段函数判断),如果已安装则跳过。如果未安装,可以弹出提示或直接安装。静默安装参数 (/install /quiet /norestart) 可能涉及EULA(最终用户许可协议)的法律问题,需谨慎。一种更友好的方式是引导用户去微软官网下载,或者在安装界面提供一个复选框让用户选择是否安装。
- 这是最大的一个坑。Unity构建的Windows游戏,通常依赖Microsoft Visual C++ Redistributable运行库。如果用户电脑上没有,游戏会启动失败,提示缺少
卸载清理([UninstallDelete]段 - 未在上例列出,但很重要):
- 如果你的游戏会在
AppData等目录生成存档、配置文件或日志,你希望卸载时一并删除,可以添加[UninstallDelete]段。但请务必小心,避免误删用户的其他重要文件。通常建议游戏存档等用户数据不予删除。
- 如果你的游戏会在
4.4 编译与测试
脚本修改保存后,在Inno Script Studio中直接按F9,或使用Inno Setup Compiler打开该脚本并点击“编译”按钮,即可生成安装程序(.exe文件)。
测试流程至关重要:
- 在本机测试安装:运行生成的安装包,按照向导一步步走,观察文件是否安装到了正确位置,快捷方式是否创建。
- 运行游戏:安装完成后,从开始菜单和桌面快捷方式分别启动游戏,确保能正常运行。
- 测试卸载:通过控制面板的“程序和功能”或开始菜单的卸载快捷方式进行卸载。检查安装目录、开始菜单项、桌面快捷方式是否被完全移除。同时确认用户数据目录(如
AppData)下的文件是否按预期处理(保留或删除)。 - 在纯净虚拟机中测试:这是最最最重要的一步!准备一个全新的、只安装了Windows操作系统的虚拟机(可以使用VMware或Hyper-V)。在这个环境中运行你的安装包,模拟真实用户第一次安装的场景。这是发现运行库缺失、系统组件依赖等问题的最有效方法。如果游戏启动失败,根据错误信息(如缺少
.dll)回头补充相应的依赖包到安装程序中。
5. 进阶优化与疑难排解
掌握了基础流程后,我们可以让安装包变得更专业、更友好。
5.1 自定义安装界面
Inno Setup默认的Modern Wizard界面已经很清爽了,但你还可以进一步定制。
- 更换图片:在
[Setup]段使用WizardImageFile和WizardSmallImageFile来设置安装向导左侧的横幅图片和顶部小图标。 - 修改颜色和字体:可以通过
[Code]段编写Pascal脚本,在InitializeWizard事件中动态修改界面控件的属性。 - 添加自定义页面:例如,可以添加一个页面让用户选择是否安装“高清纹理包”或“多人游戏组件”,根据选择来动态决定复制哪些文件。这需要较深的脚本知识,但社区有大量示例。
5.2 处理复杂的依赖关系
除了VC++运行库,你的游戏可能还需要:
- .NET Framework / .NET Desktop Runtime:如果你的游戏或启动器使用了.NET(非Unity内置的Mono/.NET Standard),可能需要它。检查方式类似,通过注册表或检查文件是否存在。安装包可以从微软官网下载。
- DirectX End-User Runtimes:现代Unity通常不需要,因为其依赖的DirectX组件已随Windows或显卡驱动安装。但对于一些老游戏或特定图形API,可能仍需打包
DXSETUP.exe。 - XNA Framework (已淘汰):一些非常老的项目可能需要,现在基本不用考虑。
策略建议:对于独立游戏,最稳妥(也最省事)的办法是,在游戏启动器或主菜单的第一个界面,用友好的文字提示用户:“本游戏需要VC++ 2019运行库,如果遇到启动问题,请点击此链接下载安装。”并附上微软官方链接。将依赖检查的责任后置,可以简化安装包,避免法律和兼容性问题。
5.3 版本更新与增量更新
Inno Setup本身支持基于版本号的升级安装。在[Setup]段设置AppVersion,并在[Files]段合理使用Flags: ignoreversion或onlyifdestfileexists等标志,可以实现在旧版本基础上安装新文件。
但对于游戏,特别是资源更新频繁的情况,更常见的做法是:
- 使用独立的启动器/更新器:安装包只安装一个小的启动器。启动器负责检查服务器上的游戏版本,并下载差异文件(增量更新)进行更新。这需要额外的网络编程。
- 使用Unity的Addressables或AssetBundle系统:将大部分资源放在网上,游戏运行时动态下载。这样安装包本体可以非常小,更新也灵活。
5.4 常见问题与排查技巧实录
以下是我在多年打包过程中踩过的坑和总结的排查清单:
| 问题现象 | 可能原因 | 排查与解决方案 |
|---|---|---|
| 安装后双击游戏无反应,或闪退 | 1. 缺少VC++运行库。 2. 显卡驱动太旧或不支持。 3. 系统用户名或安装路径包含中文/特殊字符。 4. 杀毒软件误拦截。 | 1.在纯净虚拟机测试,查看Windows事件查看器(Event Viewer)中应用程序日志的具体错误代码。缺少运行库会有明确提示。 2. 检查Unity打包时的Graphics API设置(如DX11, DX12, Vulkan),是否与目标机器兼容。可尝试在Player Settings中关闭“Auto Graphics API”,指定一个保守的API(如仅DX11)。 3. 确保从Unity打包出的原始文件夹在路径无中文的目录下就能运行。这是前提。 4. 将游戏主exe和UnityPlayer.dll添加到杀毒软件白名单。 |
| 安装程序运行时提示“无法访问网络位置” | 防病毒软件或Windows Defender实时保护阻止了安装程序解压临时文件。 | 暂时禁用实时保护,或尝试以管理员身份运行安装程序。确保临时目录(%temp%)有写入权限。 |
| 卸载后,用户存档/设置文件也被删除了 | 在[UninstallDelete]段中误删了AppData等目录下的文件。 | 仔细审查[UninstallDelete]脚本。通常用户数据应保留。可以考虑在安装时,在AppData下创建存档目录,卸载时不删除它。更好的做法是让游戏第一次运行时在AppData创建存档目录,这样安装程序完全不用关心用户数据。 |
| 安装包在32位系统上无法安装 | 脚本中设置了ArchitecturesAllowed=x64,限制了只能安装在64位系统。 | 如果你的游戏有32位版本,需要编译两个安装包,或者制作一个包含双版本、能自动检测系统位数的安装包(这需要复杂的脚本)。现在绝大多数PC游戏都已放弃32位支持。 |
| 游戏运行时提示“找不到Steam API”或类似 | 项目使用了Steamworks等第三方SDK,但打包时未正确包含或配置其动态库。 | 确保Unity打包时,所有必需的第三方DLL(如steam_api64.dll)都位于Plugins文件夹的正确位置(x86或x86_64),并且被打包进最终的输出文件夹。在Inno Setup脚本中,确保这些DLL文件也被包含在[Files]段。 |
| 安装过程很慢 | 1. 安装包使用了超高强度压缩(如lzma2/ultra)。 2. 用户电脑性能较差。 3. 要解压的文件数量极多(如大量小文件)。 | 1. 权衡压缩率和安装速度。对于几十GB的大型游戏,使用Compression=lzma2/fast可能比/ultra更合适。2. 在安装界面提供提示信息。 3. Unity端使用LZ4压缩资源,本身就能极大减少文件数量(因为资源被打包成更少的bundle文件)。 |
最后的心得:制作安装程序不是一次性的工作,而是发布流程中的一环。建议将Inno Setup脚本纳入你的版本控制系统(如Git)。每次Unity项目更新、版本号变更后,只需修改脚本中的版本号和源文件路径,重新编译即可得到新的安装包。建立一个自动化的构建流水线(如使用Jenkins或GitHub Actions),将Unity打包、Inno Setup编译、上传到分发平台串联起来,能极大提升效率,减少人为错误。从“压缩包开发者”到拥有自己专业安装程序的创作者,这一步的提升,用户是能真切感受到的。