玩家系统
概述
玩家系统负责处理玩家角色的控制、输入、技能触发、交互和状态管理。采用 Enhanced Input 系统处理输入,使用 Data Asset 配置输入映射,支持键鼠和手柄操作。
核心类
ARoguePlayerCharacter
文件: Source/ActionRoguelike/Player/RoguePlayerCharacter.h/.cpp
玩家角色基类(Abstract),继承自 ACharacter,实现 IGenericTeamAgentInterface 和 IRogueActionSystemInterface。
组件:
USpringArmComponent+UCameraComponent- 第三人称摄像机URogueActionComponent- 技能和属性管理(使用URogueSurvivorAttributeSet)UAIPerceptionStimuliSourceComponent- 让 AI 能够感知到玩家UAudioComponent(AttackSoundsComp) - 攻击音效,使用bAutoManageAttachment优化
输入系统:
使用 Enhanced Input,所有输入绑定通过 URoguePlayerData Data Asset 配置:
Move- WASD/摇杆移动,基于控制器旋转方向LookMouse/LookStick- 鼠标/摇杆视角控制StartActionByTag/StopActionByTag- 通过 GameplayTag 触发/停止技能
手柄辅助瞄准:
- 每帧通过
FindCrosshairTarget()做异步球形扫射 - 检测到 Pawn 目标时,降低摇杆灵敏度倍率(0.5x),实现"粘滞"效果
- 仅在使用手柄时激活
受击响应:
- Overlay Material 闪烁效果(通过 CustomPrimitiveData 传递时间戳给材质)
- 受伤时增加 Rage 属性(等于伤害绝对值)
- 死亡时:播放死亡动画、注销感知刺激源、禁用输入、播放 UI 音效
性能优化:
bUpdateOverlapsOnAnimationFinalize = false跳过动画后的重叠查询- 骨骼网格生成 Overlap 事件,胶囊体禁用(避免双重触发)
- SpringArm 使用绝对旋转避免胶囊体旋转导致的偏移
ARoguePlayerController
文件: Source/ActionRoguelike/Player/RoguePlayerController.h/.cpp
玩家控制器,管理交互和暂停菜单。
特性:
- 内置
URogueInteractionComponent交互组件 - 使用
URogueCheatManager作为作弊管理器 - 监听任意键输入判断是否使用手柄(
bIsUsingGamepad) BeginPlayingState()暴露给蓝图用于初始化 UIOnRep_PlayerState广播事件通知 PlayerState 可用
暂停菜单:
通过 ARogueHUD::TogglePauseMenu() 实现,仅在单人模式下实际暂停游戏。
ARoguePlayerState
文件: Source/ActionRoguelike/Player/RoguePlayerState.h/.cpp
玩家持久状态,跨关卡和重生保持。
数据:
Credits- 货币系统,带网络复制和变更事件PersonalRecordTime- 个人最佳存活时间
方法:
AddCredits()/TryRemoveCredits()- 安全的货币操作SavePlayerState()/LoadPlayerState()- 存档读写UpdatePersonalRecord()- 更新记录(仅在新时间更好时更新)
URogueInteractionComponent
文件: Source/ActionRoguelike/Player/RogueInteractionComponent.h/.cpp
交互组件,挂载在 PlayerController 上,负责检测和执行交互。
检测逻辑(每帧 Tick):
- 球形重叠查找周围可交互物体(使用
TRACE_INTERACT通道) - 过滤实现了
IRogueGameplayInterface的 Actor - 通过控制器方向的点积计算权重,选择最佳交互目标
- 显示交互提示 Widget(世界空间 UI)
执行:
PrimaryInteract()→ServerInteract()(Server RPC) →IRogueGameplayInterface::Execute_Interact- 所有交互逻辑在服务端执行
URoguePlayerData
文件: Source/ActionRoguelike/Player/RoguePlayerData.h
数据资产(Data Asset),集中配置玩家的输入映射:
- Move, LookMouse, LookStick, Jump, Sprint
- PrimaryAttack, SecondaryAttack, Dash
好处是可以在编辑器中方便地切换输入配置,无需修改代码。
输入绑定架构
URoguePlayerData (DataAsset)
├── Input_Move → ARoguePlayerCharacter::Move()
├── Input_Jump → ACharacter::Jump()
├── Input_Sprint (Started) → StartActionByTag(Action.Sprint)
├── Input_Sprint (Completed) → StopActionByTag(Action.Sprint)
├── Input_LookMouse → ARoguePlayerCharacter::LookMouse()
├── Input_LookStick → ARoguePlayerCharacter::LookStick()
├── Input_PrimaryAttack → StartActionByTag(Action.PrimaryAttack)
├── Input_SecondaryAttack → StartActionByTag(Action.Blackhole)
└── Input_Dash → StartActionByTag(Action.Dash)
ARoguePlayerController
└── Input_Interact → PrimaryInteract() → ServerInteract()
网络架构
- 角色移动由 CharacterMovementComponent 处理(内置网络支持)
- 技能触发通过 ActionComponent 的 Server RPC
- 交互通过 InteractionComponent 的 Server RPC
- Credits 通过 OnRep 在客户端同步
- “被发现"通知使用 Client RPC