3.9 KiB
3.9 KiB
FInputCommand
基本信息
- 类型: USTRUCT(BlueprintType)
- 父类: (none)
- 源文件: Plugins/CharacterControl/Source/CharacterControl/Public/InputCommandData.h
- 模块: CharacterControl
功能概述
将 UInputAction 映射到命令路由参数的数据行。包含 InputAction 引用、bIsContinuous 标志位、ContinousCommandTag(连续命令的 FGameplayTag)、DiscreteCommandMeta(离散命令的 TInstancedStruct
设计用意
设计者配置单元。回答"当此输入触发时,应生成什么命令数据包?"将连续和离散元数据分离到不同字段中,以反映不同的路由语义。
职责范围
单个输入到命令映射的配置数据。由 UCommandInputComponent::BuildPacket 使用。存储在 UInputCommandData::InputCommands 数组中。
项目内依赖
| 依赖项 | 关系 | 源文件 |
|---|---|---|
| CommandEndpoint.h | #include (for FDiscreteMeta, etc.) | Plugins/CharacterControl/Source/CharacterControl/Public/CommandEndpoint.h |
对外接口
FInputCommand 是一个纯数据配置结构体,定义"某个 Enhanced Input 动作触发时生成什么命令"的映射规则。在 UInputCommandData 资产编辑器中通过详情面板配置。所有字段为 BlueprintReadWrite。
- InputAction (TObjectPtr, BlueprintReadWrite): 引用的 Enhanced Input Action 资产,用于绑定输入事件
- bIsContinuous (bool, BlueprintReadWrite): 命令类型开关。true = 连续命令(使用 Triggered 事件,每帧触发),false = 离散命令(使用 Started 事件,一次性)
- ContinousCommandTag (FGameplayTag, BlueprintReadWrite): 连续命令的语义标签,BuildPacket 时写入 FContinuousPayload::CommandTag
- DiscreteCommandMeta (TInstancedStruct, BlueprintReadWrite): 离散命令的路由元数据,包含 CommandTags 和 bIsAll 匹配模式。BuildPacket 时直接拷贝到 FCommandPacket::DiscretePayload
调用者通过 UInputCommandData 资产配置 FInputCommand 数组,运行时由 UCommandInputComponent::BuildPacket 逐字段读取构建命令包。
使用方法
FInputCommand 在 UInputCommandData::InputCommands 数组中配置,运行时由 UCommandInputComponent 读取:
- 配置定义:
Plugins/CharacterControl/Source/CharacterControl/Public/InputCommandData.h:39-- UInputCommandData::InputCommands 类型为TArray<FInputCommand> - BuildPacket 消费:
Plugins/CharacterControl/Source/CharacterControl/Private/CommandInputComponent.cpp:41-80-- BuildPacket 从 FInputCommand 读取 InputAction(获取 CommandID)、bIsContinuous(决定处理路径)、ContinousCommandTag(连续载荷标签)、DiscreteCommandMeta(离散载荷) - 绑定循环:
Plugins/CharacterControl/Source/CharacterControl/Private/CommandInputComponent.cpp:96-- BindAllCommands 遍历CommandData->InputCommands数组 - 事件类型选择:
Plugins/CharacterControl/Source/CharacterControl/Private/CommandInputComponent.cpp:99-101-- 根据 bIsContinuous 选择 ETriggerEvent::Triggered 或 Started
用例
- 连续命令配置: 策划在 UInputCommandData 资产中将某个 FInputCommand 的 bIsContinuous 设为 true,设置 ContinousCommandTag(如 "Input.Move"),BuildPacket 将摇杆移动量转为 FVector3f,生成每帧触发的连续命令包
- 离散命令配置: 策划将 bIsContinuous 设为 false,配置 DiscreteCommandMeta.CommandTags(如 "Action.Jump")和 bIsAll 匹配模式,BuildPacket 在按键按下时生成一次性命令包
- BuidPacket 字段读取:
Plugins/CharacterControl/Source/CharacterControl/Private/CommandInputComponent.cpp:70-78-- BuildPacket 逐一读取 Command.InputAction(CommandID)、Command.bIsContinuous(Meta+载荷选择)、Command.ContinousCommandTag(连续载荷)、Command.DiscreteCommandMeta(离散载荷),组装完整的 FCommandPacket