UE4结构
老外丰富版本:
小龙的简洁版本:
一些常用结构的概念
UWorld
是一个单例对象,逆向 UE4 游戏很多我们想要的数据都是从他开始的。从 UWorld
中我们可以获取到 UGameInstance
和 ULevel
。
UGameInstance
UWorld
类里的一个属性,在源码里为:
struct UGameInstance* OwningGameInstance;
ULocalPlayer
UGameInstance
类下的一个属性,在源码里为:
struct TArray<struct ULocalPlayer*> LocalPlayers;
可以看出来,是保存在一个 TArray
的动态数组中,我们获取数组的第一个元素,就是当前角色的 ULocalPlayer
。
APlayerController
ULocalPlayer
的父类 UPlayer
类的一个属性,在源码里为:
struct APlayerController* PlayerController;
APlayerController
里有我们想要的 APawn
、APlayerCameraManager
等数据。
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
通过 Actor
的 id
可以从 GName
表中获取到 Actor
的蓝图类名,用于区分 Actor
种类。