
1. 项目概述为什么你需要BepInEx如果你玩过一些基于Unity引擎开发的PC游戏比如《雨中冒险2》、《英灵神殿》或者《星露谷物语》的某些社区版本你很可能已经接触过“模组”这个概念。模组或者说插件能彻底改变一个游戏的玩法、外观甚至核心机制让一款已经通关的游戏焕发第二春。但你是否想过这些神奇的修改是如何“注入”到游戏程序里的为什么有些游戏装模组特别简单有些却异常复杂甚至需要你手动修改游戏文件这背后的核心工具就是BepInEx。它不是一个具体的模组而是一个框架一个为Unity游戏以及部分其他.NET框架游戏量身打造的“插件加载器”和“运行时补丁平台”。你可以把它想象成一个“万能插座”游戏本身是电源而各种模组就是需要通电的电器。BepInEx负责安全、有序地把这些“电器”连接到“电源”上让它们能正常工作而不会因为胡乱接线导致短路游戏崩溃。简单来说BepInEx解决了模组制作者和玩家最头疼的几个问题如何让游戏在启动时自动加载外部代码如何让多个模组和平共处而不冲突如何提供一个标准化的环境让模组开发变得简单它通过一系列精妙的技术手段在游戏启动的早期阶段介入修改游戏的内存和代码执行流程为后续的插件加载铺平道路。对于玩家而言它的价值在于将复杂的模组安装过程标准化为“解压到游戏根目录”这样简单的操作对于开发者而言它提供了一套稳定的API和工具链让开发者可以专注于模组功能本身而不是如何“黑进”游戏。所以无论你是一个想给自己喜欢的游戏添加点新乐趣的玩家还是一个有志于为游戏社区贡献内容的模组开发者理解并掌握BepInEx都是通往“自定义游戏体验”大门的第一把钥匙。这篇指南将带你从零开始彻底搞懂BepInEx的来龙去脉、安装部署、核心原理以及实战应用。2. BepInEx核心架构与工作原理拆解在把BepInEx扔进游戏文件夹之前我们有必要花点时间了解一下它到底是怎么工作的。知其然更要知其所以然这不仅能让你在遇到问题时快速定位也能让你明白哪些操作是安全的哪些可能会玩坏你的游戏。2.1 核心组件一个精密的“启动拦截器”BepInEx不是一个单一的程序它由几个协同工作的核心组件构成像一个精密的流水线Doorstop门挡这是整个流程的“先锋官”。它是一个非常小的原生程序通常是winhttp.dll或doorstop_config.ini配合一个原生库通过操作系统的机制如Windows的DLL劫持或Linux的LD_PRELOAD在游戏主程序UnityPlayer.dll或游戏可执行文件启动的瞬间被优先加载。它的唯一任务就是劫持游戏进程的控制权转而加载BepInEx的核心引导程序。BepInEx Preloader预加载器这是由Doorstop加载的第一个.NET组件。它运行在一个非常早期的环境里甚至比游戏自己的大部分代码都要早。它的核心工作包括环境准备设置.NET运行时所需的程序集解析路径确保BepInEx自身的库能被正确找到。程序集修补使用MonoMod或HarmonyX等工具对游戏的核心程序集Assembly-CSharp.dll等进行内存中的修改即打“补丁”。这不是永久性修改硬盘文件而是运行时动态修改因此对游戏本体是安全的。插件管理器初始化为后续的插件加载准备好运行环境。BepInEx Core核心运行时预加载器工作完成后就会将控制权交给核心运行时。这是BepInEx的“大脑”它负责管理插件生命周期从BepInEx/plugins目录发现、加载、初始化所有插件。提供公共服务向所有插件暴露统一的日志接口、配置系统、事件挂钩等。协调Harmony补丁管理使用Harmony库的插件确保它们的补丁有序应用和清理。插件Plugins这才是实现具体功能的单元也就是我们常说的“模组”。每个插件都是一个独立的.NET类库DLL文件包含一个继承自BaseUnityPlugin的主类。BepInEx Core会实例化这个类并调用其Awake()、Start()、Update()等生命周期方法让插件代码“寄生”在游戏的主循环中运行。注意这里有一个关键区别。广义上的“模组Mod”可能包含多种形式比如替换游戏资源贴图、模型的“资源模组”或者用其他语言如Lua编写的脚本。BepInEx原生主要管理的是“插件Plugin”即编译好的.NET DLL代码模组。资源替换等功能通常由其他专门插件如UnityExplorer或AssetBundle加载器在BepInEx框架内提供支持。2.2 工作流程一次完美的“潜入”让我们跟踪一次完整的游戏启动过程你双击游戏图标。操作系统启动游戏进程并由于Doorstop的配置首先加载了winhttp.dllDoorstop。Doorstop立即行动它不执行原来的功能而是找到并加载BepInEx/core/BepInEx.Preloader.dll。Preloader开始工作它扫描BepInEx/patchers和BepInEx/core目录加载必要的工具库如HarmonyX然后对游戏刚刚加载到内存中的程序集进行动态修补插入一些“钩子”函数。修补完成后Preloader加载BepInEx/core/BepInEx.dll核心运行时。核心运行时启动读取BepInEx/config下的配置文件然后扫描BepInEx/plugins目录下的所有DLL文件。对于每个有效的插件DLL核心运行时反射出其主插件类创建实例并依次调用Awake()最早、Start()稍晚等方法。此时插件代码开始正式运行它们可以通过之前Preloader打下的“钩子”来修改游戏行为、添加新界面、监听游戏事件等。所有插件初始化完毕控制权完全交还给游戏原来的启动流程。对你来说游戏画面出现看起来和原版一样但内部早已“注入”了新的灵魂。这个过程之所以稳定是因为它主要发生在内存层面并遵循严格的顺序。BepInEx的设计目标之一就是“非侵入性”理想情况下移除BepInEx文件夹游戏就能恢复纯净状态。2.3 为什么是BepInEx与其他工具的对比在Unity模组领域除了BepInEx你可能还听说过MelonLoader、UnityModManager等。它们都是优秀的框架但各有侧重。BepInEx可以看作是“底层框架”或“引擎”。它更接近原生提供了最基础的插件加载和补丁能力兼容性极广支持Mono和IL2CPP两种脚本后端。它的哲学是“提供稳固的基础设施”很多其他高级管理器如部分游戏的Mod管理界面实际上是基于BepInEx开发的插件。适合追求稳定、兼容性或需要为IL2CPP游戏很多较新或移动端移植的Unity游戏使用此技术制作模组的场景。MelonLoader更偏向于“一体化的模组加载与管理环境”。它内置了用户界面、模组配置菜单、日志查看器等对玩家更友好。早期主要支持Mono后续版本也加强了对IL2CPP的支持。适合希望开箱即用、有图形化管理界面的玩家以及为此框架生态开发的模组。UnityModManager (UMM)历史更悠久以配置简单、对特定游戏如《开拓者拥王者》、《侠客风云传》等集成度高而闻名。它通常为每个游戏提供专门的安装器。其底层有时也会依赖BepInEx或类似技术。适合其官方支持列表内的游戏安装通常更一键化。选择建议对于一款你想打模组的Unity游戏首先查看其模组社区的主流选择。如果社区普遍使用BepInEx插件那么安装BepInEx就是第一步。BepInEx的通用性使其成为许多模组的基石。3. 从零开始BepInEx的安装与配置详解理论说得再多不如亲手装一遍。我们以最经典的Windows平台、Unity Mono后端游戏为例讲解标准安装流程。这是你后面一切操作的基础。3.1 安装前的关键准备确定游戏信息找到你的游戏根目录。通常通过Steam库“管理”-“浏览本地文件”即可。你需要知道两件事游戏使用的Unity版本和脚本后端虽然BepInEx 5.x对Mono后端通用性很好但知道这些信息有助于排查极端兼容性问题。一个简单的方法是查看游戏根目录下是否有UnityPlayer.dll通常有和GameAssembly.dll如果有则是IL2CPP后端。本文主要针对更常见的Mono后端有UnityPlayer.dll而无GameAssembly.dll。游戏是否已安装其他模组框架如果游戏已经安装了MelonLoader等强行安装BepInEx可能导致冲突。通常需要先完全清理旧框架。下载正确的BepInEx版本前往BepInEx的GitHub发布页从提供的资料中可知项目地址。对于绝大多数Unity Mono游戏直接下载BepInEx_x64_5.x.x.x.zipx64指64位游戏或BepInEx_x86_5.x.x.x.zip32位游戏即可。版本号选最新的稳定版如5.4.23.5。5.x版本是当前最成熟稳定的主线。如果你的游戏是IL2CPP后端多见于较新或移动端移植游戏则需要下载专门为IL2CPP构建的版本通常是BepInEx_unhollowed_corlib_...或标明IL2CPP的版本并且安装步骤会更复杂可能需要额外的interop库。备份你的游戏存档这是一个好习惯。虽然BepInEx本身很安全但某些编写不当的模组可能会导致存档损坏。备份游戏根目录\BepInEx文件夹和你的游戏存档文件夹通常位于C:\Users\[你的用户名]\AppData\LocalLow\[游戏开发商]\[游戏名]。3.2 标准安装步骤以《星露谷物语》为例假设我们的游戏是64位的《星露谷物语》安装在D:\Games\Stardew Valley。解压将下载的BepInEx_x64_5.4.23.5.zip文件全部解压。复制打开解压后的文件夹你会看到如下结构的文件和文件夹BepInEx/ ├── core/ (BepInEx核心运行时库) ├── patchers/ (预加载修补器通常为空高级用户使用) ├── plugins/ (**这是你将来放模组DLL的地方**) ├── config/ (BepInEx及各插件的配置文件) └── cache/ (缓存文件) doorstop_config.ini (Doorstop配置文件) winhttp.dll (Doorstop for Windows x64) changelog.txt README.md将所有这些文件和文件夹全部选中复制或拖拽到你的游戏根目录D:\Games\Stardew Valley下。如果系统询问是否合并或替换文件选择“是”或“替换”。首次运行直接像往常一样启动游戏例如通过Steam启动或双击Stardew Valley.exe。游戏可能会黑屏片刻比平时稍长这是正常的BepInEx正在初始化。如果成功游戏将正常启动。验证安装进入游戏主菜单或随便创建一个存档进入游戏然后正常退出。再次打开游戏根目录检查BepInEx文件夹。如果安装成功你会看到里面多出了一些文件最重要的是LogOutput.log日志文件和config文件夹下生成的BepInEx.cfg。打开LogOutput.log如果能看到类似[Info : BepInEx] BepInEx 5.4.23.0 - ...以及一系列加载插件初始时可能为0个的日志恭喜你BepInEx框架已经成功“潜伏”进你的游戏了。3.3 核心配置文件doorstop_config.ini精讲这个文件是Doorstop的指挥中心理解它能解决很多疑难杂症。用记事本打开它你会看到如下关键配置[General] # 是否启用Doorstop。如果设为falseBepInEx将不会被加载游戏以纯净模式运行。 enabled true # Doorstop需要拦截的目标DLL。对于Unity游戏99%的情况就是UnityPlayer.dll。 targetAssembly UnityPlayer.dll # 当Doorstop劫持成功后应该加载哪个DLL作为入口点默认就是BepInEx预加载器。 doorstopAssembly BepInEx\core\BepInEx.Preloader.dll # BepInEx核心库所在的目录。一般保持默认。 bepInExAssemblyDir BepInEx\core # BepInEx核心配置文件路径。一般保持默认。 bepInExConfigPath BepInEx\config\BepInEx.cfg常见调优与问题排查enabled false这是临时禁用所有BepInEx和模组的“安全开关”。当你怀疑某个模组导致游戏崩溃想测试是否是BepInEx本身问题时可以临时关闭它。targetAssembly错误极少数非标准Unity游戏可能使用不同的主DLL名。如果你确信BepInEx没生效没有生成日志可以尝试在游戏根目录寻找其他可能的DLL如GameAssembly.dll或游戏exe同名的dll进行替换。但这种情况非常罕见先不要动它。日志级别在BepInEx.cfg中你可以调整[Logging.Console]和[Logging.Disk]下的LogLevel。默认是Info。如果遇到问题可以改为Debug来获取更详细的日志但日志文件会变得非常大。实操心得安装后第一次运行游戏务必检查LogOutput.log。如果这个文件没有生成或者里面最后几行是错误信息说明BepInEx根本没有成功加载。此时检查doorstop_config.ini的enabled是否为true以及winhttp.dll是否存在于游戏根目录。对于某些使用了反作弊或特殊启动器的游戏可能需要将winhttp.dll重命名为游戏主程序依赖的某个特定系统DLL名如version.dll但这属于高级操作且可能违反游戏用户协议需谨慎。4. 插件的安装、管理与实战应用框架搭好了空房子不能住人。现在我们来填充“家具”——也就是各种功能插件模组。4.1 插件从哪里来模组发布站最主流的来源是Nexus Mods、GitHub Releases、ModDB以及各类游戏的专属模组社区如Thunderstore对于《英灵神殿》和《雨中冒险2》。识别有效插件一个标准的BepInEx插件通常是一个.dll文件。有时作者会提供一个完整的压缩包里面包含BepInEx文件夹结构。你需要做的就是将压缩包内的内容按照相同的文件夹结构合并到你的游戏根目录下的BepInEx文件夹里。核心原则plugins文件夹里的.dll文件就是插件本体。4.2 标准插件安装流程我们以安装一个虚构的“无限背包”插件UnlimitedInventory.dll为例下载插件包假设你下载到一个UnlimitedInventory_v1.2.zip。解压并检查结构解压后你可能会看到以下几种情况理想情况直接包含一个UnlimitedInventory.dll文件。常见情况包含一个BepInEx文件夹其下有plugins子文件夹里面放着UnlimitedInventory.dll。还可能有config、patchers等。复杂情况除了DLL还包含manifest.json、README.md、图标文件以及lib依赖库文件夹。部署文件对于第一种情况直接将UnlimitedInventory.dll复制到游戏根目录\BepInEx\plugins\。你可以在这里创建子文件夹来分类管理例如\BepInEx\plugins\InventoryMods\UnlimitedInventory.dllBepInEx会自动递归搜索。对于第二种情况将下载的BepInEx文件夹直接拖到游戏根目录选择合并所有文件和文件夹。对于第三种情况通常需要配合BepInEx的插件加载器如BepInEx.Packager或社区管理器。但大多数作者会提供明确的安装说明遵循即可。处理依赖许多插件依赖于其他基础库才能运行最常见的是BepInEx.Harmony如果你的BepInEx/core目录下没有0Harmony.dll或HarmonyX.dll而插件需要你需要单独下载Harmony库并放入BepInEx/core。不过现代BepInEx 5.x通常已内置HarmonyX。其他插件库如BepInEx.ConfigurationManager提供游戏内模组配置菜单、BepInEx.Console游戏内控制台等。这些通常也需要被放置在BepInEx/plugins或其特定目录。务必阅读插件的说明文档安装所有前置需求Prerequisites。启动游戏验证启动游戏进入后退出。查看LogOutput.log。搜索你的插件名如UnlimitedInventory。如果看到[Message: BepInEx] Loading [UnlimitedInventory v1.2]和[Info: UnlimitedInventory] Plugin loaded successfully!类似的成功加载信息说明安装成功。如果看到错误信息则需根据日志提示解决通常是缺少依赖。4.3 插件的配置与管理配置文件许多插件允许自定义设置。插件首次运行后通常会在BepInEx/config目录下生成一个以插件ID命名的.cfg文件例如com.yourname.unlimitedinventory.cfg。你可以用记事本编辑这个文件来修改设置。更友好的方式是安装ConfigurationManager插件它会在游戏中按F1键默认弹出一个图形化设置菜单可以实时调整所有支持插件的配置。插件管理启用/禁用最简单粗暴的方式就是直接从plugins文件夹中移除或移入对应的.dll文件。更优雅的方式是使用插件管理类模组但BepInEx本身不提供图形化的开关界面。更新插件直接覆盖旧的.dll文件即可。建议先删除旧版再放入新版避免残留。更新前最好备份一下旧的配置.cfg文件因为新版本配置项可能有变化。排查冲突如果游戏崩溃或模组失效可以采用“二分法”移出一半插件测试游戏如果问题消失说明问题模组在移出的那一半里再对这一半进行二分逐步定位冲突源。4.4 实战案例构建一个基础的模组环境假设我们想为《英灵神殿》安装几个基础模组安装BepInEx框架按照3.2节步骤将BepInEx x64版本放入《英灵神殿》游戏根目录。安装基础库插件BepInEx.ConfigurationManager用于游戏内配置。BepInEx.Console用于游戏内输入命令如果需要。从模组站下载这些插件将它们的DLL放入BepInEx/plugins。安装功能模组EquipmentAndQuickSlots分离装备栏和快捷栏。CraftFromContainers允许从附近箱子直接制作物品。同样下载后放入plugins文件夹。启动与配置启动游戏进入世界。按F1调出ConfigurationManager你会看到所有已安装插件的列表可以在这里方便地修改每个模组的参数比如调整容器搜索范围、快捷键等。验证与调试游玩测试功能是否正常。如果遇到崩溃查看LogOutput.log末尾的错误堆栈信息通常能明确指出是哪个插件出了问题。这个流程是绝大多数BepInEx模组游戏的通用玩法。框架负责底层加载各个插件负责实现具体功能管理工具提供便利性。5. 高级话题与疑难杂症排查指南当你熟练掌握了基本安装后可能会遇到一些更复杂的情况或想深入了解。这一章我们解决这些进阶问题。5.1 应对IL2CPP后端游戏IL2CPP是Unity将C#代码预编译为C的一种技术提高了性能和安全性但也让传统的Mono模组方式失效。BepInEx通过BepInEx.IL2CPP版本支持这类游戏。其安装流程与Mono版有显著不同识别游戏游戏根目录存在GameAssembly.dll和UnityPlayer.dll且通常没有MonoBleedingEdge文件夹。下载专用版本从BepInEx的GitHub Releases页面下载带有IL2CPP或unhollowed字样的版本例如BepInEx_unhollowed_corlib_win_x64_5.4.23.x.zip。关键步骤——生成Unhollowed库这是最核心的一步。IL2CPP游戏不直接暴露C#类库BepInEx需要先“反空心化”游戏自身的程序集。将BepInEx IL2CPP包解压到游戏根目录。首次运行游戏。BepInEx会检测到缺少unhollowed库并自动在BepInEx/unhollowed目录下生成一系列.dll文件。这个过程可能耗时几分钟游戏可能会卡住或黑屏请耐心等待直至游戏主界面出现。生成完成后正常退出游戏。后续安装插件IL2CPP插件需要专门为IL2CPP编译。将插件DLL放入BepInEx/plugins的方式不变但你必须确保插件本身支持IL2CPP。许多流行的Mono插件都有对应的IL2CPP版本或通用版本。注意事项IL2CPP模组的开发和使用门槛更高插件生态可能不如Mono丰富。首次生成unhollowed库必须成功如果失败检查日志确保游戏运行目录有写入权限且磁盘空间充足。有时需要以管理员身份运行一次游戏。5.2 插件开发环境浅析给有志者如果你想自己制作BepInEx插件需要以下准备开发工具Visual Studio 或 JetBrains Rider安装.NET Framework或.NET Core/Standard开发包。引用库在你的C#类库项目中需要引用BepInEx.Core.dll位于你安装的BepInEx的core目录下和0Harmony.dll或HarmonyX.dll如果你要使用补丁功能。项目结构创建一个类库项目编写一个继承自BaseUnityPlugin的主类。在Awake()方法中编写你的初始化代码。使用Harmony打补丁这是修改游戏原有代码的核心技术。你需要定义“前缀”Prefix、“后缀”Postfix或“置换”Transpiler方法来在目标方法执行前、后或中间插入你的逻辑。编译与测试将编译出的DLL放入游戏的BepInEx/plugins进行测试。调试通常依靠Debug.Log输出到BepInEx的日志文件。这是一个非常专业的领域需要扎实的C#和Unity知识以及对目标游戏代码结构的逆向分析能力。建议从研究现有开源插件的代码开始。5.3 常见问题排查速查表遇到问题不要慌按照以下步骤排查能解决90%以上的问题问题现象可能原因排查步骤与解决方案游戏完全无法启动无任何反应或瞬间闪退。1. BepInEx版本与游戏不兼容如x86/x64弄错。2. Doorstop配置错误或冲突。3. 游戏反作弊或保护机制阻止。1. 检查游戏是32位还是64位下载对应BepInEx版本。2. 临时设置doorstop_config.ini中enabledfalse如果游戏能正常启动则是BepInEx问题。检查winhttp.dll是否存在或尝试重命名为version.dll需同时修改ini中targetAssembly。3. 查看Windows事件查看器或游戏根目录下是否有*.dmp崩溃转储文件。某些在线游戏禁止模组此类情况无法解决。游戏能启动但BepInEx文件夹内没有生成LogOutput.log。BepInEx根本未加载。1. 确认doorstop_config.ini中enabledtrue。2. 确认游戏根目录下有winhttp.dll和doorstop_config.ini。3. 对于某些Steam游戏尝试将启动参数设为空或尝试以管理员身份运行。日志中有Failed to load [XXX] because ...或Missing dependency ...错误。插件缺少依赖库。1. 仔细阅读出错插件的发布页面安装所有标注的“前置需求Requirements/Dependencies”。2. 常见的依赖如BepInEx.Harmony、MMHOOK游戏特定事件库等需要放到指定位置通常是BepInEx/plugins或BepInEx/core。插件加载成功日志显示但游戏内功能不生效。1. 插件版本与游戏版本不匹配。2. 插件需要特定配置或按键激活。3. 与其他插件冲突。1. 检查插件是否支持你当前的游戏版本。2. 查看插件说明确认默认快捷键或配置项。安装ConfigurationManager检查插件配置。3. 用“二分法”禁用其他插件测试是否冲突。游戏运行一段时间后崩溃。1. 某个插件有内存泄漏或逻辑错误。2. 多个插件修改了同一游戏方法产生冲突。1. 查看LogOutput.log末尾的崩溃堆栈信息找到最后活动的插件。2. 更新所有插件到最新版。3. 如果崩溃随机尝试逐个禁用近期新增的或大型功能模组。安装BepInEx后游戏启动变慢很多。1. 首次运行生成缓存或unhollowed库IL2CPP。2. 安装了过多插件每个插件都在初始化。1. 首次慢是正常的后续启动会变快。2. 减少不必要的插件。检查是否有插件在Awake()中执行了耗时操作。最后的经验之谈保持你的BepInEx框架版本相对较新如5.4.x但不必盲目追求最新的预览版。对于插件优先选择更新及时、社区评价高的版本。每次大规模增删模组前后备份一次BepInEx文件夹和存档这是一个能为你节省大量重复劳动和时间的好习惯。模组的乐趣在于探索和定制但稳定的游戏体验是这一切的基础。祝你玩得开心创造属于自己的独特游戏世界。