ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

UE4SS 的 GenerateLuaTypes 全局函数:为自定义 Lua 绑定一键生成类型定义

UE4SS 的 GenerateLuaTypes 全局函数:为自定义 Lua 绑定一键生成类型定义 游戏开发逆向工程【免费下载链接】RE-UE4SSInjectable LUA scripting system, SDK generator, live property editor and other dumping utilities for UE4/5 games项目地址https://gitcode.com/gh_mirrors/re/RE-UE4SS点击查看免费下载导读本文讲解 RE-UE4SS 项目中 Lua 全局函数GenerateLuaTypes()的用法、工作原理与实战场景。该函数会把游戏运行时内存中的 UClass、UScriptStruct、UEnum 等信息转译为可直接供 Lua 语言服务器解析的---class/---enum类型标注文件写入Mods/shared/types目录。读完本文你将掌握如何在 Lua Mod 中通过按键绑定或脚本调用触发类型生成理解其与 GUI 控制台 Dumpers 标签页按钮的等价关系以及生成器在源码层面的完整调用链与输出文件组织方式。GenerateLuaTypes 是什么GenerateLuaTypes是 UE4SS 提供给 Lua Mod 的全局函数用于为 Custom Lua Bindings自定义 Lua 绑定生成 Lua 类型定义文件。生成的类型文件位于Mods/shared/types目录下供开发者在编写 Lua Mod 时获得智能感知IntelliSense、补全与类型检查支持。其官方定义generateluatypes.md明确指出该函数的功能与 UE4SS Debugging Tools即 GUI Console 窗口中Dumpers标签页下的Generate Lua Types按钮完全一致——两者殊途同归最终都会触发同一套底层生成逻辑。在 UE4SS 的全局函数清单中docs/lua-api.mdGenerateLuaTypes()与GenerateSDK()、DumpAllObjects()、GenerateUHTCompatibleHeaders()等函数并列同属运行时转储/生成类 API。该函数由 UE4SS PR #664 引入是 Add GenerateLuaTypes function 变更的一部分。基本用法在 Lua Mod 中调用GenerateLuaTypes()不接受任何参数调用后会立即开始扫描并生成类型文件。最典型的用法是将其绑定到键盘按键上例如官方示例generateluatypes.mdRegisterKeyBind(Key.F1, function() GenerateLuaTypes() end)这样按下F1即可随时触发类型生成无需打开 GUI 窗口。你也可以在 Mod 的初始化阶段直接调用或在控制台中手动执行。由于生成过程需要遍历游戏全部 UObject详见下文源码分析建议在游戏资产加载完成后再触发以获得更完整的 Blueprint 类型信息。与 GUI Dumpers 按钮的等价关系如果你更习惯图形界面操作可以打开 UE4SS 的 GUI ConsoleDebugging Tools窗口切到Dumpers标签页点击Generate Lua Types按钮。该按钮的实现位于 UE4SS/src/GUI/Dumpers.cppif (ImGui::Button(Generate Lua Types\n)) { TRY([] { File::StringType working_dir{UE4SSProgram::get_program().get_working_directory()}; UE4SSProgram::get_program().generate_lua_types(working_dir STR(\\Mods\\shared\\types)); }); }对比 Lua 侧注册的实现UE4SS/src/Mod/LuaMod.cpplua.register_function(GenerateLuaTypes, []([[maybe_unused]] const LuaMadeSimple::Lua lua) - int { const Mod* mod get_mod_ref(lua); if (!mod) { lua.throw_error(Couldnt generate lua types because the pointer to Mod was nullptr); } File::StringType working_dir{mod-m_program.get_working_directory()}; UE4SSProgram::get_program().generate_lua_types(working_dir STR(\\Mods\\shared\\types)); return 0; });可以看到两条路径最终调用的是同一个UE4SSProgram::generate_lua_types()输出目录也都固定为游戏工作目录下的Mods\shared\types在 Linux 等平台由路径处理层自动归一化。这正是官方文档声明两者功能相同的源码依据。输出位置与目录组织生成的文件统一写入Mods/shared/types目录。该目录也是 UE4SS 自带共享类型文件的存放位置——仓库中的 assets/Mods/shared/Types.lua 即为随发行版分发的默认共享类型文件其中定义了Key枚举如Key.F1 0x70等、UE 内置类型以及 UE4SS API 相关的类/函数/对象标注。需要特别强调的是官方指南中的警告using-custom-lua-bindings.mdWarning: Do not include any of the generated files in your Lua scripts. If they are included, any globals set by UE4SS will be overridden and things will break.即切勿在 Lua 脚本中 require/include 任何生成的文件。这些文件仅供语言服务器LuaLS在编辑期解析如果在运行时被加载其中的全局变量定义会覆盖 UE4SS 注入的全局导致脚本行为异常。源码级原理从调用到文件落盘的完整链路GenerateLuaTypes的底层实现是一条清晰的调用链理解它有助于你判断生成时机与生成质量。第一步UE4SSProgram 入口UE4SS/src/UE4SSProgram.cpp 中的generate_lua_types()负责预处理与委托auto UE4SSProgram::generate_lua_types(const std::filesystem::path output_dir) - void { ProfilerScope(); if (settings_manager.CXXHeaderGenerator.LoadAllAssetsBeforeGeneratingCXXHeaders) { Output::send(STR(Loading all assets...\n)); double asset_loading_duration{}; { ProfilerScopeNamed(loading all assets); ScopedTimer loading_timer{asset_loading_duration}; UAssetRegistry::LoadAllAssets(); } Output::send(STR(Loading all assets took {} seconds\n), asset_loading_duration); } double generator_duration; { ProfilerScopeNamed(unloading all force-loaded assets); ScopedTimer generator_timer{generator_duration}; UEGenerator::generate_lua_types(output_dir); Output::send(STR(Unloading all forcefully loaded assets\n)); } UAssetRegistry::FreeAllForcefullyLoadedAssets(); Output::send(STR(SDK generated in {} seconds.\n), generator_duration); }关键信息生成前是否强制加载全部资产由设置项CXXHeaderGenerator.LoadAllAssetsBeforeGeneratingCXXHeaders控制对应 UE4SS-settings.ini 中的同名配置。开启后 Blueprint 生成类型会出现在转储中但代价是可能占用数 GB 额外内存且之后继续游玩很可能崩溃——Dumpers 面板上对应复选框的工具提示对此有明确说明UE4SS/src/GUI/Dumpers.cpp。该设置同时作用于.usmap、.jmap与 BP SDK 转储。生成耗时会在控制台以 SDK generated in X seconds. 输出便于评估成本。第二步SDKGenerator 模板化生成器生成的核心位于 UE4SS/src/SDKGenerator/Generator.cppauto generate_lua_types(const std::filesystem::path directory_to_generate_in) - void { TypeGeneratorLuaTypesGenerator generator{directory_to_generate_in}; generator.generate(); }TypeGenerator是一个以生成策略为模板参数的通用生成器骨架C 头文件生成CXXHeaderGenerator与 Lua 类型生成LuaTypesGenerator复用同一套遍历与文件组织逻辑。其generate()主流程Generator.cpp为cleanup_old_sdk()清理旧 SDK 文件通过UObjectGlobals::ForEachUObject遍历游戏内全部 UObject对每个对象调用generate_package_if_non_existent按所在 UPackage 分配输出文件UEnum对象走枚举生成分支UClass/UScriptStruct对象走类生成分支同类对象经m_classes_dumped去重最后create_all_files()统一写盘。文件按 UPackage 名称组织为package_name.lua每个文件头部写入---meta标记Generator.cpp告知 LuaLS 该文件仅供类型推断、不参与运行时加载。若不同 Package 归一化后产生同名文件会自动追加_DUPL_N后缀并在控制台提示Generator.cpp。第三步LuaTypesGenerator 的类型标注生成LuaTypesGeneratorGenerator.cpp负责把 UE 反射信息翻译为 LuaLS 可识别的标注语法主要输出形态包括UE 反射元素生成的标注/语法说明枚举---enum EnumNamelocal EnumName { ... }成员形如VALUE 数值类/结构体---class ClassName : BaseClasslocal ClassName {}继承关系通过GetSuperStruct()解析并生成前置依赖成员变量---field FieldName TypeName类型来自属性的反射类型映射函数参数---param ParamName TypeName仅收集带CPF_Parm的形参排除CPF_ReturnParm返回值---return TypeName由CPF_ReturnParm参数推导方法体function ClassName:MethodName(args) end非法标识符改用ClassName[name] function(self, ...)形式其中有两个值得关注的细节符号合法性处理is_valid_lua_symbol()Generator.cpp会检查属性名/函数名是否为 Lua 关键字and、end、local等 21 个以及是否符合标识符规则不能以数字开头、只能含字母数字与下划线。合法名称直接写成---field Name Type非法名称则用---field [原名] Type的形式标注保证运行时仍能通过obj[原名]访问Generator.cpp。函数参数名则统一经make_valid_symbol()把非法字符替换为下划线Generator.cpp。依赖前置生成一个类之前会先检查其父类GetSuperStruct()以及属性/参数引用的结构体是否已生成未生成则递归补齐generate_class_dependency/generate_class_dependency_from_propertyGenerator.cpp从而保证类型文件中不存在未定义类型的前向引用问题。在开发工作流中落地与 Custom Lua Bindings 配合生成类型文件只是第一步完整的开发体验还需要配合编辑器配置与代码注解。官方指南 Using Custom Lua Bindings 给出了完整工作流1. 配置 VS Code 与 LuaLS推荐使用 Visual Studio Code 并安装 Lua 扩展sumneko / LuaLS。把Mods文件夹作为工作区打开语言服务器会自动解析Mods/shared/types下的全部类型文件并提供 IntelliSense。由于许多游戏的类型数量极其庞大语言服务器可能解析失败此时可在工作区根目录添加.luarc.json{ $schema: https://raw.githubusercontent.com/sumneko/vscode-lua/master/setting/schema.json, workspace.maxPreload: 50000, workspace.preloadFileSize: 5000 }2. 以单个 Mod 目录为工作区另一种方式是只打开你的 Mod 根目录作为工作区此时需通过workspace.library显式引入共享类型目录与脚本目录路径可相对{ $schema: https://raw.githubusercontent.com/sumneko/vscode-lua/master/setting/schema.json, workspace.maxPreload: 50000, workspace.preloadFileSize: 5000, workspace.library: [../shared, Scripts] }3. 使用注解获得上下文相关类型对于动态获取的游戏类型如FindFirstOf返回的对象需要手动注解才能获得上下文相关的补全与类型检查using-custom-lua-bindings.md---class ITM_MisSel_Biome_C local biome FindFirstOf(ITM_MisSel_Biome_C) ---type int local numMissions biome.NumMissions ---type FVector local soundCoords { 420.5, 69.0, 3.1 } biome:SetSoundCoordinate(soundCoords)其中ITM_MisSel_Biome_C这类 Blueprint 类型正是GenerateLuaTypes从内存中扫描 UObject 后生成的定义---type FVector引用的原生结构体类型则来自共享类型文件或生成的 Package 文件。使用建议与注意事项触发时机如需包含 Blueprint 类型建议在游戏加载完相关关卡/资产后触发不关心 BP 类型时可随时触发以降低内存压力。资产强制加载LoadAllAssetsBeforeGeneratingCXXHeaders是一把双刃剑——它让生成结果更完整但可能消耗数 GB 内存并导致生成后继续游玩时崩溃GUI 工具提示与 UE4SSProgram.cpp 中的实现均印证了这一点。切勿运行时加载生成文件生成文件只服务于编辑期类型推断运行期加载会覆盖 UE4SS 注入的全局变量using-custom-lua-bindings.md。生成目录固定无论通过 Lua 函数还是 GUI 按钮触发输出目录均为工作目录下的Mods\shared\types如需更换位置可自行在 Mod 中封装逻辑后调用底层能力但官方不提供参数化输出路径。通过GenerateLuaTypes LuaLS 的组合你可以把游戏内存中的类型信息无缝转化为编辑器中的智能感知从而显著提升 UE4/UE5 Lua Mod 的开发效率——这也是该函数在 UE4SS 转储工具家族中最贴近日常开发体验的一环。赞分享游戏开发逆向工程【免费下载链接】RE-UE4SSInjectable LUA scripting system, SDK generator, live property editor and other dumping utilities for UE4/5 games项目地址https://gitcode.com/gh_mirrors/re/RE-UE4SS点击查看免费下载相关推荐Orleans 序列化代码生成自定义为 Grain 调用定义自定义返回类型Orleans 序列化代码生成自定义为 Grain 调用定义自定义返回类型 Orleans 的源生成器source generator会为每个 Grain后端微服务UE4SS键盘绑定配置指南自定义BP模组加载热键UE4SS键盘绑定配置指南自定义BP模组加载热键 核心功能解析 UE4SS作为虚幻引擎4的脚本系统其键盘绑定机制主要服务于两大核心场景 1. BP模组动态游戏开发逆向工程Hyprland热键系统全局快捷键与自定义命令绑定Hyprland热键系统全局快捷键与自定义命令绑定 概述 Hyprland作为一款现代化的Wayland合成器其热键系统提供了强大的全局快捷键管理和自定义命图形学上一篇**yahoofinance-api 开源项目安装与使用教程**下一篇Headlamp 前端 Kubernetes Service 对象模型详解KubeService 接口与 Service 类的源码级剖析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表