Files
loneseDocument/Plugins/CharacterControl/FCommandMeta.md

3.5 KiB
Raw Permalink Blame History

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 时,先投递本地(清除上行标志),再向上级路由器转发