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。
