-
-
[分享]UnrealEngine 学习2: GName,GObject
-
发表于: 5天前 568
-
前言
在 Unreal Engine(UE4/UE5) 的反射系统和对象系统中,经常会看到两个核心结构:GObjects、GNames,它们属于 UE 运行时最核心的全局数据结构,因此很多逆向、源码阅读、外挂分析都会从这里入手
一、GObject 是什么
GObjects 像是所有对象的仓库,本质是:UE 引擎中所有 UObject 实例的全局数组,UE 中所有对象都继承自 UObject,例如:
1 2 3 4 5 6 7 8 | UObject ├─ UClass ├─ UWorld ├─ AActor │ ├─ APawn │ │ ├─ ACharacter │ │ │ └─ AShooterCharacter.... |
因此,只要是 UObject 派生对象:Actor、Component、Class、Blueprint、Texture、Material 全部都会被放进 GObjects 表里。
来看看代码是怎么实现的:
进入Engine/Source/Runtime/CoreUObject/Public/UObject/UObjectArray.h

发现这里引入了FUObjectArray GUObjectArray,继续寻找实例,进入Engine\Source\Runtime\CoreUObject\Private\UObject\UObjectHash.cpp

可以看到注释里也说明了 这是个全局UObject数组实例,继续跟踪进入FUObjectArray

可以看到FUObjectArray类的TUObjectArray ObjObjects字段就是存储所有UObejct的地方,而TUObjectArray又是FFixedUObjectArray的重命名,继续跟踪FFixedUObjectArray

根据类型名猜测肯定是FUObjectItem* Objects,继续跟踪FUObjectItem

进入FUObjectItem已经看到其内部的class UObjectBase* Object(最底层对象)
二、GName 是什么
GNames是UE的全局字符串表,UE里所有名字都不会直接存字符串,而是存索引。
原因是为了节省内存、快速比较以及统一管理(一般大型项目都会这么做)
UE中对象名不是string,而是FName
在FName中重点有ComparisonIndex、Number这两个字段


- ComparisonIndex:字符串在GNames中的索引
- Number:重复编号
接下来继续由FName关联FNameEntry:
首先在FName中能找到NAME_INDEX ComparisonIndex;索引

通过索引关联到ComparisonIndex关联到FNameEntry的NAME_INDEX Index;,其中AnsiName、WideName就是存储的字符串,可存ansi或者宽字符

至于GName的位置,笔者目前还尚未找到,后续将持续补充...