# FInputCommand ## 基本信息 - **类型**: USTRUCT(BlueprintType) - **父类**: (none) - **源文件**: Plugins/CharacterControl/Source/CharacterControl/Public/InputCommandData.h - **模块**: CharacterControl ## 功能概述 Data row mapping a UInputAction to command routing parameters. Contains InputAction reference, bIsContinuous flag, ContinousCommandTag (FGameplayTag for continuous), DiscreteCommandMeta (TInstancedStruct for discrete). ## 设计用意 Designer configuration unit. Answers "When this input fires, what command packet should be generated?" Separates continuous and discrete metadata into distinct fields reflecting different routing semantics. ## 职责范围 Configuration data for one input-to-command mapping. Used by UCommandInputComponent::BuildPacket. Stored in UInputCommandData::InputCommands array. ## 项目内依赖 | 依赖项 | 关系 | 源文件 | |--------|------|--------| | 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` - **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