ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

BepInEx 实战:3个动作把Unity插件框架从源码编译到跑通

BepInEx 实战:3个动作把Unity插件框架从源码编译到跑通 BepInEx 实战3个动作把Unity插件框架从源码编译到跑通【免费下载链接】BepInExUnity / XNA game patcher and plugin framework项目地址: https://gitcode.com/GitHub_Trending/be/BepInExBepInEx 是给 Unity 和 .NET 游戏用的模组框架它把 C# 插件直接注进正在运行的游戏进程不用改游戏一行代码。读完你能从源码编译出一份可用的 BepInEx并确认 mod 真正加载进了游戏3个动作每步都有日志可查。 先对号入座你是不是卡在这3种情况你往游戏的 plugins 目录里塞了 mod 的 DLL重启后游戏毫无变化日志只有 Preloader started 一行后面没有任何插件加载记录游戏一启动就退出或者控制台里根本看不到 BepInEx 的输出——说明注入那一层就没生效你想自己编译一份 BepInEx 6但跑完构建命令找不到产物在哪、也不知道该往游戏里拷什么命中任意一条就往下看。前两种按文中步骤排查10 分钟内基本能定位第三种走动作一就能拿到完整发布包。30秒环境自检动手前把4项过一遍检查项合格标准怎么看.NET SDK6.0 或更高构建脚本的硬性要求见 docs/BUILDING.mddotnet --list-sdks输出里有 6.0.x 或更高游戏脚本后端Unity Mono仓库当前只有 Mono 有稳定发布IL2CPP 仍在实验阶段查游戏发行说明或对照 README 里的平台兼容表游戏架构x86 或 x64 的 Windows / Linux 可执行文件Linux 下file 游戏可执行文件出现 32-bit 或 64-bit 字样源码完整仓库根目录有 BepInEx.sln 和 build.shclone 完ls一眼可见 动手操作3个动作跑通全流程动作一拉源码编译出可发布包做什么一条命令 clone一条命令构建产物统一落在bin/dist/。怎么做git clone https://gitcode.com/GitHub_Trending/be/BepInEx cd BepInEx ./build.sh --target MakeDistWindows 上改用build.cmd --target MakeDist。构建脚本会先自动拉取依赖HarmonyX、MonoMod、Cecil 等再编译全部工程。怎么验证成功ls bin/dist能看到按平台分好类的发布包zip。目录不存在或为空说明构建中途失败往上翻构建日志找第一处红色报错。动作二部署到游戏目录打开加载开关做什么把发布包放进游戏根目录确认注入配置是开启状态。怎么做解压后游戏根目录应出现BepInEx/文件夹里面至少有core/框架本体和plugins/你的 mod 放这里检查根目录的doorstop_config.ini。Doorstop 是负责在游戏启动瞬间拦路的注入器它的默认配置模板在 Runtimes/Unity/Doorstop/ 里配置里两项必须对enabled truetarget_assembly指向BepInEx/core/BepInEx.Unity.Mono.Preloader.dll路径分隔符随平台Windows 用反斜杠怎么验证成功这一步没有日志全凭清单——文件夹结构和两个配置项都无误才算过。动作三启动游戏确认插件真的被加载做什么通过 BepInEx 启动游戏然后到日志里核对3个关键词。怎么做Linux / macOS 可直接用仓库自带的启动脚本可执行文件名作为第一个参数传入./run_bepinex_mono.sh ./YourGame.x86_64 tail -n 40 BepInEx/LogOutput.logWindows 直接双击游戏快捷方式即可。怎么验证成功日志里按顺序出现以下三组内容Preloader started——预加载器接管成功Chainloader initialized——框架核心就绪每个插件一行Loading plugin 插件名 版本最后一行是Loaded N plugin(s)的汇总N 应等于你放进 plugins 目录的插件数。N 为 0 时搜日志里的Skipping后面那句话就是跳过原因。它为什么能起作用4个模块接力游戏进程启动 └─ libdoorstop 拦截启动Doorstop 注入层 └─ Preloader 预加载器建日志、打运行时补丁 └─ Chainloader 链式加载器扫描 plugins/、排依赖顺序 └─ 你的插件BaseUnityPlugin.Awake() 开始执行注入层Doorstop游戏进程一启动就被它拦下执行权转交 BepInEx。这就是游戏没崩、却多出一个控制台窗口的来源预加载器Preloader抢在任何游戏代码之前就位先搭好日志和控制台再给 Mono 运行时打几个兼容补丁。UnityPreloader.cs 里打印的Running under Unity x.x.x就出自这一步链式加载器Chainloader核心逻辑在 BaseChainloader.cs。它扫描 plugins 下每个 DLL读取[BepInPlugin]特性里的 GUID、版本和依赖声明先按依赖关系排好顺序再逐个实例化。GUID 只允许字母、数字、.、_、-格式非法的插件会被直接跳过——这就是日志里Skipping的来源运行时适配Mono 和 IL2CPP 是两套独立实现。IL2CPP 版Runtimes/Unity/BepInEx.Unity.IL2CPP/net6.0靠互操作层重建托管类型系统思路类似但稳定性目前以 Unity Mono 为准❓ 常见问题插件为零和闪退先看这4处Q1日志停在 Preloader插件数是 0搜Skipping警告最常见三种GUID 含中文或空格、插件引用的 BepInEx 版本不匹配、DLL 套了子文件夹要直接平铺在 plugins 下。Q2游戏秒退连 BepInEx 日志都没有注入未生效。查doorstop_config.ini的enabled true以及target_assembly指向的 DLL 是否真实存在。Q3构建时报 SDK 或运行时版本错误构建项目要求 .NET 6.0 或更新的 SDK用dotnet --list-sdks确认IL2CPP 运行时还单独要求 net6.0 目标框架。Q4Mono 能跑的 mod换 IL2CPP 版就不行属预期行为。README 明确只有 Unity Mono 有稳定发布IL2CPP 支持仍在迭代先在 Mono 版游戏上验证你的插件逻辑。小结整条链路只有四步接力Doorstop 拦进程、Preloader 搭环境、Chainloader 装插件、你的 Awake 跑起来。下一步建议挑一个 Mono 版 Unity 游戏把动作三完整跑一遍确认Loaded N plugin(s)里 N 大于 0再回头研究依赖解析和 IL2CPP 运行时。【免费下载链接】BepInExUnity / XNA game patcher and plugin framework项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进