# UEndpointComponent ## 基本信息 - **类型**: UCLASS(BlueprintSpawnableComponent, Blueprintable) - **父类**: UActorComponent, implements ICommandEndpoint - **源文件**: Plugins/CharacterControl/Source/CharacterControl/Public/EndpointComponent.h - **模块**: CharacterControl ## 功能概述 Base ActorComponent for Blueprint-authored endpoints. Holds own FEndpointState, delegates. ReceiveCommand calls OnCommandReceived (BlueprintImplementableEvent). BeginPlay auto-registers with sibling UCommandRouterComponent. ## 设计用意 Primary base class for Blueprint endpoints. Subclass in Blueprint, override OnCommandReceived. Auto-wiring with UCommandRouterComponent for default setup. Blueprintable meta explicitly encourages Blueprint subclassing. ## 职责范围 Blueprint-friendly endpoint base. Handles state, delegates, and auto-registration. OnCommandReceived event is the Blueprint extension point. ## 项目内依赖 | 依赖项 | 关系 | 源文件 | |--------|------|--------| | CommandEndpoint.h | #include | Plugins/CharacterControl/Source/CharacterControl/Public/CommandEndpoint.h | ## 对外接口 UEndpointComponent 是蓝图端点的主要基类。BlueprintSpawnableComponent + Blueprintable 允许直接在蓝图中创建子类并重写事件。 **蓝图可重写事件**: - **OnCommandReceived(const FCommandPacket&)** (BlueprintImplementableEvent): 蓝图的主要扩展点。当路由器投递命令到此端点时调用。蓝图子类重写此事件实现具体逻辑(移动、技能、UI 等)。C++ 侧 ReceiveCommand 直接调用此事件 **委托(C++ 访问)**: - **OnEndpointStateChanged** (FOnEndpointStateChanged, BlueprintReadOnly): 状态变更委托。被路由器订阅以触发标签聚合更新 - **OnCommandOutput** (FOnCommandOutput, BlueprintReadOnly): 命令输出委托。端点产出命令时通过此委托广播,由路由器接收并转发 **配置**: - **EndpointState** (FEndpointState, EditAnywhere): 端点的身份和配置。在组件详情面板中设置 InterestedTags、bIsActive、bIsContinuousFriendly、bIsAsynchronous。EndpointGuid 自动生成 **自动注册**:BeginPlay 时 UEndpointComponent 主动查找兄弟 UCommandRouterComponent 并通过其 InternalRouter->RegisterEndpoint(this) 注册。只需将端点组件添加到有 UCommandRouterComponent 的 Actor 上即可自动接入本地命令总线。 ## 使用方法 蓝图子类化 UEndpointComponent 并配置 EndpointState 是最常见的端点创建方式: - **构造函数初始化**: `Plugins/CharacterControl/Source/CharacterControl/Private/EndpointComponent.cpp:8-14` -- 构造函数中设置 bIsActive=true,禁用 Tick - **ReceiveCommand 桥接**: `Plugins/CharacterControl/Source/CharacterControl/Private/EndpointComponent.cpp:16-19` -- ReceiveCommand 直接调用 OnCommandReceived(Command),将 C++ 接口调用桥接到蓝图事件 - **BeginPlay 自动注册**: `Plugins/CharacterControl/Source/CharacterControl/Private/EndpointComponent.cpp:22-42` -- 查找 Owner 上的 UCommandRouterComponent,通过 `OnCommandOutput.IsBound()` 判断是否已注册,未注册则调用 `Router->InternalRouter->RegisterEndpoint(this)` - **注册到第一个路由器**: `Plugins/CharacterControl/Source/CharacterControl/Private/EndpointComponent.cpp:39` -- `break` 语句确保只注册到第一个找到的 UCommandRouterComponent ## 用例 - **蓝图端点实现**: 创建 Blueprint 类继承 UEndpointComponent,在 EndpointState 中配置 InterestedTags(如 "Input.Move", "Action.Jump"),在 Event Graph 中重写 OnCommandReceived 实现具体逻辑 - **自动连线**: `Plugins/CharacterControl/Source/CharacterControl/Private/EndpointComponent.cpp:22-42` -- BeginPlay 自动找到兄弟 UCommandRouterComponent 并注册。策划只需将组件拖入 Actor 即可,无需手动连线 - **重复注册防护**: `Plugins/CharacterControl/Source/CharacterControl/Private/EndpointComponent.cpp:34-37` -- 通过检查 OnCommandOutput.IsBound() 判断是否已注册,避免重复注册导致标签聚合错误 - **只注册到一个路由器**: `Plugins/CharacterControl/Source/CharacterControl/Private/EndpointComponent.cpp:39` -- break 退出循环,一个端点只注册到一个路由器