背景

在 UE 的一个关卡中,GameMode、GameState、玩家角色(DefaultPawn)、PlayerController、PlayerState等都是必不可少的组成单位。这些单位各自的作用如下:

  1. GameMode是整个关卡的控制器,用来编写整个关卡的业务逻辑;
  2. GameState是整个关卡的状态,用来存储整个关卡的游戏数据;
  3. DefaultPawn是玩家角色,若是角色扮演类游戏则就是在游戏场景中看到的角色实体;
  4. PlayerController是玩家的控制器,用来编写和玩家相关的控制逻辑;
  5. PlayerState是玩家的状态,用来存储和玩家相关的状态数据

DefaultPawn是游戏玩家角色,若是角色扮演类游戏则就是再游戏场景中看到的角色实体

APawn* UGameplayStatics::GetPlayerPawn(const UObject* WorldContextObject, int32 PlayerIndex)
{
	APlayerController* PC = GetPlayerController(WorldContextObject, PlayerIndex);
	return PC ? PC->GetPawnOrSpectator() : nullptr;
}

生命周期

存活于整个游戏当中,可以保存游戏不同关卡的信息


在WorldSettings界面上设置玩家角色

玩家角色 DefaultPawn 的设置,也可以和 GameMode 一样,在 WorldSettings 界面上完成,如下图所示。但这种在 WorldSettings 界面上设置的方法只适用于 所选择的 GameMode 是蓝图类的情况下。在 GameMode 是C++类的情况下,DefaultPawnClass 的下拉框操作是禁止的。

玩家角色的获取

通过 UGameplayStatics::GetPlayerPawn() 即可获取到属于某个关卡的玩家角色。其用法示例如下,其中ACylindricalWall 是一个 Actor,我们先通过 GetPlayerPawn() 获取到 APawn,再转换成我们自定义的 AGodCharacter。

void ACylindricalWall::MonitorPlayer()
{
    // 获取玩家角色
    auto Player = Cast<AGodCharacter>(UGameplayStatics::GetPlayerPawn(GetWorld(), 0));
   // ...
}

GetPlayerPawn() 的源码实现如下,其先获取 PlayerController,再由 PlayerController 获取 Pawn。

APawn* UGameplayStatics::GetPlayerPawn(const UObject* WorldContextObject, int32 PlayerIndex)
{
    APlayerController* PC = GetPlayerController(WorldContextObject, PlayerIndex);
    return PC ? PC->GetPawnOrSpectator() : nullptr;
}

当玩家角色是一个 Character 时,也可以使用 GetPlayerCharacter() 代替 GetPlayerPawn()。