☰
BepInEx 完整安装指南:5 分钟给 Unity 游戏加上模组
2026/10/16 2:45:55 网站建设 项目流程

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 initializedDoorstop 没接上,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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询