☰
REFramework:RE Engine 游戏的 Mod Loader 与 Lua 脚本平台,4 条命令跑通第一个脚本
2026/10/15 3:05:29 网站建设 项目流程

REFramework:RE Engine 游戏的 Mod Loader 与 Lua 脚本平台,4 条命令跑通第一个脚本

【免费下载链接】REFrameworkMod loader, scripting platform, and VR support for all RE Engine games项目地址: https://gitcode.com/GitHub_Trending/re/REFramework

REFramework 是面向 RE Engine 全家桶(生化危机系列、怪物猎人、鬼泣 5、街霸 6、鬼泣、死亡之屋重制等 18 款游戏)的 Mod Loader、Lua 脚本平台和 VR 支持框架。它把自己伪装成 DirectInput 的dinput8.dll,搭着游戏的渲染循环进来,把一套能直接读写游戏对象的脚本 API 交到你手里——FOV 滑块、自由相机这些内置 Mod 解压即生效,想改游戏行为就写几行 Lua。

它是什么 & 为什么值得试

一句话:它是 RE Engine 游戏的"Mod 加载器 + 反射式脚本层 + VR 运行时"三合一,灵感来自 Kanan 并复用了部分代码(README 里写得明明白白)。对调参党来说,内置 Mod 已经够用;对想动手的人来说,它最大的卖点是你不需要知道任何字段偏移量——按类型名和字符串名调方法就行。

最小可运行路径(5 行以内):

# 1. 从 Releases 页下载最新 zip(链接见 [README](https://link.gitcode.com/i/7a9623761a1b0858b278334ff004980b)) # 2. 非 VR:只解压 dinput8.dll 到游戏安装目录 # 3. VR:装好 SteamVR,整个 zip 解压到游戏安装目录 # 4. Proton/Linux:Steam 启动选项加 WINEDLLOVERRIDES="dinput8.dll=n,b" %command% # 5. 启动游戏,DirectX 11/12 通吃

一句话总结:别人给你的是"怎么改游戏的说明书",它给你的是"改游戏的能力"。

按场景走

第一次跑起来:文件放对位置,Proton 有个坑

非 VR 场景下只需dinput8.dll一个文件,整包解压容易把一堆 VR 相关的 DLL 带进游戏目录,没必要。VR 则相反,需要整个包。README 里还顺手列了几个内置修复——RE8 开局崩溃、RE8 击杀/受伤卡顿、MHRise 的第三方 DLL 崩溃——如果你的游戏本来就修不好这些,加载器本身就回本了。

⚠️ 有个容易忽略的行为:检测到联机对战时框架会主动卸载所有已加载的脚本(ScriptRunner.cpp里写死了这个逻辑)。单机 Mod 没问题,别指望它在线上用。

写第一个 Lua 脚本:从 reframework/autorun 到渲染循环

脚本放在持久目录下的reframework/autorun/,框架启动时会把这个目录里的所有.lua全量加载并注册进 Lua 的package.path。仓库里 scripts/ 目录就是现成的范本库,scripts/utility/ 里还有GameObject.lua、Statics.lua这类工具库,require("utility/Statics")直接复用。

核心模式只有三步:找类型、拿方法、挂在游戏入口上:

local td = sdk.find_type_definition("via.Transform") local get_position = td:get_method("get_Position") re.on_application_entry("UpdateMotion", function() -- 游戏每帧的 UpdateMotion 入口触发一次 end)

实际脚本里就是这么写的,比如 re2_smooth_movement.lua 里缓存了一堆get_Position/set_Rotation方法引用,再在UpdateMotion回调里做 EMA 平滑。可用的挂载点还有re.on_frame、re.on_draw_ui、re.on_pre_application_entry,钩子里能返回sdk.PreHookResult.SKIP_ORIGINAL这类结果来拦截原逻辑。改完不用重启,菜单里有 Reset scripts 按钮,或者重载场景即可。

编译框架源码:从 CMake 到指定游戏目标

只想跑 Mod 的看到这里就可以关掉了;要改框架或写 C++ 插件的,环境要求很干脆:C++23、Visual Studio 2022 起步、CMake,官方明说"其他编译器没测过"。四条命令:

git clone https://gitcode.com/GitHub_Trending/re/REFramework git submodule update --init --recursive cmake -S . -B build -G "Visual Studio 18 2026" -A x64 -DCMAKE_BUILD_TYPE=Release cmake --build ./build --config Release --target RE2

最后一条的--target RE2是关键——每个游戏是独立构建目标,不带 target 会全量编译,慢得能泡杯咖啡。COMPILING.md 里还有 VSCode CMake Tools 的流程和build_vs2022.bat一键全量脚本。

C++ 或 C# 写插件:两个入口,一条目录规则

C++ 插件的规则很简单:DLL 丢进持久目录的reframework/plugins/,PluginLoader会扫描目录里所有.dll,调用你导出的reframework_plugin_required_version检查版本,再调reframework_plugin_initialize拿初始化参数——之后你注册on_present(每帧画 UI)、on_lua_state_created(给 Lua 注入自定义全局函数)等回调即可。examples/example_plugin/ 是完整的可编译样例,连 ImGui 的 D3D11/D3D12 双后端初始化都写好了。

走 C# 的话看 csharp-api/:REFrameworkNET是托管层,测试项目 csharp-api/test/Test/ 里每个游戏一份(TestRE2.cs、TestMHWilds.cs……),[MethodHook]属性直接挂在生成的引用程序集类型上:

[MethodHook(typeof(app.CameraManager), nameof(app.CameraManager.isInside), MethodHookType.Pre)] public static PreHookResult isInsidePreHook(Span<ulong> args) => PreHookResult.Continue;

引用程序集不是手写的,AssemblyGenerator会根据 TDB 现场生成。本地联调用make_symlinks.py --gamedir=<游戏目录>把构建产物软链到游戏目录(要管理员权限,requirements.txt里就一个fire)。测试工程还带了 WebAPI 控制台和 MCP server 的管道代码(test/Test/WebAPI/),说明官方自己在往"游戏状态可被外部程序消费"的方向走。

顺带一提,dependencies/里打包了 imnodes 节点编辑器组件,框架代码里也有 imnodes 的初始化与清理调用,开发者工具的图形化能力有这块打底。

机制拆解

为什么不用手写偏移量:TDB 反射是整套设计的地基

RE Engine 的托管类型系统自带一套叫 TDB(Type Definition Database)的描述格式。框架启动时把它解析成内存里的类型库——每个方法、字段、属性、单例都有名字和签名,版本号还分游戏(RE2 是 tdb70、RE4 是 tdb71、RE9 已经到 tdb83,shared/sdk/regenny/下各游戏的生成头文件目录名直接写明了)。

这套东西解决的真实痛点是版本漂移。比如角色骨骼链的碰撞数据,TDB 71 以下在偏移0x58,71 及以上挪到了0x60(ChainViewer.cpp 的注释里原话记录了这个坑)。手写偏移的代码每次游戏更新就报废;REFramework 的做法是按类型名+方法名字符串在运行时查表分发,ViaDispatch.hpp、GameIdentity.hpp这类文件负责按 TDB 版本路由到对应布局。你写脚本时看到的是sdk.find_type_definition("via.Transform"):get_method("get_Position"),偏移量的存在与否根本进不了你的上下文。代价是调用比直调慢一点,但对脚本场景完全无感。

为什么是 dinput8.dll:借 DirectInput 的壳,借渲染循环的心跳

注入点选dinput8.dll是因为它零配置:游戏本来就加载 DirectInput 库,你把文件往那儿一放,DLL 就进进程了,不需要改 loader、不需要驱动。但光注入还不够,框架还需要一个稳定的"心跳"来驱动 UI 和脚本回调。答案在 src/D3D11Hook.cpp 和 src/D3D12Hook.cpp:钩住 DX 的 Present,每帧触发on_present——ImGui 界面在这里画,Lua 的on_frame在这里跑,VR 的覆盖层也挂在这条链上(OpenVR/OpenXR 运行时抽象在 src/mods/vr/runtimes/)。选 Present 当心跳而不是自造定时器,好处是节奏天然和渲染帧一致,on_device_reset时 ImGui 上下文还能整体重建,状态不悬空。

决策参考

路线适合代价
Lua 脚本调参、改游戏对象、快速试错,改完即生效跑在主线程渲染循环里,重计算会直接掉帧
C++ 插件 DLL性能敏感逻辑、渲染层操作、常驻 ImGui UI要编译,导出函数和初始化流程不能少
C# / REFrameworkNET强类型、写 MethodHook、复用 .NET 生态依赖 AssemblyGenerator 生成的引用程序集,链路多一环

换方案的信号也很明确:

  • 游戏不在支持列表(RE2/3/4/7/村庄/ requiem、DMC5、SF6、MH 系、DD2 等 18 款之外)——框架的生成头文件和钩子都是按游戏定制的,没有银弹
  • 带反篡改的 REENGINE_AT 游戏:框架有IntegrityCheckBypass模块且只对这类游戏启用,但你仍要接受"过校验"这件事本身的存在
  • 要纯静态分析、不碰运行时:走 reversing/ 下的 rsz dumper(Unicorn 模拟反序列化链推结构布局)和 pathdumper,注意 rsz 工具链要求 Python ≤ 3.9
  • 想跨引擎通用:这套 TDB 反射深度绑定 RE Engine 的类型格式,离开这个引擎就没有复用价值

下一步

  • 构建细节:COMPILING.md;脚本范本:scripts/
  • C++ 插件模板:examples/example_plugin/;C# 测试工程:csharp-api/test/Test/
  • 逆向工具链:reversing/(dumper、IDA 命名脚本、PAK 路径提取)
  • 完整 Lua API 文档和最新构建,链接都放在 README 里

【免费下载链接】REFrameworkMod loader, scripting platform, and VR support for all RE Engine games项目地址: https://gitcode.com/GitHub_Trending/re/REFramework

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

立即咨询