UE5中GameMode、玩家角色等的设置与获取

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

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

下面我们将以GameMode、DefaultPawn为例来介绍这些组成单位的设置与获取。

一,GameMode的设置与获取

1.1 GameMode的设置

我们在C++或蓝图中创建好继承自 AGameModeBase 的类后,在 WorldSettings 界面上选择我们自定义的GameMode 即可,这样就完成了对某一关卡的 GameMode 的设置。

图1,GameMode的设置

1.2 GameMode的获取

通过 UGameplayStatics::GetGameMode() 即可获取到属于某个关卡的 GameMode。其用法示例如下,其中ACylindricalWall 是一个 Actor,我们先通过 GetGameMode() 获取到 AGameModeBase,再转换成我们自定义的 AGodGameMode。

void ACylindricalWall::MonitorPlayer()
{
    // 获取GameMode
    auto GameMode = Cast<AGodGameMode>(UGameplayStatics::GetGameMode(this));
   // ...
}

GetGameMode() 的源码实现如下,其先获取 World,再由 World 获取 GameMode。

AGameModeBase* UGameplayStatics::GetGameMode(const UObject* WorldContextObject)
{
    UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);
    return World ? World->GetAuthGameMode() : NULL;
}

二,玩家角色的设置与获取

2.1 玩家角色的设置

2.1.1 在WorldSettings界面上设置玩家角色

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

图2,DefaultPawn的设置

2.1.2 在GameMode中设置玩家角色

为了解决刚才提出的问题——若在 WorldSettings 界面上选择的 GameMode 类是 C++类,则无法在 WorldSettings 界面上选择 DefaultPawnClass,我们可以在 GameMode 类中设置玩家角色。其设置方法如下,在 GameMode 的构造函数中,我们直接给 DefaultPawnClass 赋值,从而完成玩家角色的设置。除此之外,通过给 PlayerControllerClass 赋值,可以直接设置玩家控制器。

AGodGameMode::AGodGameMode()
{
    // set default pawn class to our Blueprinted character
    static ConstructorHelpers::FClassFinder<APawn> PlayerPawnBPClass(TEXT("/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter"));
    if (PlayerPawnBPClass.Class != NULL)
    {
        // 设置玩家角色
        DefaultPawnClass = PlayerPawnBPClass.Class;
        PlayerControllerClass = AGodPlayerController::StaticClass();
    }
}

2.1 玩家角色的获取

通过 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()。

### 在 Unreal Engine 5获取其他蓝图中的相机组件或镜头数据 在 Unreal Engine 5 (UE5) 的蓝图系统中,可以通过多种方式从一个蓝图访问另一个蓝图中的相机视图或镜头设置。以下是具体方法及其相关说明: #### 使用 `Get Actor` 和 `Find Component By Class` 如果目标蓝图是一个场景中存在的Actor,并且其上有一个 Camera 组件,则可以从当前蓝图通过以下步骤来获取该 Camera 组件。 1. **找到目标 Actor** 首先,在源蓝图中使用 `Get All Actors Of Class` 或者 `Get Actor by Tag/Name` 来定位到包含所需 Camera 组件的目标 Actor[^1]。 2. **查找特定类型的组件** 接下来,调用函数 `Find Component By Class` 并指定参数为 `CameraComponent` 类型。这会返回目标 Actor 上的第一个匹配的 Camera 组件实例[^2]。 ```blueprint // 假设 BP_Target 是我们想要获取 Camera 的目标 Blueprint 名字 Set Target to Get Actor of Type(BP_Target); Call Find Component By Class(CameraComponent) on the target; ``` 3. **读取或修改 Camera 数据** 成功获得 Camera 组件后,即可进一步操作它,比如调整 Field of View (FOV),或者查询它的位置和方向等属性[^3]。 #### 利用接口(Interface) 当多个不同的蓝prints可能都需要提供类似的摄像机功能时,可以考虑定义并应用自定义接口给这些蓝prints实现统一管理逻辑。 - 创建一个新的 Interface 资产文件,例如叫作 `ICameraProvider`. - 定义一些公共的方法签名在里面,像 `GetCurrentViewPoint()` 或者 `AdjustFov(float NewValue)` 这样的抽象声明. 一旦某些 Blueprints 实现了这个 ICameraProvider 接口之后, 只需确认对方支持此协议就能方便地交互而无需关心内部细节. #### 设置全局变量存储关键对象引用 对于那些频繁被不同模块共享使用的资源来说,维护一份集中式的记录往往更加高效可靠。可以在 Game Mode Base 或 Level Script 中预先保存好主要角色或者其他重要实体的指针供后续随时检索利用。 --- ### 示例代码片段展示如何跨蓝图取得远程摄像头信息 假设存在两个蓝图:一个是玩家控制器关联的角色蓝图 (`BP_PlayerCharacter`) ,另一个是用来独立操控环境观察角度的小工具蓝图(`BP_ObserverGadget`). 我们希望让后者能够同步显示前者所见的内容。 ```blueprint Event BeginPlay in BP_ObserverGadget { Set PlayerCharRef as GetPlayerCharacter(); } Function SyncWithMainCam() { If(PlayerCharRef IsValid){ Let MainCamComp = Call 'Find Component By Class' with argument 'CameraComponent'; If(MainCamComp IsNotNone){ Self.SetCurrentLocationTo(MainCamComp.GetRelativeTransform()); PrintString("Synchronized successfully!"); } Else{ PrintWarning("No camera found."); } }Else{ PrintError("Invalid player reference."); } } ``` 以上伪代码展示了基本思路——即先建立连接关系再执行实际的数据交换动作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值