ARTICLE DETAIL

资讯详情

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

UE4SS Lua 全局函数 ForEachUObject 全解析:遍历 GUObjectArray 中所有 UObject 的底层原理与实战用法

UE4SS Lua 全局函数 ForEachUObject 全解析:遍历 GUObjectArray 中所有 UObject 的底层原理与实战用法 游戏开发逆向工程【免费下载链接】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点击查看免费下载ForEachUObject 是 UE4SS 提供的一个 Lua 全局函数用于遍历游戏进程中当前存在于引擎全局对象数组 GUObjectArray 中的每一个 UObject。本文以 docs/lua-api/global-functions/foreachuobject.md 为骨架结合 UE4SS 源码中的 Lua 绑定实现与真实调用场景讲解该函数的签名、回调参数、底层工作机制、性能注意事项与典型应用帮助读者在 Lua 脚本和 C 扩展中正确、高效地使用它。背景GUObjectArray 是什么GUObjectArray 是虚幻引擎UE4/UE5中的一个全局大块chunked数组负责容纳游戏进程中所有已被创建并注册的 UObject 实例。无论是场景中的 Actor、Component还是资源对象UClass、UDataTable、UScriptStruct 等最终都会出现在这个数组中。值得注意的关键事实是这个数组的内部结构在不同引擎版本之间发生过多次变化分块大小、索引组织方式等均有调整而 UE4SS 的ForEachUObject函数被设计为在所有引擎版本上以完全一致的方式工作脚本作者无需关心当前游戏运行在哪个引擎版本也不必了解 GUObjectArray 的内部布局细节。从源码层面看Lua 侧的ForEachUObject只是 C 侧Unreal::UObjectGlobals::ForEachUObject的一层封装。UE4SS 内部通过 UE4SS/include/UnrealDef.hpp 中的namespace UObjectGlobals Unreal::UObjectGlobals;别名统一引用该命名空间而 Lua 绑定代码则位于 UE4SS/src/Mod/LuaMod.cpp。函数签名与参数说明ForEachUObject只接受一个参数一个 Lua 回调函数。每当遍历到一个 UObject 时该回调就会被调用一次。#类型说明1function针对 GUObjectArray 中每一个 UObject 执行的回调函数其声明可在 UE4SS 自带的 Lua 类型定义文件中找到assets/Mods/shared/Types.lua--Execute the callback function for each UObject in GUObjectArray --The callback params are: UObject object, integer ChunkIndex, integer ObjectIndex --param Callback fun(object: UObject, ChunkIndex: integer, ObjectIndex: integer) function ForEachUObject(Callback) end回调函数参数回调函数每次被调用时会依次收到三个参数#类型说明1UObject当前遍历到的 UObject 对象可直接调用其方法如:GetFullName()2integer该 UObject 在 GUObjectArray 中所在的分块索引chunk index3integer该 UObject 在其所在分块内的对象索引object index关于后两个参数从 UE4SS/src/Mod/LuaMod.cpp 的绑定实现可以确认其传递顺序lua.register_function(ForEachUObject, [](const LuaMadeSimple::Lua lua) - int { Unreal::UObjectGlobals::ForEachUObject( { // Duplicate the Lua function so that we can use it in subsequent iterations of this loop (call_function pops the function from the stack) lua_pushvalue(lua.get_lua_state(), 1); // Set the Object parameter for the Lua function (P1) LuaType::auto_construct_object(lua, static_castUnreal::UObject*(object)); // Set the ChunkIndex parameter for the Lua function (P2) lua.set_integer(chunk_index); // Set the ObjectIndex parameter for the Lua function (P3) lua.set_integer(object_index); lua.call_function(3, 1); return LoopAction::Continue; }); return 0; });完整示例下面是官方文档提供的示例docs/lua-api/global-functions/foreachuobject.md。它遍历全部 UObject并打印每个对象的分块索引、对象索引和完整名称-- Warning: This will take quite a while to finish executing due to all of the print calls ForEachUObject(function(Object, ChunkIndex, ObjectIndex) print(string.format(Chunk: %X | Object: %X | Name: %s\n, ChunkIndex, ObjectIndex, Object:GetFullName())) end)输出效果类似Chunk: 0 | Object: 0 | Name: /Engine/Transient.CoreUObject Chunk: 0 | Object: 1 | Name: /Script/CoreUObject.Object ...需要注意示例中的两个细节%X以十六进制格式输出分块索引与对象索引这正是文档参数表中 chunk index / object index 的典型用法文档在示例开头特意加了警告由于每个对象都执行print调用整个函数执行会相当耗时。游戏运行时 GUObjectArray 中往往包含数万甚至数十万个对象逐条打印是典型的高开销操作。底层工作原理从 UE4SS/src/Mod/LuaMod.cpp 的实现可以梳理出整个调用链Lua 侧发起调用脚本调用全局函数ForEachUObject(Callback)Lua 栈顶压入回调函数。C 侧遍历绑定代码调用Unreal::UObjectGlobals::ForEachUObject底层对 GUObjectArray 的分块结构进行迭代屏蔽了不同引擎版本间的布局差异。逐对象回调对每个对象先把 Lua 回调函数复制到栈顶因为call_function会弹出函数然后用auto_construct_object构造当前 UObject 的 Lua 表示作为 P1依次压入 chunk_indexP2与 object_indexP3最后lua.call_function(3, 1)执行回调。控制流C 回调返回LoopAction::Continue表示继续遍历。LoopAction机制还支持Break等控制值用于提前终止迭代SDK 生成器等内部代码中大量使用该模式例如 UE4SS/src/SDKGenerator/Generator.cpp 中按条件提前停止遍历。内部应用场景UE4SS 各模块如何使用 ForEachUObjectForEachUObject是 UE4SS 多个核心功能的地基从源码搜索可以看到它被广泛用于SDK 生成器遍历全部 UObject 以收集类、属性、函数等信息用于生成 C SDK 头文件。典型调用位于 UE4SS/src/SDKGenerator/Generator.cpp、UE4SS/src/SDKGenerator/UEHeaderGenerator.cpp、UE4SS/src/SDKGenerator/JSONDumper.cpp 与 UE4SS/src/SDKGenerator/SDKGenerator.cpp。对象与属性 Dumper在 UE4SS/src/UE4SSProgram.cpp 中先打印 Dumping all objects properties in GUObjectArray随后调用ForEachUObject逐个对象转储字段再统一写出到文件。Live View 搜索过滤UE4SS/src/GUI/LiveView.cpp 在make_filtered_set中遍历全部 UObject按名称/地址构建搜索结果集合该文件 第 872 行 还使用了其变体ForEachUObjectInRange实现范围遍历。USMap / JMap 生成器UE4SS/src/USMapGenerator/Generator.cpp 与 UE4SS/src/JMapGenerator/JMapGenerator.cpp 借助它枚举对象以生成地图数据。TMapOverrideGenUE4SS/src/SDKGenerator/TMapOverrideGen.cpp 用它枚举对象来生成 TMap 覆盖定义。性能验证UE4SS/src/GUI/Profilers.cpp 中提供了一个 Test: ForEachUObject 测试按钮统计单次遍历迭代的对象总数并输出到控制台可用于快速验证当前进程的对象规模。由此可见凡是需要枚举进程中全部 UObject的功能UE4SS 都会优先复用UObjectGlobals::ForEachUObjectLua 脚本中的ForEachUObject与这些内部调用共享同一套底层实现。性能注意事项与最佳实践避免在回调内做高开销操作正如官方示例的警告所说逐对象print会显著拖慢遍历。若仅需统计或筛选建议在回调内做轻量判断只对符合条件的对象执行打印或处理。回调内可安全使用对象方法回调参数 Object 是一个完整的 UObject 包装对象可直接调用GetFullName()、GetClassPrivate()等方法参考 LiveView 中的用法 UE4SS/src/GUI/LiveView.cpp。可用于计数而非打印若要了解当前游戏的对象规模可仿照 Profilers 的做法仅递增计数器而不做任何输出UE4SS/src/GUI/Profilers.cpp。结合过滤条件使用实际工程中更常见的模式是先遍历、后筛选。例如 LiveView 的make_filtered_set先遍历全部对象再根据用户输入的名称或地址逐个判断是否加入结果集这样只有命中条件的对象才会进入后续处理流程。与 NotifyOnNewObject 互补ForEachUObject适合一次性快照式枚举存量对象若需要持续监听新创建的对象可配合NotifyOnNewObject使用其 Lua 绑定同样位于 UE4SS/src/Mod/LuaMod.cpp 附近声明见 assets/Mods/shared/Types.lua。相关 API 与延伸阅读全局函数总览见 docs/lua-api.md 与 docs/SUMMARY.md与之配套的对象枚举类函数还包括FindAllOf、FindFirstOfdocs/lua-api/global-functions/findallof.md、docs/lua-api/global-functions/findfirstof.md它们内部同样基于 GUObjectArray 实现UObject 在 Lua 侧的方法集合参见 docs/lua-api/classes/uobject.md若要在 C 扩展中直接遍历 UObject可参考 UE4SS/src/Mod/LuaMod.cpp 使用Unreal::UObjectGlobals::ForEachUObject并结合LoopAction控制遍历流程。综上ForEachUObject是 UE4SS Lua 脚本体系中访问引擎全部对象的唯一入口掌握它的参数语义、底层封装与性能特征是编写对象枚举、SDK 辅助、Live View 过滤等实用脚本的基础。赞分享游戏开发逆向工程【免费下载链接】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点击查看免费下载相关推荐UE4SS 全局函数 GetMainModThreadId 详解获取 Lua 主线程 ID 的用法与底层实现UE4SS 全局函数 GetMainModThreadId 详解获取 Lua 主线程 ID 的用法与底层实现 GetMainModThreadId 是 UE4游戏开发逆向工程UE4SS Lua 模组管理函数全解析RestartCurrentMod / UninstallCurrentMod / RestartMod / UninstallMod 的用法与底层实现UE4SS Lua 模组管理函数全解析RestartCurrentMod / UninstallCurrentMod / RestartMod / Unins游戏开发逆向工程UE4SS Lua 全局函数 FindObjects 详解按类名与短对象名批量查找 UObjectUE4SS Lua 全局函数 FindObjects 详解按类名与短对象名批量查找 UObject 导读 FindObjects 是 UE4SS 暴露给 Lu游戏开发逆向工程上一篇Ghostwriter插件系统详解如何扩展编辑器的功能下一篇Luckysheet在线表格系统完全攻略从入门到精通的高级使用技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表