UE4游戏查找本地角色数据的方法-SDK

发布于:2025-05-24 ⋅ 阅读:(19) ⋅ 点赞:(0)

UE4中,玩家的表示通常涉及以下几个类:

  1. APlayerController: 代表玩家的控制逻辑,处理输入等。

  2. APawn: 代表玩家在世界中的实体(比如一个角色、一辆车)。APlayerController 控制一个 APawn。

  3. ACharacter: APawn 的一个特化子类,用于可动的人形角色。

  4. APlayerState: 存储玩家的网络同步状态信息,如玩家名、得分等。

  5. ULocalPlayer: 代表本地玩家的实例,通常在 UGameInstance 中。

以下是从 UWorld 出发找到当前玩家信息的几条常见路径:

主要路径建议:

路径 1: 通过 UGameInstance 和 ULocalPlayer (最常用)
这是获取本地玩家信息最直接和常用的方式。

  1. UWorld -> OwningGameInstance (所属游戏实例):

    • UWorld 对象内部会有一个指向其所属 UGameInstance 的指针。你需要在这个内存查看器中找到 UWorld 的 OwningGameInstance 成员。它的类型通常是 UGameInstance*。

    • 记下这个 UGameInstance* 的地址。

  2. UGameInstance -> LocalPlayers (本地玩家数组):

    • 跳转到上一步得到的 UGameInstance 地址,查看其成员。

    • UGameInstance 有一个名为 LocalPlayers 的 TArray<ULocalPlayer*> 成员。这是一个 ULocalPlayer 指针的数组。

    • 对于单人游戏或第一个本地玩家,通常是 LocalPlayers[0]。记下这个 ULocalPlayer* 的地址。

  3. ULocalPlayer -> PlayerController (玩家控制器):

    • 跳转到 ULocalPlayer 地址,查看其成员。

    • ULocalPlayer 对象有一个指向 APlayerController* 的成员,通常就叫 PlayerController。记下这个 APlayerController* 的地址。

  4. APlayerController -> Pawn 或 Character (玩家实体):

    • 跳转到 APlayerController 地址,查看其成员。

    • APlayerController 有一个指向其当前控制的 APawn* 的成员。这个成员变量的名字可能是 Pawn,或者在更新的版本/特定情况下是 AcknowledgedPawn。

    • 如果这个 Pawn 是一个角色,它的实际类型会是 ACharacter* (或其子类)。

  5. 从 APawn/ACharacter 获取信息:

    • 位置 (Location):

      • APawn -> RootComponent (类型 USceneComponent*) -> RelativeLocation (相对坐标, FVector) 或通过其 ComponentToWorld Transform 获取世界坐标。

      • 在内存查看器中,你需要先找到 RootComponent 指针,然后跳转到该组件的内存,再找到位置相关的成员。

    • 生命值 (Health):

      • 这通常是游戏自定义的变量,可能直接在 APawn、ACharacter 或 APlayerState 中。你需要查找名为 Health, CurrentHealth, HP 之类的浮点型或整型成员。

    • 其他信息: 速度、朝向等也可以从 APawn 或其组件中找到。

路径 2: 通过 GameState (适用于获取所有玩家状态,包括本地玩家)

  1. UWorld -> GameState:

    • UWorld 对象有一个成员指向当前的 AGameStateBase* (或其子类,如 AGameState*)。在你的截图中,这个成员没有直接显示偏移量,但它肯定是 UWorld 的一个成员。你需要找到它。

    • 记下 AGameStateBase* 的地址。

  2. AGameStateBase -> PlayerArray:

    • 跳转到 AGameStateBase 地址,查看其成员。

    • 它有一个 PlayerArray 成员,这是一个 TArray<APlayerState*>,包含了游戏中所有玩家的 APlayerState。

  3. APlayerState -> PawnPrivate 或 PlayerController:

    • 从 PlayerArray 中取出你关心的玩家的 APlayerState* (比如 PlayerArray[0] 如果是第一个玩家)。

    • APlayerState 有一个 PawnPrivate 成员,它是一个 APawn*,指向该玩家状态对应的Pawn。

    • 或者,APlayerState 的 Owner 通常是对应的 APlayerController。从 APlayerController 再获取 Pawn。

  4. 从 APawn 获取信息: (同路径1的步骤5)

  5. 从 APlayerState 获取信息:

    • 玩家名 (PlayerName): APlayerState 通常有 PlayerName (类型 FString) 或 GetPlayerName() 相关的成员/函数。

    • 分数 (Score): Score (通常是 float)。

    • 其他网络同步的状态。

路径 3: 通过 UWorld 的 PersistentLevel 中的 Actors 数组 (较繁琐)
你的截图显示了 +0030 ULevel* PersistentLevel。

  1. UWorld -> PersistentLevel:

    • 从 UWorld 的地址(0x505998D0)加上偏移量 +0x0030,得到 PersistentLevel 的地址。

  2. ULevel -> Actors:

    • 跳转到 PersistentLevel 的地址,查看其成员。

    • ULevel 有一个 Actors 成员,它是一个 TArray<AActor*>,包含了该关卡中所有的 Actor。

  3. 遍历 Actors 数组:

    • 你需要遍历这个 Actors 数组。对每个 AActor*:

      • 检查其类型是否为 APlayerController (或游戏特定的玩家控制器子类)。这可能需要查看对象的虚函数表 (vtable) 或其他类型信息。

      • 如果是 APlayerController,再检查它是否是本地玩家的控制器 (例如,通过 IsLocalController() 对应的成员变量或标志位)。

    • 一旦找到目标 APlayerController,后续步骤同路径1的步骤4和5。

建议步骤:

  1. 首选路径1或路径2,因为它们更直接。你需要耐心地在内存查看器中展开指针,寻找我上面提到的成员变量名。

  2. 注意UE4的 TArray 结构。它通常包含一个指向数据块的指针、数组当前的元素数量 (ArrayNum) 和数组分配的容量 (ArrayMax)。你需要先找到数据块的指针,然后才能访问数组元素。

  3. 变量名可能会因UE版本或游戏特定修改而略有不同,但基本概念(如 PlayerController 控制 Pawn)是不变的。


网站公告

今日签到

点亮在社区的每一天
去签到