本页合并旧版最佳实践与 FAQ 中仍有用的内容,并按 GenericInputSystem 1.6 当前源码重写。优先把输入映射、权限规则和动作响应分层配置;涉及项目行为和网络同步的部分仍由游戏负责。
实用建议
让标签表达玩法动作
在 InputConfig 中维护稳定的 Gameplay Tag 到 Input Action 映射。让 InputControlSetup 负责规则,让 InputProcessor 负责把通过的输入交给移动、战斗、技能或界面代码,避免同一权限判断散落在多个动作回调里。
将检查与响应分开
使用 Checker 回答“当前标签和阶段是否允许”,使用 Processor 回答“允许后执行什么”。每个扩展对象尽量只承担一种职责;需要多个处理器时,明确选择 MatchAll 或 FirstOnly,并检查数组顺序。
按状态作用域切换输入设定
用 PushInputSetup / PopInputSetup 成对进入和退出战斗、载具或 UI 设定。PopInputSetup 不会移除最后一个默认设定;重复压入栈中已有的同一设定也不会创建额外层。StateTree 项目可使用 GIPS Input Setup Scope 管理生命周期。
谨慎使用缓冲窗口
只在需要预输入的玩法区间开启窗口,并确保结束路径会关闭它。多个窗口可以同时活动,但释放任意窗口中的缓冲输入都会关闭全部活动窗口。需要严格优先级时先验证当前 HighestPriority 实现:当前源码可能让后续匹配输入覆盖先前项;可确认的策略是 LastInput 与 Instant。
明确选择内部或外部处理
开启 bProcessingInputExternally 后,内部检查、缓冲和处理器都会跳过。组件仍广播 OnReceivedInput,包括后来被权限规则拒绝的输入;外部监听者应自行决定如何验证,不能把事件广播当成通过许可。
把同步边界留在项目玩法层
GIPS 不定义原始硬件输入的网络复制协议。多人游戏应由项目处理动作预测、服务器校验和状态同步;不要假设 Pawn 标签或本地输入记录会自动成为网络权威状态。
常见问题
输入没有响应,先检查什么?
确认组件挂在 Pawn 上;本地玩家已建立 Enhanced Input Component;InputConfig 有有效的标签和 Input Action;需要的 Input Mapping Context 已添加;组件至少配置一个有效的 InputControlSetup。编辑器数据校验要求 InputConfig 和至少一个控制设定。
OnReceivedInput 已触发,但处理器没有运行,为什么?
事件会在每个有效标签回调中广播,即使输入之后被 Checker 拒绝或缓冲。检查 bProcessingInputExternally、当前设定、每个 Checker 的规则,以及 Processor 的 InputTags、TriggerEvents 和 CheckCanHandleInput。
为什么标签关系检查器没有看到 GAS 标签?
默认实现从 Pawn 上的 IGameplayTagAssetInterface 读取标签。如果项目标签只存在于 Ability System Component,可派生 UGIPS_InputChecker_TagRelationship 并覆盖 GetActorTags。
输入缓冲没有释放?
确认当前设定开启 bEnableInputBuffer;窗口标签已定义且当前活动;AllowedInputs 包含输入标签和触发阶段;随后确实调用了关闭窗口,或使用了 Instant。缓冲窗口本身没有持续时间字段。
可以同时开多个窗口吗?
可以。不同标签的窗口可同时活动,一个输入也可能被多个窗口接受。只要某窗口释放缓冲输入,组件会关闭所有活动窗口。当前 HighestPriority 实现可能被后续输入覆盖,暂不应依赖其优先级结果。
如何监听精确标签或层级标签?
使用组件提供的 ListenInputEvent 异步节点。默认是精确标签匹配且监听普通事件;按需选择层级匹配和缓冲事件,并在不再需要时取消异步动作。
GIPS 是否包含完整 GAS 接入或战斗逻辑?
不包含。项目可通过自定义 UGIPS_InputProcessor 调用自己的 Ability System 或玩法代码,并通过自定义 Checker 接入项目权限规则。
相关页面
- 快速上手与集成
- 输入系统组件
- 输入控制设定
- 输入缓冲系统
- 调试指南