Files
loneseDocument/Plugins/CharacterControl/FCommandMeta.md

44 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# FCommandMeta
## 基本信息
- **类型**: USTRUCT(BlueprintType)
- **父类**: (none)
- **源文件**: Plugins/CharacterControl/Source/CharacterControl/Public/CommandEndpoint.h
- **模块**: CharacterControl
## 功能概述
每个命令数据包的元数据头部。携带 CommandIDint32 类型,来自 UInputAction、HopLimituint8 类型可变每经过一个路由器跳数递减、bIsContinuous布尔值路由策略选择器、bIsUpward布尔值向上传播标志
## 设计用意
R路由信封——将"命令是什么"(有效载荷)与"命令如何传输"跳数限制、方向解耦。HopLimit 可防止路由器图结构中的广播风暴。Upward 标志支持父子路由器拓扑结构。
## 职责范围
为单个命令数据包携带路由元数据。嵌入在 FCommandPacket::Meta 中。在每个路由器跳数处递减。
## 项目内依赖
| 依赖项 | 关系 | 源文件 |
|--------|------|--------|
| (none) | | |
## 对外接口
FCommandMeta 是嵌入在 FCommandPacket::Meta 中的数据容器,所有字段通过 UPROPERTY(BlueprintReadOnly) 暴露给蓝图。调用者不直接构造 FCommandMeta而是由 UCommandInputComponent::BuildPacket 在输入事件触发时自动填充。路由过程中 UCommandRouter::ReceiveCommand 会递减 HopLimit。
- **CommandID** (int32, BlueprintReadOnly): 由 BuildPacket 从 UInputAction::GetUniqueID() 填充,标识命令来源
- **HopLimit** (uint8, mutable, BlueprintReadOnly): 每经过一层路由递减 1耗尽则丢包。BuildPacket 对连续命令设为 3、离散命令设为 5
- **bIsContinuous** (bool, BlueprintReadOnly): 决定路由分发策略(连续走 RouteContinuousCommand离散走 RouteDiscreteCommand
- **bIsUpward** (bool, BlueprintReadOnly): 上行传播标志,在上级路由器中决定是否同时投递本地和向上转发
## 使用方法
FCommandMeta 作为 FCommandPacket 的成员由 BuildPacket 构建,在 CommandRouter 中消费:
- **构建**: `Plugins/CharacterControl/Source/CharacterControl/Private/CommandInputComponent.cpp:70-72` -- BuildPacket 设置 CommandID、bIsContinuous、HopLimit连续 3、离散 5
- **跳数递减**: `Plugins/CharacterControl/Source/CharacterControl/Private/CommandRouter.cpp:16-21` -- ReceiveCommand 检查 HopLimit 并在 >0 时递减
- **上行传播跳数递减**: `Plugins/CharacterControl/Source/CharacterControl/Private/CommandRouter.cpp:155` -- 上行命令在路由器层面再递减一次
- **路由策略选择**: `Plugins/CharacterControl/Source/CharacterControl/Private/CommandRouter.cpp:23-30` -- 根据 bIsContinuous 选择 RouteContinuousCommand 或 RouteDiscreteCommand
## 用例
- **BuildPacket 构建**: `Plugins/CharacterControl/Source/CharacterControl/Private/CommandInputComponent.cpp:70-72` -- 输入触发时根据 FInputCommand::bIsContinuous 设置 Meta 各字段,连续命令 HopLimit=3离散命令 HopLimit=5
- **HopLimit 防护**: `Plugins/CharacterControl/Source/CharacterControl/Private/CommandRouter.cpp:16-18` -- ReceiveCommand 入口处首先检查 HopLimit<=0 直接丢包,防止广播风暴
- **逐跳递减**: `Plugins/CharacterControl/Source/CharacterControl/Private/CommandRouter.cpp:21` -- 每经过一个路由器mutable 的 HopLimit 减 1确保命令不会无限传播
- **上行转发**: `Plugins/CharacterControl/Source/CharacterControl/Private/CommandRouter.cpp:148-155` -- 当 bIsUpward 为 true 时,先投递本地(清除上行标志),再向上级路由器转发