首页
社区
课程
招聘
[分享]UnrealEngine 学习2: GName,GObject
发表于: 5天前 568

[分享]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的位置,笔者目前还尚未找到,后续将持续补充...


传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回