Files
loneseDocument/Plugins/CharacterControl/ICommandEndpoint.md
meishibiezb 29a3f77908 init
2026-06-04 21:44:13 +08:00

5.4 KiB
Raw Blame History

ICommandEndpoint

基本信息

  • 类型: UINTERFACE + C++ interface
  • 父类: UInterface
  • 源文件: Plugins/CharacterControl/Source/CharacterControl/Public/CommandEndpoint.h
  • 模块: CharacterControl

功能概述

Central abstraction for all nodes in command routing graph. Pure virtual methods: GetEndpointState, GetStateChangedDelegate, GetCommandOutputDelegate, ReceiveCommand. BlueprintNativeEvents: ReceiveCommand_BP, GetEndpointDispatcher_BP. Default C++ implementations route through dispatcher for Blueprint subclasses, while C++ subclasses override directly.

设计用意

Uniform interface enabling heterogeneous routing graph. Routers manage collections of ICommandEndpoint without knowing concrete types. Dispatcher pattern solves UE limitation that BlueprintNativeEvent can't return delegate references directly.

职责范围

Defines contract for command routing participants. All routers, endpoint components, and input components implement this. Single ReceiveCommand entry point for all command types.

项目内依赖

依赖项 关系 源文件
FEndpointState 返回类型 (GetEndpointState) Plugins/CharacterControl/Source/CharacterControl/Public/CommandEndpoint.h
FCommandPacket 参数类型 (ReceiveCommand) Plugins/CharacterControl/Source/CharacterControl/Public/CommandEndpoint.h
UEndpointDispatcher 返回类型 (GetEndpointDispatcher_BP) Plugins/CharacterControl/Source/CharacterControl/Public/CommandEndpoint.h

对外接口

ICommandEndpoint 是命令路由图中所有参与者的统一抽象接口。任何希望接收或产出命令的对象都需要实现此接口。接口包含四个 C++ 纯虚方法和两个 BlueprintNativeEvent。

C++ 纯虚方法C++ 子类直接重写):

  • GetEndpointState() -> const FEndpointState&: 返回端点的身份和配置状态。UCommandRouter::RegisterEndpoint 以此获取 GUID 和 InterestedTags
  • GetStateChangedDelegate() -> FOnEndpointStateChanged&: 返回状态变更委托引用。Router 通过 BindDynamic 订阅,当端点状态变化时触发标签聚合更新
  • GetCommandOutputDelegate() -> FOnCommandOutput&: 返回命令输出委托引用。Router 订阅以接收端点产出的命令,转发给其他端点
  • ReceiveCommand(const FCommandPacket&): 接收命令的统一入口。Router 调用此方法向匹配的端点投递命令

BlueprintNativeEvent(蓝图子类重写):

  • ReceiveCommand_BP(const FCommandPacket&): 蓝图端点的命令接收入口。C++ 默认实现通过调度器桥接调用此事件
  • GetEndpointDispatcher_BP() -> UEndpointDispatcher*: 蓝图端点返回调度器实例。C++ 默认实现通过此方法获取委托引用

默认实现策略C++ 默认实现CommandEndpoint.cpp:8-26全部通过 Execute_GetEndpointDispatcher_BP 获取 UEndpointDispatcher然后委托执行。这意味着蓝图类如 UEndpointComponent_BP 子类)必须重写 GetEndpointDispatcher_BP 并返回有效调度器。C++ 类UCommandRouter、UCommandRouterComponent、UEndpointComponent则直接重写纯虚函数不使用调度器。

使用方法

ICommandEndpoint 是接口而非具体类,通过 TScriptInterface 在多处使用:

  • 路由器注册: Plugins/CharacterControl/Source/CharacterControl/Public/CommandRouter.h:37 -- RegisterEndpoint 接受 TScriptInterface<ICommandEndpoint>,从接口获取端点状态、委托并完成注册
  • 路由器实现: Plugins/CharacterControl/Source/CharacterControl/Public/CommandRouter.h:14 -- UCommandRouter 实现此接口,作为端点参与上级路由器的路由
  • 组件实现: Plugins/CharacterControl/Source/CharacterControl/Public/CommandRouterComponent.h:14 -- UCommandRouterComponent 实现此接口,委托给 InternalRouter
  • 端点组件实现: Plugins/CharacterControl/Source/CharacterControl/Public/EndpointComponent.h:13 -- UEndpointComponent 实现此接口,作为蓝图端点的基类
  • 默认 C++ 实现: Plugins/CharacterControl/Source/CharacterControl/Private/CommandEndpoint.cpp:8-26 -- 所有纯虚函数的默认实现,通过调度器桥接蓝图

用例

  • Router 实现端点的 ReceiveCommand: Plugins/CharacterControl/Source/CharacterControl/Public/CommandRouter.h:22-25 -- UCommandRouter 直接重写 ReceiveCommand、GetEndpointState、GetStateChangedDelegate、GetCommandOutputDelegate不使用调度器桥接
  • EndpointComponent 实现端点的 ReceiveCommand: Plugins/CharacterControl/Source/CharacterControl/Public/EndpointComponent.h:30-33 -- UEndpointComponent 直接重写纯虚方法ReceiveCommand 转调 BlueprintImplementableEvent OnCommandReceived
  • 端点注册入口: Plugins/CharacterControl/Source/CharacterControl/Private/CommandRouter.cpp:45-84 -- RegisterEndpoint 通过 TScriptInterface 获取端点的 EndpointGuid、委托绑定状态变更和命令输出回调执行标签聚合
  • 自动发现注册: Plugins/CharacterControl/Source/CharacterControl/Private/CommandRouterComponent.cpp:37-41 -- AutoRegisterEndpoints 遍历 Actor 组件,通过 Implements<UCommandEndpoint>() 检查并注册所有实现接口的兄弟组件
  • 蓝图桥接: Plugins/CharacterControl/Source/CharacterControl/Private/CommandEndpoint.cpp:23-26 -- 蓝图类没有重写 ReceiveCommand 时C++ 默认实现调用 Execute_ReceiveCommand_BP由蓝图元数据系统查找蓝图重写