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 的模拟需要单独停止。

模拟输入的范围

Action 注入从动作层进入关系 / 流程
正在整理图表…
Action 注入从动作层进入
查看图表源码
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 注册。

Starry手册导览从模块进入子模块与具体功能,查阅功能用途、配置步骤、技术架构和扩展方法。工程分层与系统协作了解 Framework、Gameplay 与通用插件的依赖方向,以及配置装配和运行状态的边界。模块总览与接入从行为系统、执行系统与机会调度了解 AstraAI,再为角色配置第一套组合决策。组合与覆盖正确区分优先级、行为分数与 Stack 顺序,按完整路径组织可撤销的配置。评分与抢占沿着条件、优先级、分数、持续有效性与冷却,解释一个行为为何开始或退出。Logic 与生命周期把动作接入 Start、Cancel、Cleanup,正确处理共享模板、蓝图实例与过期异步回调。BT、StateTree 与 HTN复用控制器上的树组件,正确传入数据、报告整树结果并等待安全退出。Objective 与机会生成把领域事实整理成当前机会,让评分只读数据,让生成器独立管理订阅。命令发布与领取发布一条命令后,经机会评估、Take、执行与 EndUse 完成一次受控使用。行为区域用可挂载的 Zone 组件分配行为层,并把回区机会与实际导航分开。调试与排查从初始化到候选、机会、应用层与后端,沿真实运行路径定位 AI 没有行动的原因。模块总览与使用了解通用调试工具的操作、远程连接与窗口扩展,再由各模块的排查说明定位具体问题。netImgui 远程面板在独立桌面程序查看调试窗口,区分远程 UI、游戏视口绘制与玩法网络权限。窗口扩展与属性绘制复用窗口生命周期、反射 Inspector 和场景绘制,避免为每个调试页重做基础设施。模块总览与接入从配置绑定、动作处理、通道缓存与玩家改键了解 Input,再接入角色的输入配置。绑定与配置生命周期理解跨 IMC 的共享绑定、配置所有权、延迟初始化,以及切换角色时的清理。Handler 与能力分派选择正确的输入阶段,把输入交给移动、GAS、GameplayEvent 或 UI,保持共享 Handler 无玩家状态。修饰器与双击选择输入值变换所在层,理解玩家设置修饰器与 Double Tap 的时序规则。通道输入缓存按 GameplayTag 通道开窗,保留首批或末批输入,正常关闭执行,中断取消丢弃。改键与玩家设置通过 GameSettings 统一编辑与应用,区分 SharedSettings 偏好和 Enhanced Input 键映射数据。调试与排查使用 Gamepad 与 Actions 观察和模拟输入,沿设备、映射、绑定、缓存与能力定位问题。模块总览与接入使用 UE 5.8 原生 Async Message System,把事件通知与接收方解耦,查阅消息收发、路由和 Starry 的实际接入。蓝图收发与解绑通过消息 Id、监听、载荷封装与解包的核心连线,掌握蓝图收发和任务解绑。C++ 收发与解绑按取得系统、登记监听、读取载荷、发送与解绑的顺序,查阅原生 C++ 接口用法。标签、时机与生命周期理解消息的标签层级、World 和 Endpoint 路由、游戏线程派发、载荷快照与 C++ 监听清理。项目消息与排查查阅 Starry 已接入的消息标签、载荷和触发点,区分本地通知、状态复制与 RPC 转发,并沿真实链路排查。模块总览与项目接入管理软引用加载、有序回调与任务作用域,了解指示器画布的实际接入,以及加载完成后的资源和宿主生命周期。软引用加载与 C++ 用法用组件加载软对象和控件类,保存加载结果,理解路径数组、同步回调、失败结果,以及重载与退出时的取消清理。主资产与资源驻留按主资产 ID 和 Bundle 预加载资源,理解句柄保留、取消与 GC 引用的关系,以及 AssetManager 和打包配置的职责。回调顺序与独立作用域理解并行加载与有序回调的区别,使用 FAsyncScope 分开取消任务,了解 AsyncEvent、开始完成通知和等待条件的当前边界。在文档中说明蓝图用法将真实蓝图节点嵌入正文,结合步骤、引脚和连线说明功能,节点文本随文章保存。维护这本手册本地文件与网页编辑共用一份 MDX,日常只改内容与关系,沿用共享版式和图表。