REFramework 开发指南:4 层架构与 Mod 工作流
REFramework 开发指南4 层架构与 Mod 工作流【免费下载链接】REFrameworkMod loader, scripting platform, and VR support for all RE Engine games项目地址: https://gitcode.com/GitHub_Trending/re/REFramework游戏更新一次RE 引擎 Mod 集体失效地址漂移硬编码 hook 全断改游戏逻辑只能硬啃引擎内存。REFramework 是覆盖全部 RE 引擎游戏的 Mod 加载器与 Lua 脚本框架同时支持 VR。它按职责把 hook、类型反射、脚本运行解耦成独立层版本更新只破坏其中一层其余保持稳定。REFramework 定位解决什么问题、边界在哪解决的问题让第三方代码以稳定方式接入 RE 引擎游戏的渲染循环、托管对象系统与输入流且不关心具体是哪款游戏。能力边界C 插件、Lua 脚本、ImGui 工具链与 VR 运行时共用同一套生命周期回调调度只 hook 与反射不重写游戏逻辑。覆盖范围生化危机 2/3/4/7/8/9、鬼泣 5、怪物猎人崛起/荒野、街头霸王 6 等使用 RE 引擎的作品。职责分层怎么拆从 hook 层到插件层整套 RE引擎Mod开发 的底座是一条自下而上的链路每层只对自己的输入输出负责。底层 hook 层src/D3D11Hook.cpp和src/D3D12Hook.cpp分别接管两套渲染后端的 Present 路径拿到每帧的渲染时机src/HookManager.cpp用 asmjit JIT 生成蹦床函数把 pre/post 回调和原始函数拼在一起shared/utility/FunctionHook.cpp负责真正的函数补丁。这样拆的原因所有游戏代码的入口在这一层收口上层完全不用关心 DX11 还是 DX12。类型反射层shared/sdk/RETypeDB.cpp和RETypeDefinition.cpp在运行时解析引擎自带的类型数据库按名字查类型、字段、方法不依赖任何编译期头文件。各游戏的差异被隔离到shared/sdk/ReClass_Internal_*.hpp系列shared/sdk/regenny/目录存放按游戏 dump 的类定义。这一层是整个框架抗版本更新的关键——偏移和虚表全部运行时解析。脚本运行时层src/mods/ScriptRunner.cpp管理 Lua 5.4 状态dependencies/lua/src/内置完整解释器src/mods/bindings/Sdk.cpp通过 sol2 把反射层对象暴露给脚本。hook 定义先进队列再由install_hooks统一安装避免在游戏线程执行中改动 hook 表。插件/工具层src/Mods.hpp定义了Mod基类on_frame、on_draw_ui、on_lua_state_created等回调构成每帧生命周期内置 Mod 位于src/mods/第一人称、自由镜头、VR外部 C 插件则由src/mods/PluginLoader.cpp加载 DLL 并调用include/reframework/API.h的统一入口。层级职责关键路径典型操作Hook 层接管渲染与函数入口src/HookManager.cppJIT 蹦床 pre/post 回调类型反射层运行时解析类/字段/方法shared/sdk/RETypeDB.cpp按名查类型、读字段脚本运行时层Lua 状态与 C 桥接src/mods/ScriptRunner.cppadd_hook 入队、install_hooks 安装插件/工具层生命周期与 UIsrc/Mods.hpp在 on_frame 里绘制 ImGui第一个 HUD 插件的 5 步落地路径任务在游戏画面上叠加一行自定义信息。全程只需要碰插件层和反射层。Step 1拿到核心骨架。克隆仓库https://gitcode.com/GitHub_Trending/re/REFramework按COMPILING.md构建核心 DLL 放入游戏目录。原因hook、反射、生命周期全部由核心框架提供插件只写业务逻辑不必重复造轮子。Step 2注册一个 Mod。继承src/Mod.hpp里的Mod基类重写on_frame()class MyHudMod : public Mod { void on_frame() override { ImGui::Text(HP: %d, m_hp); } };on_frame每帧在渲染线程的 ImGui 帧结束前执行这里画的内容直接叠在游戏画面上。Step 3取游戏数据。玩家对象不用手动定位——反射层按名查询C 侧走src/mods/bindings/Sdk.cpp的同一套 sdk 接口等价 Lua 写法是game:find_game_object_by_name(PlayerCharacter)再读健康值字段。原因名字到类型的映射由RETypeDB维护更新后重生成类定义即可地址不写死。Step 4挂配置项。声明ModToggle或ModSlider定义在src/Mod.hpp框架的on_config_load/on_config_save回调会自动完成持久化——IModValue接口统一了取值、画控件、读写配置三件事不用自己解析配置文件。Step 5双后端验证。把游戏切到 D3D12 重跑一遍并在on_device_reset()里重建自建资源。若直接操作渲染目标参考src/mods/vr/D3D11Component.cpp与D3D12Component.cpp的拆分方式。开发者模式下还能用 Graph Editor 可视化梳理对象间的数据流⚠️ 高频踩坑这些地方最容易翻车1. 更新后 hook 全断 → 根因是硬编码很多人把函数地址或字段偏移直接写进代码。正确做法是通过RETypeDB按名反射 shared/utility/FunctionHook.cpp的特征码定位类定义放在ReClass_Internal_*.hpp模板里按版本重生成。2. 在 on_present 里画 UI → 画不出来或花屏src/Mod.hpp的注释明确 on_present 阶段渲染目标已提交不能画 ImGui。UI 绘制只放在on_frame或on_draw_ui。3. Lua 与 C 边界模糊性能敏感的每帧逻辑塞进 Lua、每帧建表GC 一跑就掉帧src/mods/ScriptRunner.hpp里那一排 GC 预算参数就是为此准备的。正确边界热路径写 C 插件逻辑配置放 Luahook 用 add_hook 入队、install_hooks 统一安装。4. 跨帧缓存游戏对象裸指针托管对象随时可能被游戏 GC 销毁缓存的指针就是悬垂指针。每帧重新获取或用shared/sdk/intrusive_ptr.hpp的侵入式指针管理生命周期。延伸方向VR 支持src/mods/vr/下 OpenVR/OpenXR 运行时与 D3D12 命令上下文适合想把 Mod 搬进头显的人。RE 游戏 Mod 逆向reversing/rsz/资源 dumper 与reversing/scripts/ida_namer/的 IDA 重命名脚本适合想往引擎内部再挖一层的人。REFramework 插件开发以examples/example_plugin/为模板配合include/reframework/API.h适合做 Lua 覆盖不了的性能敏感功能。对象结构摸底src/mods/tools/ObjectExplorer.cpp的对象浏览器适合动手前先搞清游戏对象布局的人。回到开头那个痛点版本更新让 hook 全断根源是会随版本变的东西散落在各处。REFramework 把它们全部收进类型反射层其余各层因此保持稳定——这就是它作为 RE 引擎脚本框架在多游戏、多版本场景下依然可用的原因。【免费下载链接】REFrameworkMod loader, scripting platform, and VR support for all RE Engine games项目地址: https://gitcode.com/GitHub_Trending/re/REFramework创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考