虚幻引擎_玩家控制器APlayerController(进阶)

UE GamePlay框架(五) Controller、APlayerController、AAIController (3)从存在性上:Controller的生命期比Pawn要长一些,比如我们经常会实现的游戏中玩家死亡后复活的功能。(1)从概念上:如果是一些Pawn本身固有的能力逻辑,如前进后退、播放动画、碰撞检测之类的就完全可以在Pawn内实现;(3)PlayerController也不一定存在,对于联机游戏,对方玩家被同步过来的将只有PlayerState,对方玩家的PlayerController只在服务器上存在。(1)对实现游戏逻辑来说,PlayerController里的变量的意义在于更好的实现控制。 阅读详情

APlayerController(玩家控制器)的全量核心操作,并对比它在单人模式、本地多人(分屏)、线上多人三种场景下的使用差异 —— 这是 UE 开发中从单机到联机的核心进阶点,我会按「核心操作分类 + 模式差异对比」的结构,用新手易懂的大白话 + 实战 API,把这个知识点讲透。

前置核心认知(先对齐)

无论哪种模式,APlayerController的核心定位不变:玩家与游戏世界交互的 “总遥控器”,但不同模式下:

  • 单人模式:1 个PlayerController对应 1 个本地玩家;
  • 本地多人(分屏):多个PlayerController(Player0/Player1)都运行在同一台设备,共享游戏世界;
  • 线上多人:PlayerController分 “本地 / 远程”,本地控制器处理输入,远程控制器同步状态,跨设备交互。

一、APlayerController 核心操作全梳理(按功能分类)

先统一列出所有核心操作,后续再对比不同模式下的差异:

功能分类核心操作(关键 API)大白话解释基础使用场景
输入处理(核心)1. BindAction()/BindAxis()(输入绑定)
2. GetHitResultUnderCursor()(光标碰撞)
3. SetInputMode()(输入模式)
4. Enable/DisableInput()(禁用 / 启用输入)
5. IsInputKeyDown()(按键检测)
接收解析玩家输入,控制输入生效范围移动、开火、UI 交互、暂停锁定输入
Pawn 控制1. Possess()/UnPossess()(绑定 / 解绑 Pawn)
2. GetPawn<T>()(获取控制的角色)
3. SwitchPawn()(切换控制对象)
管理 “遥控器” 与 “被控角色” 的绑定关系出生控制角色、切换载具、复活重绑
视角 / 相机1. GetPlayerViewPoint()(相机位置)
2. SetControlRotation()(视角旋转)
3. SetViewTarget()(切换相机)
4. bShowMouseCursor(显示鼠标)
控制玩家 “看到的内容”瞄准射线、剧情视角、UI 时显示鼠标
UI/HUD1. GetHUD()/CreateHUD()(专属 HUD)
2. SetWidgetToFocus()(UI 焦点)
3. ShowNotification()(弹窗)
管理玩家专属的 UI 界面血条、弹药显示、暂停菜单
网络同步(进阶)1. IsLocalPlayerController()(判断本地 / 远程)
2. Server_XXX()/Client_XXX()(RPC 调用)
3. ReplicateMovement(移动同步)
4. GetPlayerState()(玩家状态同步)
跨设备 / 跨控制器同步数据 / 指令线上多人开火同步、位置同步
体验反馈1. ClientPlaySound()(播放音效)
2. ClientPlayHapticEffect()(手柄震动)
3. SetPause()(暂停游戏)
给玩家专属的感官反馈击中震动、提示音效、暂停游戏
辅助工具1. GetLocalPlayer()(关联本地玩家)
2. TeleportTo()(传送)
3. GetPlayerId()(玩家标识)
基础工具类操作激活输入映射、快速旅行、存档识别

二、3种模式下 PlayerController 的核心差异对比

核心维度对比表(新手一眼看懂)

对比维度普通单人模式本地多人(分屏)模式线上多人模式
控制器数量 & 归属1 个PlayerController,运行在本地,无 “本地 / 远程” 区分N 个PlayerController(Player0/Player1/...),都运行在同一台设备,均为 “本地控制器”每个玩家 1 个PlayerController:- 本地玩家:1 个 “本地控制器”(处理输入)- 其他玩家:N 个 “远程控制器”(仅同步状态)
输入处理逻辑直接绑定输入,无需区分 “谁的输入”示例:EnhancedInputComp->
BindAction(JumpAction, ...)
每个控制器绑定专属输入映射(IMC)示例:Player0 绑定 WASD,Player1 绑定方向键需通过GetPlayerController(Index)区分仅本地控制器处理输入,远程控制器不处理必须加IsLocalPlayerController()校验:if(!IsLocalPlayerController()) return;
Pawn 控制(Possess)1 个控制器绑定 1 个 Pawn,直接Possess()
绑定的最佳执行位置: 
PlayerController / GameMode
按索引绑定:GetPlayerController(0)->
Possess(Tank0)
GetPlayerController(1)->
Possess(Tank1)

绑定的执行位置:
GameMode 类
本地控制器:Possess()本地 Pawn远程控制器:服务器同步Possess状态,本地仅 “看到” 远程 Pawn 被控制需通过 RPC 通知服务器:Server_PossessNewPawn()
视角 / 相机全局唯一相机,控制器直接控制视角分屏渲染:每个控制器绑定专属视口(Viewport)需设置SplitScreenInfo,每个控制器有独立相机示例:Player0 左屏,Player1 右屏本地控制器控制本地相机,远程控制器的视角不渲染(仅同步 Pawn 位置)玩家只能看到 “自己的视角”,远程玩家的视角由服务器同步 Pawn 位置模拟
UI/HUD全局唯一 HUD,直接绑定到控制器每个控制器有独立 HUD/UI示例:Player0 的血条在左屏,Player1 的在右屏需按PlayerIndex创建专属 Widget本地控制器渲染本地 UI,远程玩家的 UI 不显示HUD 数据(如血量)需从PlayerState(网络同步)获取
网络同步(核心差异)无网络逻辑,所有操作本地完成无网络逻辑,所有控制器共享同一游戏世界无需 RPC / 复制,直接访问其他玩家的 Controller/Pawn所有操作需区分 “本地 / 服务器 / 客户端”:
1. 输入:本地控制器处理,通过Server_XXX()RPC 通知服务器
2. 状态:PlayerState复制到所有客户端
3. 远程控制器:仅同步数据,不执行输入逻辑
输入映射(IMC)激活 1 个全局 IMC 即可每个控制器激活专属 IMC:Subsystem0->
AddMappingContext(IMC_Player0, 0)

Subsystem1->
AddMappingContext(IMC_Player1, 0)
本地控制器激活本地 IMC,远程控制器不激活 IMCIMC 仅在本地生效,无需同步到服务器
关键 API 差异常用:GetFirstPlayerController()
Possess()
常用:GetPlayerController(Index)
SetSplitScreenMode()
常用:IsLocalPlayerController()
Server_/Client_ RPC
GetPlayerState()
Replicate(复制)
崩溃风险点低(无多控制器 / 网络逻辑)中等(需避免控制器索引越界、输入冲突)高(需处理 RPC 同步、本地 / 远程判断、网络延迟)

三、各模式核心操作实战示例(新手可直接参考)

1. 普通单人模式(最简)
操控生成的 Tank:
// 单人模式:绑定输入+控制Pawn
void AMyPlayerController::BeginPlay()
{
    Super::BeginPlay();
    // 1. 生成Pawn并直接控制
    AMyTank* Tank = GetWorld()->SpawnActor<AMyTank>(TankClass, SpawnPos, SpawnRot);
    Possess(Tank); // 无索引,直接绑定
    
    // 2. 激活全局输入映射
    ULocalPlayer* LocalPlayer = GetLocalPlayer();
    UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(LocalPlayer);
    Subsystem->AddMappingContext(IMC_SinglePlayer, 0); // 仅激活1个IMC
}

// 单人模式:处理开火输入(无网络校验)
void AMyPlayerController::HandleFire()
{
    AMyTank* Tank = GetPawn<AMyTank>();
    if (Tank) Tank->Fire(); // 直接执行,无需判断本地/远程
}

其实这思路不利于控制器的复用, 这个控制器类写死了, 只能控制玩家0;

直接操控场景 Tank:

步骤 1:给场景中的 Tank 加 “可识别标签”

在 UE 编辑器中选中场景里的 Tank → 细节面板 → 标签(Tags)→ 添加标签(比如ControllableTank),用于代码快速查找。

步骤 2:玩家控制器绑定场景 Tank(完整代码)

#include "MyPlayerController.h"
#include "Tank.h" // 引入Tank类头文件
#include "Kismet/GameplayStatics.h" // 用于查找场景Actor

void AMyPlayerController::BeginPlay()
{
    Super::BeginPlay();

    // ========== 核心:查找场景中已存在的Tank ==========
    TArray<AActor*> FoundTanks;
    // 按标签查找场景中所有带"ControllableTank"标签的Actor
    UGameplayStatics::GetAllActorsWithTag(GetWorld(), TEXT("ControllableTank"), FoundTanks);
    
    if (FoundTanks.Num() > 0)
    {
        // 转换为ATank类型(取第一个找到的Tank)
        ATank* SceneTank = Cast<ATank>(FoundTanks[0]);
        if (SceneTank)
        {
            // ========== 解绑当前角色,绑定场景Tank ==========
            UnPossess(); // 先解绑默认角色(如果有的话)
            Possess(SceneTank); // 绑定场景中的Tank,此时玩家就能操控它了
            UE_LOG(LogTemp, Log, TEXT("成功绑定场景中的Tank!"));
        }
        else
        {
            UE_LOG(LogTemp, Error, TEXT("找到的Actor不是Tank类型!"));
        }
    }
    else
    {
        UE_LOG(LogTemp, Error, TEXT("场景中未找到带ControllableTank标签的Tank!"));
    }
}

// (可选)手动切换到场景Tank的函数(比如绑定按键触发)
void AMyPlayerController::SwitchToSceneTank()
{
    TArray<AActor*> FoundTanks;
    UGameplayStatics::GetAllActorsWithTag(GetWorld(), TEXT("ControllableTank"), FoundTanks);
    
    if (FoundTanks.Num() > 0)
    {
        ATank* SceneTank = Cast<ATank>(FoundTanks[0]);
        if (SceneTank)
        {
            UnPossess();
            Possess(SceneTank);
        }
    }
2. 本地多人(分屏)模式
控制生成的Tank:
void ABattleBlasterGameMode::BeginPlay()
{
    Super::BeginPlay();

    // 1. 关于分屏:
    // C++ 动态修改分屏很复杂,建议直接在 Project Settings -> Maps & Modes -> Local MultiPlayer 里设置。
    // 如果非要代码改,通常是修改 GameViewportClient。

    // 2. 玩家 0 处理
    if (TankClass)
    {
        // 注意:必须用 GetWorld()->SpawnActor
        ATank* Tank0 = GetWorld()->SpawnActor<ATank>(TankClass, FVector(0, 0, 0), FRotator::ZeroRotator);
        APlayerController* PC0 = UGameplayStatics::GetPlayerController(GetWorld(), 0);
        
        if (PC0 && Tank0)
        {
            PC0->Possess(Tank0);
            // 这里传入你在头文件定义并赋值好的 IMC_Player0
            ActivateIMCForPlayer(0, IMC_Player0); 
        }
    }

    // 3. 玩家 1 处理 (Player 0 是“默认赠送”的,Player 1 是“按需申请”的)
    // 注意:如果是单机多屏,你显式创建第二个玩家实例
    // bSpawnPawn设置为false, means 你手动管理角色生成点和归属权
    APlayerController* PC1 = UGameplayStatics::CreatePlayer(GetWorld(), 1, true);
    if (PC1 && TankClass)
    {
        ATank* Tank1 = GetWorld()->SpawnActor<ATank>(TankClass, FVector(100, 0, 0), FRotator::ZeroRotator);
        PC1->Possess(Tank1);
        ActivateIMCForPlayer(1, IMC_Player1);
    }
}

void ABattleBlasterGameMode::ActivateIMCForPlayer(int32 PlayerIndex, UInputMappingContext* IMC)
{
	APlayerController* PC = UGameplayStatics::GetPlayerController(GetWorld(), PlayerIndex);
	if (!PC) return;
	ULocalPlayer* LocalPlayer = PC->GetLocalPlayer();
	UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(LocalPlayer);
	Subsystem->AddMappingContext(IMC, 0);
}

3. 参数详解

  • WorldContextObject: 传入 GetWorld() 即可。

  • ControllerId: 玩家索引。传 1 代表第二个玩家。如果你传 -1,引擎会自动寻找下一个可用的索引。

  • bSpawnPawn:

    • 如果设为 true:引擎会自动根据你的 GameMode->DefaultPawnClass 自动生成一个 Pawn 并让新玩家控制它。

    • 如果设为 false:引擎只生成一个空的 PlayerController,你需要像你代码里写的那样,手动 SpawnActor 然后调用 Possess。

4. 为什么不直接用 GetPlayerController(1)?

如果你不先调用 CreatePlayer,那么:

  1. GetPlayerController(1) 会一直返回 nullptr(空指针)。

  2. 后续的 PC1->Possess(...) 会导致游戏直接崩溃。

  3. 屏幕也不会自动分屏,因为没有第二个“本地玩家”实例。

5. 关于分屏的补充

当你成功调用 CreatePlayer(GetWorld(), 1, ...) 后,虚幻引擎的 ViewportClient 会检测到本地玩家数量变成了 2,它会自动按照项目设置里的分屏规则进行分屏。

如果你发现没有分屏,请检查:

  • Project Settings -> Maps & Modes -> Local Multiplayer。

  • 确保 Use SplitScreen 勾选上了。

  • 可以在这里设置分屏方向(水平 Hozirontal 或 垂直 Vertical)。

这段代码里没有 “手动给控制器分配屏幕区域” 的代码,但这不是遗漏 —— 因为 UE 的分屏模式(SetSplitScreenMode)会自动按 “玩家索引” 分配屏幕区域,不需要开发者手动指定, 当然, 你也可以自己手动指定, 比如下面这个例子中, 我们自己指定;
void AMyGameMode::BindSceneTankToPlayer(int32 PlayerIndex, FName TankTag);

  • int32 PlayerIndex:要绑定的本地玩家索引(如 0 对应玩家 0,1 对应玩家 1);
  • FName TankTag:场景中目标 Tank 的标签(需提前给 Tank 设置该标签,用于精准查找)
控制场景内的Tank:

本地多人需要给不同玩家分配不同的场景 Tank,核心是给每个 Tank 加专属标签(比如Tank_Player0、Tank_Player1),再在 GameMode 中按控制器索引绑定:

步骤 1:场景 Tank 加专属标签

  • 玩家 0 的 Tank:标签Tank_Player0;
  • 玩家 1 的 Tank:标签Tank_Player1。

步骤 2:GameMode 中绑定(核心代码)

#include "MyGameMode.h"
#include "MyPlayerController.h"
#include "Tank.h"
#include "Kismet/GameplayStatics.h"

void AMyGameMode::BeginPlay()
{
    Super::BeginPlay();
    // 1. 启用分屏
    GetWorld()->GetFirstPlayerController()->SetSplitScreenMode(ESplitScreenMode::TwoPlayers_Horizontal);
    // 2. 绑定玩家0到场景中的Tank_Player0
    BindSceneTankToPlayer(0, TEXT("Tank_Player0"));
    // 3. 绑定玩家1到场景中的Tank_Player1
    BindSceneTankToPlayer(1, TEXT("Tank_Player1"));
}

// 通用函数:按玩家索引和标签绑定场景Tank
void AMyGameMode::BindSceneTankToPlayer(int32 PlayerIndex, FName TankTag)
{
    // 获取对应索引的玩家控制器
    APlayerController* PC = GetWorld()->GetPlayerController(PlayerIndex);
    if (!PC)
    {
        UE_LOG(LogTemp, Error, TEXT("未找到索引%d的玩家控制器!"), PlayerIndex);
        return;
    }

    // 查找对应标签的场景Tank
    TArray<AActor*> FoundTanks;
    UGameplayStatics::GetAllActorsWithTag(GetWorld(), TankTag, FoundTanks);
    
    if (FoundTanks.Num() > 0)
    {
        ATank* SceneTank = Cast<ATank>(FoundTanks[0]);
        if (SceneTank)
        {
            PC->UnPossess();
            PC->Possess(SceneTank);
            UE_LOG(LogTemp, Log, TEXT("玩家%d成功绑定场景Tank(标签:%s)"), PlayerIndex, *TankTag.ToString());
        }
    }
    else
    {
        UE_LOG(LogTemp, Error, TEXT("玩家%d未找到标签为%s的场景Tank!"), PlayerIndex, *TankTag.ToString());
    }
}
3. 线上多人模式(核心:本地 / 远程 + RPC)
// 线上多人:处理开火(必须加本地判断+RPC)
void AMyPlayerController::HandleFire()
{
    // 核心:仅本地控制器处理输入,远程控制器跳过
    if (!IsLocalPlayerController()) return;
    
    // 调用服务器RPC,通知服务器执行开火(保证所有客户端同步)
    Server_Fire();
}

// 服务器RPC:可靠执行开火逻辑(所有客户端同步)
UFUNCTION(Server, Reliable, WithValidation)
void AMyPlayerController::Server_Fire()
{
    // 验证:确保Pawn有效且在可开火状态
    if (!GetPawn<AMyTank>()) return;
    if (!GetPawn<AMyTank>()->CanFire()) return;

    // 服务器执行开火,通过复制同步到所有客户端
    GetPawn<AMyTank>()->Fire();
}

// 线上多人:出生时控制Pawn(服务器分配)
void AMyPlayerController::OnRep_Pawn()
{
    Super::OnRep_Pawn();
    // 仅本地控制器激活输入映射(远程控制器不激活)
    if (IsLocalPlayerController())
    {
        ULocalPlayer* LocalPlayer = GetLocalPlayer();
        UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(LocalPlayer);
        Subsystem->AddMappingContext(IMC_OnlinePlayer, 0);
    }
}

四、核心差异总结(新手速记)

模式类型核心特征(PlayerController 视角)开发关键注意点
普通单人1 个本地控制器,无网络 / 分屏逻辑无需索引 / 同步,直接调用核心 API 即可
本地多人(分屏)多本地控制器,共享游戏世界,分屏渲染1. 按PlayerIndex区分控制器 / IMC/Pawn2. 配置分屏视口3. 避免输入冲突
线上多人本地控制器 + 远程控制器,跨设备同步1. 所有输入逻辑加IsLocalPlayerController()校验2. 用 RPC 同步操作到服务器3. 依赖PlayerState同步玩家数据4. 远程控制器仅同步状态,不处理输入

额外新手避坑提示

  1. 本地多人不要用GetFirstPlayerController()—— 永远只返回 Player0,导致 Player1 无输入;
  2. 线上多人不要直接调用远程控制器的函数 —— 必须通过服务器 RPC 同步;
  3. 分屏模式下,每个控制器的bShowMouseCursor是独立的,需分别设置;
  4. 线上多人中,PlayerController的变量默认不复制,需把玩家数据(血量、分数)放到PlayerState中并标记Replicate。
【虚幻UE5-C++】 ––– 深入探讨UE5-C++中PlayerController的常见用法 PlayerController是一个控制玩家在游戏中的角色的控制器,它处理玩家输入、管理玩家的控制权,以及执行与玩家相关的游戏逻辑。每个玩家都有一个对应的PlayerController。通过深入了解PlayerController的更多常见用法,开发者可以更灵活地处理玩家输入、控制相机、交互操作等方面的任务。PlayerController作为虚幻引擎中与玩家直接交互的核心组件,其强大的功能和灵活的接口为游戏开发提供了广阔的空间。 阅读详情

相关推荐

UE4多人VR随笔 —— 关于playerController 不得不说的故事

** 关于playerController 不得不说的故事 ** 开局一张图,玄机都在图里面。 在开发多人VR 应用过程中, 我们会发现 playerController 是一个非常重要的类。 我们先阐述它的一些重要的基本点。 一,基本点 每一个client 都有一个独立的playercontroller, 一个client的 playercontroller 只存在于它自身以及server端...

gaofei7439的博客 3995

深入UE——GamePlay架构(六)PlayerController和AIController

深入UE——GamePlay架构(六)PlayerController和AIController

ttod的博客 2552

UE5玩家控制器APlayerController入门:输入、附身与调试全解析

在游戏开发中,玩家如何通过键盘鼠标控制角色移动、转向与交互,是构建可玩性的基础问题。引擎的输入系统将设备信号采集后,需要交由一个统一的“玩家意志”载体进行转发与决策,这就是玩家控制器(PlayerController)的核心职责。APlayerController作为连接输入与Pawn/Character的桥梁,不仅负责输入绑定与分发,还管理镜头、UI模式、附身(Possess)与重生流程。合理划分控制器与角色逻辑,能有效避免“有角色却无响应”“镜头乱转”等工程实践中的高频问题。在UE5项目中,通过重载Se

weixin_29008691的博客 244

[UE4] APlayerController和AAIController

[UE4] APlayerController和AIController参考APlayerControllerAAIController 参考 《InsideUE4》GamePlay架构(六)PlayerController和AIController ue4 玩家控制器APlayerController Unreal Engine 4:学习笔记(八)PlayerController APlayerController 作用: APlayerController 实现了从玩家获取输入数据并将其转换为动作的功能

selfsongs 4877

UE4SS脚本注入器:从零开始为虚幻引擎4游戏制作Lua Mod

脚本注入技术是一种通过外部程序向正在运行的进程注入并执行自定义代码的方法,其核心原理是修改目标进程的内存空间,加载额外的动态链接库或脚本解释器。这项技术为软件深度定制和功能扩展提供了可能,尤其在游戏模组开发领域具有重要价值。通过脚本注入,开发者能够突破原有程序的限制,实现从界面修改到核心逻辑干预的广泛功能,从而创造出个性化的用户体验。在虚幻引擎生态中,UE4SS作为一个通用的脚本注入器,将这一技术与Lua脚本语言相结合,为《赛博朋克2077》、《艾尔登法环》等基于UE4的游戏提供了强大的模组开发能力。它通过

weixin_33739541的博客 374

UE4SS从入门到精通:Lua脚本注入与虚幻引擎模组开发实战指南

在游戏开发和模组制作领域,脚本注入技术是一种通过外部程序向目标进程注入并执行自定义代码的方法,从而在不修改原始程序的情况下扩展其功能。其核心原理通常涉及动态链接库(DLL)注入、函数钩子(Hook)和内存读写等技术,实现对程序运行时行为的监控与修改。这项技术的核心价值在于为单机游戏、自动化测试和软件研究提供了强大的定制与扩展能力,尤其适用于没有官方模组支持或需要深度定制的场景。以虚幻引擎(UE4/UE5)为例,社区开发者通过UE4SS这一开源脚本系统,能够利用Lua脚本语言直接与引擎内部对象交互,实现从修改

weixin_30615767的博客 346

虚幻引擎_玩家控制器APlayerController(初阶)

摘要:APlayerController是UE中玩家与游戏世界交互的核心枢纽,主要功能包括:1)输入处理(绑定按键/鼠标操作、控制输入模式);2)控制Pawn(绑定/切换角色、传递指令);3)视角管理(相机控制、鼠标显示);4)UI交互(HUD管理、UI输入)。每个本地玩家对应一个控制器,在多人游戏中负责同步操作。新手需牢记其作为"总遥控器"的定位,负责接收输入并传递给角色执行动作。

我的博客主要是用来给我自己复习的,主要是上传一些知识点,小型的项目和功能模块,如果有什么问题或错误麻烦联系我! 3180

虚幻引擎鼠标光标底层控制原理与跨平台实践

鼠标光标是人机交互最基础的视觉反馈元素,其本质是操作系统输入事件、渲染管线绘制逻辑与平台API兼容性的交汇点。在虚幻引擎(UE4/UE5)中,光标控制涉及输入捕获时机、可见性管理权归属、纹理生命周期及多平台API适配等核心机制。技术价值在于保障交互一致性与低延迟响应,广泛应用于游戏开发、工业仿真、建筑可视化和AR/VR系统。本文聚焦UE4/UE5中Mouse Cursor的实际失效场景,解析从操作系统接管到Slate渲染的三次控制权移交过程,并提供基于PlayerController、UMG、Slate底层

weixin_33827731的博客 3294

虚幻引擎_AController_APlayerController_AAIController

要彻底理清 UE 中 AController、APlayerController、AAIController 的关系和差异,我们可以从 类继承体系、核心定位、功能能力、使用场景 四个维度展开,结合实战代码和对比表,让你一眼看懂三者的区别与联系。

我的博客主要是用来给我自己复习的,主要是上传一些知识点,小型的项目和功能模块,如果有什么问题或错误麻烦联系我! 906

UE4SS Mod开发指南:从原理到实践,打造虚幻引擎游戏Mod

动态链接库注入技术是现代软件扩展和游戏模组开发中的一项关键技术,其核心原理是通过将自定义代码模块加载到目标进程的内存空间,实现对程序行为的动态修改和功能扩展。这项技术的价值在于它提供了一种非侵入式的程序扩展方式,无需修改原始程序文件,极大地提升了开发灵活性和安全性。在游戏Mod开发领域,尤其是针对虚幻引擎4/5构建的大型游戏,这项技术催生了强大的Mod开发框架。通过理解函数钩子、内存偏移量、模式扫描等底层原理,开发者可以稳定地访问和修改游戏对象与函数。其应用场景广泛,从简单的游戏数值调整、UI修改,到复杂的

weixin_30432579的博客 401

虚幻引擎PlayerController全解析:从输入到控制链的设计思路

在游戏开发中,玩家控制逻辑的设计往往决定了操作手感与系统扩展性。APlayerController是虚幻引擎中连接玩家输入与游戏世界的关键中介,它负责接收键盘、鼠标等原始信号,解析后指挥Pawn执行动作。这种解耦设计让玩家在不同角色、载具之间切换时无需重写控制逻辑,同时为网络同步、相机管理等复杂需求提供了统一入口。理解PlayerController的生命周期、Possess机制与输入分发原理,是掌握虚幻引擎项目架构的重要基础。本文从概念到实操,系统梳理了玩家控制器的核心定位、常见用法与踩坑经验,帮助游戏开

weixin_33100393的博客 220

ue4 玩家控制器APlayerController

通过 APlayerController 可以让输入设备控制游戏,可以直接在蓝图中设置,不过我比较喜欢折腾c++(逻辑代码都是用c++写) 1、创建一个 AMyPlayerCtrler 继承自 APlayerController,重写一些方法AMyPlayerCtrler.h#include "MyPlayerCtrler.generated.h"class UMyInput; class UMyC

. 1万+

从Reset到Read:深入解析Rolling Shutter曝光流水线

本文深入解析Rolling Shutter(卷帘曝光)的工作原理,重点探讨Reset和Read信号在图像传感器中的关键作用。通过Reset-Read流水线机制,详细解释了曝光控制、时序调优及运动伪影补偿等核心技术,帮助读者理解卷帘曝光在高速摄影和动态场景中的应用。

weixin_42531925的博客 253

虚幻引擎玩家控制器开发指南

玩家控制器是游戏开发中处理用户输入的核心组件,负责将键盘、鼠标等输入设备的信号转化为游戏内行为。其工作原理基于输入事件绑定与响应机制,通过分离控制逻辑与角色行为实现灵活的操作系统。在虚幻引擎中,玩家控制器(APlayerController)与角色控制器(APawn)的协作模式类似驾驶员与汽车的关系,这种设计模式特别适合需要切换控制对象的场景,如从第一人称切换到载具驾驶。技术实现上涉及输入映射配置、摄像机控制方案选择以及网络同步处理,其中客户端预测和服务器回滚是解决多人游戏延迟问题的关键技术。玩家控制器的优

weixin_33507732的博客 53

STM32 SYSTICK定时器及延时函数详解

STM32 SYSTICK及延时函数详解 SysTick定时器 SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心

w1050321758的博客 2365

UE4_SpeedTree Shader源码分析

目录 1.UMaterialExpressionSpeedTree::Compile 2.Compiler->SpeedTree 3.GetSpeedTreeVertexOffset 4.Scene中的SpeedTree应用 (Scene->UpdateSpeedTreeWind) 5.GetSpeedTreeVertexOffsetInner 由于之后做风场,也需要在S...

zzgyy123的专栏 2629

虚幻引擎UE5专用服务器游戏开发-18 隐藏本地玩家角色头顶控件显示的

摘要: 本文分析了Unreal Engine中本地玩家控制器判断的两种方法:IsLocalPlayerController()专用于PlayerController类型,区分本地玩家控制;IsLocalController()适用于所有控制器类型,包括AI。在实现角色头顶状态条时,使用IsLocallyControlledByPlayer()隐藏本地玩家的UI,并通过重写PossessedBy()函数确保AI角色也能初始化能力系统组件。关键点包括:控制器类型判断的差异、网络同步的初始化时机,以及通过Serv

chenchaoNH的博客 723

从零开始:用Xilinx FPGA实现RISC-V单周期CPU(附完整Verilog代码)

本文详细介绍了如何使用Xilinx FPGA从零开始实现RISC-V单周期CPU,包括开发环境搭建、核心架构设计、Verilog代码实现及功能验证。通过实战指南和完整代码示例,帮助开发者掌握RISC-V CPU设计的关键技术,适用于嵌入式系统和定制化计算场景。

weixin_30664051的博客 544

UE APlayerController玩家控制器 是如何取得系统所发的系统按下按键信息的?Windows平台

FWindowsApplication::ProcessMessage( HWND hwnd, uint32 msg, WPARAM wParam, LPARAM lParam ) 函数中进行消息处理。我们发现 UE是统一进入DeferMessage()函数中进行处理的。

qq_59398646的博客 1438

GlobalPlatform Technology Secure Channel Protocol ‘03‘ 标准 - 安全通道协议简介

按照GlobalPlatform Technology Secure Channel Protocol '03' (SCP03)标准,描述了如何利用S-MAC,S-RMAC,S-ENC进行安全通信的过程。

mmmx777的专栏 6091

李宏毅机器学习笔记第17周_概述领域自适应(Domain Adaptation)

Domain Adaptation

peaunt1的博客 1101

【UE5】虚幻引擎的运行逻辑

UE5的运行逻辑。

一个写程序的 1695

YOLOv8性能提升:引入华为GhostNetv1特征提取网络

本文提出一种轻量化改进方案,将GhostNetV1作为YOLOv8的主干网络,以提升移动端部署效率。通过Ghost模块的两步特征生成机制(初级卷积+廉价操作),显著降低了30%的计算量(FLOPs)和参数量,精度损失控制在1%以内。实验表明,改进后的模型在骁龙865芯片上推理速度提升25%。核心创新包括:1)用GhostBottleneck替换CSP模块;2)保留FPN+PAN结构确保多尺度检测能力;3)提供完整的PyTorch实现方案。该工作为资源受限场景的目标检测提供了实用解决方案,未来可结合注意力机制

shrgegrb的博客 1180

UE5 APlayerController 入门:玩家控制器的架构、输入与视角

在虚幻引擎中,玩家控制器的设计是游戏架构的基石。APlayerController 作为玩家“灵魂”的载体,独立于 Pawn 或 Character 存在,负责捕获输入、管理 Possess 附身逻辑,并掌控相机视角。理解 PlayerController 与 Pawn、PlayerState 的分工,是掌握游戏控制流程的关键。本文从经典 MVC 映射切入,讲解控制器与输入系统的协作原理,并结合蓝图与 C++ 实操,展示如何实现按键响应、角色切换、视角控制等常见功能,帮助初阶开发者理清输入事件分发的完整链路

weixin_32382335的博客 199

【C2000系列DSP的双向DC-DC电源】基于TMS320F28034的DC-DC项目开发流程

理解DC-DC 双向电源(基于 TMS320F28034)的开发流程,需要从功能拆解、开发步骤、验证 / 测试项

昔时扬尘处 323

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

UE4SS实战指南:从原理到部署,掌握虚幻引擎运行时脚本注入

DLL注入是一种允许外部代码在目标进程内存空间中运行的技术,通过挂钩关键函数和利用进程间通信,实现对应用程序行为的动态监控与修改。这一技术在游戏开发、软件调试和安全研究领域具有重要价值,尤其在游戏模组(Mod)制作中,它能绕过源码限制,实现非侵入式的功能扩展。虚幻引擎(Unreal Engine)自带的反射系统为运行时类型信息查询提供了基础,结合脚本注入,开发者可以在无需重新编译的情况下,动态调用引擎内部函数、修改游戏逻辑。本文以UE4SS(Unreal Engine 4 Scripting System)

cuanjingyue4687的博客 467

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: 虚幻引擎_AController_APlayerController_AAIController
下一篇: 虚幻引擎_玩家控制器APlayerController(初阶)
Howrun777
博客等级 码龄1年 133粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值