Input · 通道输入缓存

按 GameplayTag 通道开窗,保留首批或末批输入,正常关闭执行,中断取消丢弃。

本页内容6 节

真实项目使用通道窗口

Starry 的输入缓存由 UStarryInputBufferComponent 提供,InputManager 继承它。Handler 允许缓存、配置了有效通道,而且该通道当前打开时,动作快照被延迟到窗口关闭再执行。

缓存的保留边界由通道窗口控制;当前没有为每条输入设置一个自动到期的毫秒有效期。

配置一个动画输入窗口

  1. 给需要延迟的 Handler 开启 bCanBeBuffered,显式填写有效 BufferChannelTag。
  2. 确认 Manager 的 InputBufferMode 已启用;默认是 LastCommand。
  3. 在 Montage 上添加 Input Buffer Notify State(UStarryAnimNotifyState_InputBuffer)。
  4. 给 Notify State 设置与 Handler 相同的通道。
  5. 正常播放到窗口结束,确认保留的命令执行;中断 Montage,确认该窗口的命令丢弃。

Notify 默认通道是项目 Default 标签,Handler 仍需要显式配置;不存在“Handler 没填就自动匹配默认通道”的规则。该 Notify 当前只允许放在 Montage 上,只为本地控制角色操作缓存。

首批与末批按通道处理

模式该通道窗口内保留什么
FirstCommand第一批命令,后续输入不替换
LastCommand最新一批命令,覆盖该通道此前一批
DisabledManager 正常输入路径不使用这个缓存

一次 Action/事件可能对应多个 Handler。系统先按每个 Handler 的通道拆分,同通道同批内部保持原有顺序;First/Last 选择的是该通道的一批,不是只执行其中一个 Handler。

两个不同通道互不覆盖。窗口使用精确标签,不能用父标签推导所有子通道都已打开。

LastCommand 的一个正常关闭过程时序
正在整理图表…
LastCommand 的一个正常关闭过程
查看图表源码
sequenceDiagram
  participant Montage as Montage Notify
  participant Buffer as 指定通道
  participant Input as 玩家输入
  participant Handler as 延迟 Handler
  Montage->>Buffer: OpenInputBuffer
  Input->>Buffer: 第一批命令
  Input->>Buffer: 第二批命令覆盖前批
  Montage->>Buffer: CloseInputBuffer,未取消
  Buffer->>Handler: 按顺序执行第二批
  Buffer->>Buffer: 移除通道和命令

正常关闭与取消不同

OpenInputBuffer(ChannelTag) 打开窗口;CloseInputBuffer(ChannelTag, false) 执行本通道保留命令,然后移除通道与命令;传 true 直接丢弃。

Notify End 通过 UE 的 NotifyStateReachedEnd(EventReference) 判断实际是否正常结束,支持播放速率变化和 Montage 中断。它不在共享 Notify 资产中保存每个角色的计时。

同一通道没有嵌套开窗计数。独立或重叠的窗口应使用不同标签,避免一处关闭提前结束另一处的通道。

禁用与直接接口调用的边界

IsInputBufferEnabled 由模式决定,Manager 据此选择正常缓存路径。底层 OpenInputBuffer 自身只登记通道,不额外检查 Disabled;自定义调用方应先查询是否启用,而不是用“能查询到通道”判断功能已启用。

直接调用接口时,调用方还需保证通道与开关顺序;不能把底层命令存储接口当成完整输入入口,绕过 Manager 的窗口判断。

缓存不应该留下旧输入

ResetInputBuffer 清理全部通道和命令。停用输入处理或移除 Setup 时会清缓存,避免角色或功能退出后又释放旧命令。

缓存记录的是动作与输入值快照;真正执行仍回到 Handler,再调用领域能力。技能是否还能激活、目标是否仍有效,由执行时的领域规则判断。

共享处理器约束见Handler 与能力分派,配置退出见绑定与生命周期,缓存无效时看Input 排查。

实现入口:Framework/Input/StarryInputBufferComponent、StarryBufferedInputCommand 与 Framework/Animation/Notifies/StarryAnimNotifyState_InputBuffer。

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,日常只改内容与关系,沿用共享版式和图表。