PlayerController / PlayerInput 的角色

理解输入管线对排查问题至关重要。

输入管线

平台输入(硬件)
 → FSlateApplication(UI 先处理)
 → APlayerController::InputComponent(本帧的所有按键状态)
 → UEnhancedPlayerInput::PreProcessInput / PostProcessInput
 → IMC 映射 + Modifier + Trigger
 → IA 事件 → 绑定的委托(蓝图/C++)

PlayerInput 与 Tick

APlayerController::PreProcessInput 在每帧的 Input 阶段调用,Enhanced Player Input 在此之后做 IMC 查找与修饰。若某帧 IMC 被移除,该帧事件不再产生——所以"按下时移除 IMC"不是丢失事件的根因。

常用查询

// 查当前启用的 IMC 堆栈
Subsystem->GetActiveMappingContexts();

// 查某 IA 当前映射的键
Subsystem->QueryKeysMappedToAction(IA_Interact, Keys);

// 查某键当前是否按住
PlayerController->PlayerInput->IsKeyPressed(EKeys::SpaceBar);

PlayerController 的两个开关

API 作用
EnableInput() / DisableInput() 完全开关该控制器的输入
SetInputMode() UI Only / UI And Game / Game Only

判断 UI 是否响应输入由 InputMode 与 Widget 的"击中测试"决定——下一章细讲。

常见"走到一半失效"的坑

  • Pawn 被 Possess/UnPossess:绑定在 Pawn 上的事件随 InputComponent 迁移,重新 Possess 后需确认绑定还有效;
  • 角色切换:自己写的"切换" 若重建了 InputComponent,绑定丢了——用 Controller 统一路由更稳。

本章小结

  • 输入管线:硬件 → Slate(UI) → PlayerController → EnhancedPlayerInput → IMC → IA → 委托。
  • 查询 API:活动 IMC、动作映射键、按键状态。
  • Pawn 重 Possess 可能丢绑定,输入路由建议放 Controller。