3.4 KiB
3.4 KiB
FDiscreteMeta
基本信息
- 类型: USTRUCT(BlueprintType)
- 父类: (none)
- 源文件: Plugins/CharacterControl/Source/CharacterControl/Public/CommandEndpoint.h
- 模块: CharacterControl
功能概述
离散(一次性触发)命令的路由元数据。包含 CommandTags(FGameplayTagContainer,用于端点匹配的语义标识符)和 bIsAll(布尔值,匹配模式:要求匹配全部标签还是任意标签)。
设计用意
将原始输入事件桥接到基于标签的订阅模型。定义匹配语义。FCommandPacket 中的 TInstancedStruct 允许对此进行子类化以实现专门的路由逻辑。
职责范围
定义单个离散命令的订阅匹配规则。由 UCommandRouter::IsEndpointMatched 用于端点过滤。
项目内依赖
| 依赖项 | 关系 | 源文件 |
|---|---|---|
| (none) |
对外接口
FDiscreteMeta 定义离散命令的订阅匹配规则。作为 TInstancedStruct 嵌入在 FCommandPacket::DiscretePayload 和 FInputCommand::DiscreteCommandMeta 中。所有字段为 BlueprintReadWrite。
- CommandTags (FGameplayTagContainer, BlueprintReadWrite): 离散命令携带的语义标签集合,路由时与端点 InterestedTags 进行匹配
- bIsAll (bool, BlueprintReadWrite): 匹配模式开关。true = ALL 模式(端点必须包含所有 CommandTags),false = ANY 模式(端点包含任意一个即可)
调用者在 UInputCommandData 资产中配置每个 FInputCommand 的 DiscreteCommandMeta。运行时由 UCommandRouter::IsEndpointMatched 读取并执行匹配逻辑。因为有 TInstancedStruct 支持,可子类化 FDiscreteMeta 添加自定义路由字段。
使用方法
FDiscreteMeta 在 InputCommandData 资产中配置,运行时由路由器使用:
- 配置定义:
Plugins/CharacterControl/Source/CharacterControl/Public/InputCommandData.h:24-- FInputCommand::DiscreteCommandMeta 字段类型为TInstancedStruct<FDiscreteMeta> - 包构建:
Plugins/CharacterControl/Source/CharacterControl/Private/CommandInputComponent.cpp:76-78-- 离散命令时 DiscretePayload 直接取用 Command.DiscreteCommandMeta - 提取验证:
Plugins/CharacterControl/Source/CharacterControl/Private/CommandRouter.cpp:221-249-- ExtractDiscreteMeta 验证 bIsContinuous、有效性、类型兼容性后提取 - 匹配判断:
Plugins/CharacterControl/Source/CharacterControl/Private/CommandRouter.cpp:301-327-- IsEndpointMatched 根据 bIsAll 使用 HasAll 或 HasAny 匹配
用例
- ALL 模式匹配:
Plugins/CharacterControl/Source/CharacterControl/Private/CommandRouter.cpp:308-318-- 当 bIsAll 为 true 时,端点必须用 HasAll 完全包含命令的所有 CommandTags 才会被投递 - ANY 模式匹配:
Plugins/CharacterControl/Source/CharacterControl/Private/CommandRouter.cpp:322-323-- 当 bIsAll 为 false 时,端点 InterestedTags 中包含任意一个 CommandTags 即命中 - 类型兼容性检查:
Plugins/CharacterControl/Source/CharacterControl/Private/CommandRouter.cpp:240-245-- ExtractDiscreteMeta 运行时检查 DiscretePayload 的 ScriptStruct 是否为 FDiscreteMeta 的子类,确保 TInstancedStruct 扩展安全 - 空命令防护:
Plugins/CharacterControl/Source/CharacterControl/Private/CommandRouter.cpp:311-315-- CommandTags 为空时不匹配任何端点,避免无标签命令广播给所有端点