4.2 KiB
4.2 KiB
FEndpointState
基本信息
- 类型: USTRUCT(BlueprintType) with TStructOpsTypeTraits specialization
- 父类: (none)
- 源文件: Plugins/CharacterControl/Source/CharacterControl/Public/CommandEndpoint.h
- 模块: CharacterControl
功能概述
命令端点的完整状态与身份标识。包含 EndpointGuid(FGuid,唯一身份标识)、InterestedTags(FGameplayTagContainer,订阅列表)、bIsActive、bIsContinuousFriendly、bIsAsynchronous 标志位。自定义 operator= 在拷贝时保留 GUID,同时更新配置字段。TStructOpsTypeTraits 设置 WithCopy=true 强制 UE 使用 C++ 拷贝路径而非 memcpy。
设计用意
解决动态路由图中的端点身份标识问题。自定义拷贝运算符可防止 CDO/蓝图默认值覆盖运行时分配的 GUID。基于标签的订阅模型实现声明式路由(生产者与消费者之间无需硬引用)。
职责范围
路由图中单个端点的身份标识与配置。GUID 在 UCommandRouter 中作为注册表键值。标签决定端点接收哪些命令。
项目内依赖
| 依赖项 | 关系 | 源文件 |
|---|---|---|
| (none) |
对外接口
FEndpointState 定义命令端点的完整身份和配置。在 UCommandRouter::EndpointState、UEndpointComponent::EndpointState、UEndpointDispatcher::CurrentState 中作为成员使用。
- EndpointGuid (FGuid, VisibleAnywhere, BlueprintReadOnly): 端点的唯一标识符,自动初始化为 NewGuid(),路由注册表以此为 Key。自定义 operator= 在目标已有身份时保留 GUID,防止 CDO/蓝图赋值覆盖运行时身份
- InterestedTags (FGameplayTagContainer, EditDefaultsOnly, BlueprintReadOnly): 端点订阅的命令标签集合,决定端点接收哪些命令
- bIsActive (bool, EditDefaultsOnly, BlueprintReadOnly): 端点活跃开关,false 时 IsEndpointMatched 直接返回 false,端点不接收任何命令
- bIsContinuousFriendly (bool, EditDefaultsOnly, BlueprintReadOnly): 是否接收连续命令,false 的端点不会被投递连续命令
- bIsAsynchronous (bool, EditDefaultsOnly, BlueprintReadOnly): 异步端点标志,端点应在自身 ReceiveCommand 中自行调度异步执行以保证线程安全
FEndpointState 有 TStructOpsTypeTraits<WithCopy=true> 特化,强制 UE 使用 C++ 拷贝路径(而非 memcpy),确保自定义 operator= 被正确调用。
使用方法
FEndpointState 在不同位置设定和使用:
- 端点配置:
Plugins/CharacterControl/Source/CharacterControl/Private/EndpointComponent.cpp:13-- UEndpointComponent 构造函数中设置EndpointState.bIsActive = true - 路由器配置:
Plugins/CharacterControl/Source/CharacterControl/Private/CommandRouter.cpp:8-11-- UCommandRouter 构造函数中设置bIsActive=true, bIsContinuousFriendly=true, bIsAsynchronous=false - 注册时读取:
Plugins/CharacterControl/Source/CharacterControl/Private/CommandRouter.cpp:52-53-- RegisterEndpoint 读取 EndpointGuid 验证有效性和唯一性 - 匹配时读取:
Plugins/CharacterControl/Source/CharacterControl/Private/CommandRouter.cpp:266-298-- IsEndpointMatched 读取 bIsActive 和 bIsContinuousFriendly 决定匹配结果 - 状态变更:
Plugins/CharacterControl/Source/CharacterControl/Private/CommandRouter.cpp:33-42-- SetRouterState 只更新配置字段,保留 Guid 并广播 StateChangedDelegate
用例
- GUID 保护机制:
Plugins/CharacterControl/Source/CharacterControl/Public/CommandEndpoint.h:88-105-- 自定义 operator= 通过 bGuidAssigned 标志判断:未分配时拷贝 GUID,已分配时保留现有 GUID。防止蓝图 CDO 属性灌装覆盖运行时赋予的唯一 ID - 端点注册验证:
Plugins/CharacterControl/Source/CharacterControl/Private/CommandRouter.cpp:53-58-- RegisterEndpoint 检查 EndpointGuid 有效性,无效时拒绝注册并输出警告 - 自注册防护:
Plugins/CharacterControl/Source/CharacterControl/Private/CommandRouter.cpp:65-69-- 检查端点 GUID 是否等于路由器自身 GUID,防止拓扑环路 - 匹配判断入口:
Plugins/CharacterControl/Source/CharacterControl/Private/CommandRouter.cpp:268-271-- bIsActive 为 false 时直接返回 false,快速短路所有匹配逻辑