You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于EOS的C++多人游戏:获取当前执行代码的PlayerController设置输入模式

针对EOS多人游戏的PlayerController获取修改方案

在多人游戏场景下,GetFirstPlayerController()仅能返回世界中第一个加载的玩家控制器,无法准确指向当前执行代码的玩家。以下是不同代码上下文下的修改方案:


1. 代码位于APlayerController子类中

如果这段逻辑是直接写在玩家控制器类内部,无需额外获取,直接使用当前实例即可:

// 直接调用当前PlayerController的方法
SetInputMode(FInputModeGameOnly());
bShowMouseCursor = false;

2. 代码位于APawn子类(玩家角色)中

通过角色的GetController()方法转换为APlayerController:

APlayerController* PlayerController = Cast<APlayerController>(GetController());
if (PlayerController)
{
    PlayerController->SetInputMode(FInputModeGameOnly());
    PlayerController->bShowMouseCursor = false;
}

3. 代码位于UUserWidget子类(UI组件)中

UI组件可通过GetOwningPlayer()直接获取所属玩家的控制器:

APlayerController* PlayerController = GetOwningPlayer();
if (PlayerController)
{
    PlayerController->SetInputMode(FInputModeGameOnly());
    PlayerController->bShowMouseCursor = false;
}

4. 代码位于其他Actor类(客户端侧逻辑)

如果是客户端执行的逻辑,使用GetFirstLocalPlayerController()获取本地玩家控制器,比GetFirstPlayerController()更适配多人场景:

APlayerController* PlayerController = GetWorld()->GetFirstLocalPlayerController();
if (PlayerController)
{
    PlayerController->SetInputMode(FInputModeGameOnly());
    PlayerController->bShowMouseCursor = false;
}

5. 通过EOS用户ID匹配PlayerController

如果需要基于EOS用户标识定位玩家,可遍历世界中的PlayerController,对比PlayerState中的EOS唯一ID:

// 先获取当前执行代码的EOS用户ID(从EOS登录/会话信息中获取)
FEOSUniqueNetId CurrentEOSUserId = ...;

for (FConstPlayerControllerIterator It = GetWorld()->GetPlayerControllerIterator(); It; ++It)
{
    APlayerController* PlayerController = It->Get();
    if (!PlayerController) continue;

    APlayerState* PlayerState = PlayerController->PlayerState;
    if (!PlayerState) continue;

    FEOSUniqueNetId* EOSId = Cast<FEOSUniqueNetId>(PlayerState->GetUniqueId().Get());
    if (EOSId && *EOSId == CurrentEOSUserId)
    {
        PlayerController->SetInputMode(FInputModeGameOnly());
        PlayerController->bShowMouseCursor = false;
        break;
    }
}

注意事项

  • 输入模式切换属于客户端本地操作,应确保代码在客户端执行,避免在服务器直接修改PlayerController的输入状态;如果是服务器触发的逻辑,需通过RPC通知对应客户端执行。
  • 多人游戏中,避免依赖全局的"第一个玩家"这类模糊定位,优先通过上下文关联(如自身实例、所属玩家、EOS用户ID)获取准确的PlayerController。

内容的提问来源于stack exchange,提问作者AlexDevelopment1009

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 22:30:21