UE4引擎结构和一些基础概念

/ 6

UE4结构

老外丰富版本:

小龙的简洁版本:

一些常用结构的概念

UWorld

是一个单例对象,逆向 UE4 游戏很多我们想要的数据都是从他开始的。从 UWorld 中我们可以获取到 UGameInstanceULevel

UGameInstance

UWorld 类里的一个属性,在源码里为:

struct UGameInstance* OwningGameInstance;

ULocalPlayer

UGameInstance 类下的一个属性,在源码里为:

struct TArray<struct ULocalPlayer*> LocalPlayers;

可以看出来,是保存在一个 TArray 的动态数组中,我们获取数组的第一个元素,就是当前角色的 ULocalPlayer

APlayerController

ULocalPlayer 的父类 UPlayer 类的一个属性,在源码里为:

struct APlayerController* PlayerController;

APlayerController 里有我们想要的 APawnAPlayerCameraManager 等数据。

APawn

APawn 继承自 AActor ,在 UE4 游戏逆向里被称为 InPawn,也就是玩家自己的 Pawn。获取到它后可以获取一些玩家自己的数据,并且可以在 Actor 数组中区分出玩家自己(这个Pawn和Actor数组中某个Actor,是同一个对象。可以对比对象地址来区分自己)。位于 APlayerController 的父类 AController 下,在源码里为:

struct APawn* Pawn;

ULevel

关卡,类似 Unity 中的 Scene。我们想要获取的 ULevel 是在 UWorld 下的,它的偏移很长一段时间都是固定的 0x30。在源码中为:

struct ULevel* PersistentLevel;

Actor

Actor 是可以放置或生成在一个关卡中的 Object 的基类,Actor 可以包含很多 ActorComponents,用于控制 Actor 怎么移动、怎么渲染等等。Actor 还有一个重要作用,在联网游戏中,可以通过网络进行属性复制和函数调用。类似 Unity 中的 GameObject

像玩家自己、敌人、队友、物资、载具、枪械、枪械上的配件等等,一般都是 Actor

Count

UE4 的 Count 就是游戏运行过程中,动态创建的 Actor 的数量,游戏对象销毁后这个数量可能会变动。一般在一场游戏中,这个数值是一直增大的,直到游戏结束并返回主界面。

Actor数组

存放游戏中一定范围内的 Actor 的数组,为什么要说一定范围?因为如果目标离你非常远,为了性能优化,是不会存放在 Actor 数组中的,等你靠近一些目标才会。

逆向 UE4 游戏,可以结合 Count 遍历这个数组,得到所有 Actor。然后再获取这些 Actor 的类型、坐标等等数据。

GName

通过 Actorid 可以从 GName 表中获取到 Actor 的蓝图类名,用于区分 Actor 种类。