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

4.2 KiB
Raw Blame History

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 退出循环,一个端点只注册到一个路由器