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

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)是不变的。

相关推荐
嘀咕博客6 小时前
h5游戏免费下载:HTML5拉杆子过关小游戏
前端·游戏·html5
FairGuard手游加固14 小时前
Cocos资源加密方案解析
安全·游戏·cocos2d
2501_938782091 天前
《UE4 蓝图基础:蓝图编辑器打开与节点连接的核心逻辑》
编辑器·ue4
UWA1 天前
为什么Android游戏画面在30帧运行时有抖动现象
android·游戏
软件开发技术深度爱好者1 天前
python使用Pygame库实现避障小人行走游戏
python·游戏·pygame
星空露珠2 天前
数独生成题目lua脚本
数据结构·数据库·算法·游戏·lua
wanhengidc2 天前
云手机 基于云计算的虚拟手机
运维·服务器·游戏·智能手机·云计算
王火火(DDoS CC防护)2 天前
游戏盾是如何保障游戏安全稳定的?
游戏·网络安全·ddos攻击·sdk游戏盾
上海云盾第一敬业销售2 天前
高防CDN如何确保电商平台在购物节期间运转如常
安全·游戏·ddos
星空露珠2 天前
数独解题算法lua脚本
开发语言·数据结构·算法·游戏·lua