BepInEx 完整安装指南:5 分钟给 Unity 游戏加上模组
【免费下载链接】BepInExUnity / XNA game patcher and plugin framework项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx
BepInEx 是 Unity 与 .NET 游戏 Mod 化领域的事实标准插件框架:把一个编译好的 DLL 放进BepInEx/plugins目录,游戏启动时插件就会自动加载。它覆盖 Unity Mono、Unity IL2CPP 和 .NET(XNA、FNA、MonoGame)三类运行时,适合想给游戏加 Mod 的玩家,也适合想给游戏写插件的开发者。一个诚实的提醒先摆出来:📌 目前只有 Unity Mono 有稳定发布版,IL2CPP 版仍是实验性质,动手前要先判断你的游戏属于哪种运行时。
为什么"丢一个 DLL"就能生效
游戏的启动流程像一道旋转门,入口被游戏厂商握在手里。BepInEx 的做法是在这道门的最前端塞进一部"总机":
- 前台拦截:依赖 UnityDoorstop(v4.5.0)在游戏正式启动流程开始前"截胡",把执行权转交给 BepInEx 的预加载器。
- 类型重建:Mono 游戏里 C# 程序集(IL 字节码)原样随包发布,图纸就在盒子里,想打补丁直接照图纸改;IL2CPP 游戏则把 C# 编译成了原生 C++,图纸已经被拆碎。BepInEx 先用 Cpp2IL 从成品逆向出图纸,再由 Il2CppInterop(v1.5.3)在运行时现场拼回类型,插件的调用才有落点。
10 秒判断两种游戏:游戏目录有Data/Managed/基本是 Mono;只有Data/Plugins/x86_64/这类原生库、没有 Managed,多半是 IL2CPP。
按场景选择你的安装路线
场景 A:常规 Unity Mono 游戏,直接装发布包
- 做什么:取最新发布包解压到游戏根目录,最终结构应为
BepInEx/core(框架核心 DLL)、BepInEx/plugins(你的插件 DLL 放这里),外加根目录的doorstop_config.ini和libdoorstop.so/.dll。 - 关键配置:
doorstop_config.ini核心只有三行。
[General] enabled = true target_assembly = BepInEx\core\BepInEx.Unity.Mono.Preloader.dll [UnityMono] dll_search_path_override = "BepInEx\core"enabled是总开关;target_assembly指向第一个被执行的程序集,路径错一个字符预加载器就静默失败;最后一行让 Mono 优先从BepInEx\core找核心库,避免踩到游戏自带的旧版本。
- 看到什么算成功:启动游戏(Linux/macOS 可直接用发行包里的
run_bepinex_mono.sh,它会自动处理LD_PRELOAD细节),确认两个信号:✅ 屏幕出现 BepInEx 控制台窗口;BepInEx/LogOutput.log里出现Chainloader initialized和逐条插件加载记录。游戏能进主界面不等于插件生效,一切以日志为准。
场景 B:想用最新版,从源码构建
- 做什么:备好 Git 和 .NET SDK(版本 ≥ 6.0),克隆仓库后跑官方构建脚本。
git clone https://gitcode.com/GitHub_Trending/be/BepInEx cd BepInEx ./build.sh --target MakeDist # Windows 用 build.cmd- 看到什么算成功:
bin/dist里生成带版本号的分发包 zip。三个 target(Compile/MakeDist/Publish)的区别写在 docs/BUILDING.md。 - ⚠️ 两个坑:只装 .NET运行时不算数,构建需要完整 SDK;IL2CPP 文档里提到的 "dotnet-runtime 6.0.7" 是打包进游戏目录的运行时,和你构建机的 SDK 是两回事。另外游戏路径带中文或特殊字符时部分游戏加载程序集会失败,游戏目录保持纯英文。
场景 C:挑战 IL2CPP 实验版
- 做什么:安装方式同 A,但
doorstop_config.ini里target_assembly改指向BepInEx\core\BepInEx.Unity.IL2CPP.dll,并填[Il2Cpp]段的coreclr_path(coreclr.dll 所在位置)和corlib_dir(托管核心库目录)。 - 看到什么算成功:同 A——控制台窗口弹出、日志出现
Chainloader initialized。 - ⚠️ 诚实提醒:IL2CPP 属实验性质,不支持 macOS 与 ARM;两种运行时的默认配置模板都在 Runtimes/Unity/Doorstop/,照着抄即可。
出问题时的速查表
| 现象 | 最可能原因 | 一招确认 |
|---|---|---|
日志不存在或很短,没有Chainloader initialized | Doorstop 没接上,BepInEx 压根没启动 | grep -E "enabled\|target_assembly" doorstop_config.ini,再ls BepInEx/core/确认目标 dll 真实存在 |
| 游戏正常进主界面但 Mod 没反应 | 总开关是 false,或target_assembly路径写错 | 修正后重启,日志重新生成即说明拦截成功 |
日志有Chainloader initialized但某插件没加载 | 版本不匹配、GUID 非法、依赖缺失,插件被跳过 | 找日志里Skipping那条指向哪个插件;过滤规则在 BepInEx.Core/Bootstrap/BaseChainloader.cs,原因基本都能对到日志出处 |
| 启动脚本直接报 PE32(Linux) | 你运行的是 Windows 游戏 | 对主程序跑file,显示 PE32 即平台装错,需要 Windows 版 BepInEx 或走 Wine/Proton |
| IL2CPP 游戏起不来 | coreclr_path指向的文件不存在,或平台不支持 | 检查该路径文件是否真实存在;macOS 用户请换到 Windows |
继续深挖的位置
| 模块 / 文档 | 里面有什么 |
|---|---|
| BepInEx.Core/Bootstrap/BaseChainloader.cs | 链式加载器:GUID 校验、依赖排序、加载顺序,全在这一份文件里 |
| BepInEx.Preloader.Core/ | 游戏主逻辑之前先跑的预加载器核心,负责接管启动流程、应用运行时修复 |
| Runtimes/Unity/ | Mono 与 IL2CPP 两套运行时适配层,外加 Doorstop 配置模板和启动脚本 |
| docs/BUILDING.md | 构建目标、依赖拉取与打包细节 |
走向哪里
BepInEx 把"给闭源游戏加模组"从一套逆向工具链压缩成"丢一个 DLL 进 plugins"。它的价值在三层分工:Doorstop 管进门,链式加载器管插件生命周期,运行时适配层抹平 Mono 与 IL2CPP 的差异。对玩家它是装 Mod 的入口,对开发者它是最成熟的 Unity 插件开发基座。接下来值得盯两件事:IL2CPP 支持能否从实验版走向稳定,以及随内置 dotnet-runtime 版本演进,IL2CPP 环境的兼容边界会持续扩大。想深入社区协作方式,看 docs/CONTRIBUTING.md。
【免费下载链接】BepInExUnity / XNA game patcher and plugin framework项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考