Input · 通道输入缓存
按 GameplayTag 通道开窗,保留首批或末批输入,正常关闭执行,中断取消丢弃。
本页内容6 节
真实项目使用通道窗口
Starry 的输入缓存由 UStarryInputBufferComponent 提供,InputManager 继承它。Handler 允许缓存、配置了有效通道,而且该通道当前打开时,动作快照被延迟到窗口关闭再执行。
缓存的保留边界由通道窗口控制;当前没有为每条输入设置一个自动到期的毫秒有效期。
配置一个动画输入窗口
- 给需要延迟的 Handler 开启
bCanBeBuffered,显式填写有效BufferChannelTag。 - 确认 Manager 的
InputBufferMode已启用;默认是LastCommand。 - 在 Montage 上添加
Input BufferNotify State(UStarryAnimNotifyState_InputBuffer)。 - 给 Notify State 设置与 Handler 相同的通道。
- 正常播放到窗口结束,确认保留的命令执行;中断 Montage,确认该窗口的命令丢弃。
Notify 默认通道是项目 Default 标签,Handler 仍需要显式配置;不存在“Handler 没填就自动匹配默认通道”的规则。该 Notify 当前只允许放在 Montage 上,只为本地控制角色操作缓存。
首批与末批按通道处理
| 模式 | 该通道窗口内保留什么 |
|---|---|
FirstCommand | 第一批命令,后续输入不替换 |
LastCommand | 最新一批命令,覆盖该通道此前一批 |
Disabled | Manager 正常输入路径不使用这个缓存 |
一次 Action/事件可能对应多个 Handler。系统先按每个 Handler 的通道拆分,同通道同批内部保持原有顺序;First/Last 选择的是该通道的一批,不是只执行其中一个 Handler。
两个不同通道互不覆盖。窗口使用精确标签,不能用父标签推导所有子通道都已打开。
查看图表源码
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。