Input · 调试与排查
使用 Gamepad 与 Actions 观察和模拟输入,沿设备、映射、绑定、缓存与能力定位问题。
本页内容8 节
从能观察到的最前一层开始
在 PIE 或非 Shipping 游戏中按 F1 打开 HaloDebug 调试输入,再从菜单进入 Input → Gamepad 或 Input → Actions。沿下方路线检查设备、映射、Handler、缓存和领域能力,确定输入停在哪一层。
原始设备值、Enhanced Input Action、项目 Handler、领域能力是不同阶段,不要只看角色有没有动作就判定“输入丢了”。
查看图表源码
flowchart TD
Start(输入未生效) --> Raw{设备原始值正常?}
Raw -->|否| Device(检查设备、焦点与输入模式)
Raw -->|是| Action{Action 有正确值与事件?}
Action -->|否| Map(检查 IMC、优先级、修饰器与 Trigger)
Action -->|是| Bound{Manager 和 Handler 已登记?}
Bound -->|否| Setup(检查 Controller 初始化和 Setup)
Bound -->|是| Buffer{正在等待缓存窗口关闭?}
Buffer -->|是| Window(检查通道与正常结束或中断)
Buffer -->|否| Domain(检查 Mover、GAS 或业务条件)Gamepad 与 Actions
Gamepad:观察原始手柄输入
Gamepad 显示物理手柄的原始按键与轴,即使没有对应 IMC 也能观察。它通过 Slate 只读观察输入,不消费或重发原始事件;Overlay 适合边玩边看。
浅色表示物理输入,橙色表示模拟。已映射按钮可点击锁定模拟;已映射二维摇杆可拖动,松开回中,按住 Ctrl 松开可保留。分轴 Action 可在 Actions 中模拟。右键可调整或重置相关设置与布局,关闭 Gamepad 会清理它自己的模拟。
Actions:查看和模拟已映射动作
Actions 显示当前玩家已映射的 Enhanced Input Action,按 Action / Current / Inject 三列排列。根据值类型设置布尔、标量或向量,普通点击按住注入,Ctrl 点击或右键切换 Repeat。
同一 Action 资产跨多个 IMC 共用一份模拟,每帧只注入一次;同名的不同资产各自独立。移除最后一个映射或切换玩家时,工具清理对应状态。
隐藏 Actions 窗口不会停止 Repeat,完成检查后要使用 Reset。 Reset 只清理 Actions 的注入,Gamepad 的模拟需要单独停止。
模拟输入的范围
查看图表源码
flowchart LR
Key(物理按键) --> Mapping(IMC 按键映射与修饰)
Mapping --> Action(Action 自身 Modifier / Trigger)
Inject(HaloDebug Action 注入) --> Action
Action --> Event(Enhanced Input 动作事件)
Event --> Consumer(已绑定的动作使用方)Actions 通过原生 Enhanced Input 接口注入,经过 Action 自身的 Modifier 与 Trigger,绕过 IMC 按键条目上的 Modifier。因此“模拟正常、物理按键不正常”时,优先检查映射层差异。
Gamepad 与 Actions 同时模拟同一个 Action 时,按 Enhanced Input 原生累积规则处理。验证单一路径前先清理另一处的持续模拟,避免把叠加结果误认为项目重复分派。
按现象查
| 现象 | 优先检查 |
|---|---|
| Setup 加了却 HasSetupData 为 false | 是否尚在 Pending;LocalPlayer、Subsystem、InputComponent 是否就绪 |
| 动作有值但 Handler 不执行 | InputActions 资产是否一致,TriggerEvents 是否包含真实阶段 |
| 加配置时警告重复 IMC/Setup | 配置拥有者是否重叠;重复 Add 不提供来源计数 |
| 同类 Handler 执行多次 | 是否实际创建了多个对象;去重不按类名 |
| 切换配置后按住无反应 | 默认等待已按键释放,松开后再试 |
| Hold 短按没到 Completed | 可能实际是 Canceled,检查触发器结果 |
| 双击一直不成立 | 首次释放与两次间隔阈值、第二次按下事件 |
| 输入延迟到动画末尾 | 检查是否按设计进入通道缓存 |
| 中断后仍期待执行缓存 | 中断窗口按规则丢弃;不要靠补发旧命令修正 |
| 切换 Pawn 后方向不对 | 显式 ForwardReference 是否由提供者正确更新/清除 |
| 模拟可用、实体键不同 | Action 注入不经过 IMC 按键 Modifier |
| 改键页缺少某功能 | 建设置树前是否登记对应 IMC |
有 Action 不等于技能必然激活
沿 Handler 继续检查 ASC、InputTag、技能激活条件与 NetExecutionPolicy。GameplayEvent 的同步返回值不包括稍后远程 RPC 的结果,不能拿客户端当前返回值替代服务器最终结论。
移动还应确认角色 Mover 与实际能力接口接入。不要在共享 Handler 加临时玩家成员、另建缓存或补一个延迟,来绕过领域初始化缺失。
验证一次改动需要什么
针对动作验证按下、持续、正常释放与未触发取消,再覆盖改动直接涉及的配置退出、切换 Pawn、缓存取消或映射重建。跨 IMC 共享绑定的改动要同时观察同一 Action 是否只分派一次。
已有项目回归名称可用于定位,例如 Starry.Input.DoubleTapPipeline;这里提供查找线索,不代表本页编写时重新运行了 UE 自动化。
配置接入、绑定与生命周期、通道缓存分别对应排查链中的不同层。
实现入口:Framework/Input/StarryInputLogs、StarryInputManagerComponent 与相应 Handler/Trigger;观察与模拟工具位于 Plugins/Toolkit/HaloDebug/Source/HaloDebugInput,项目菜单由 UStarryDebugSubsystem 注册。