# BP_TestCtl ## 基本信息 - **类型**: Blueprint (PlayerController) - **父类**: AMyPlayerController - **源文件**: /Game/Blueprints/BP_TestCtl.BP_TestCtl - **模块**: Content/Blueprints ## 功能概述 BP_TestCtl 是项目的玩家控制器蓝图实现,继承 C++ 的 AMyPlayerController。它实现了 OnClientPossessFinished 事件用于 Possess 完成后的初始化,并提供 SetupControllingPawn 自定义函数用于控制权切换后的 Pawn 设置。 ## 设计用意 BP_TestCtl 利用 AMyPlayerController 的禁用摄像机计算特性(支持 ACameraPawn 分离式摄像机),在蓝图层面提供 Possess 完成后的客户端初始化和 Pawn 设置逻辑。作为一个薄蓝图层,它将 C++ 层的控制器能力暴露给蓝图系统进行配置和扩展。 ## 职责范围 BP_TestCtl 负责 Possess 完成时的客户端初始化和控制权切换后的 Pawn 设置。摄像机计算由 C++ 层禁用(CalcCamera 空操作),角色移动由 AMyCharacter 负责,BP_TestCtl 不涉及这些底层逻辑。 ## 项目内依赖 | 依赖项 | 关系 | 源文件 | |--------|------|--------| | AMyPlayerController | 父类 | C++ 源码 | ## 外部视角 BP_TestCtl 是 AMyPlayerController 的蓝图子类,从外部调用者视角: **继承自 AMyPlayerController 的公开接口** - `GetOwnedPawn()`(BlueprintCallable)— 获取当前控制器拥有的 Pawn 实例,C++ 默认实现 - `OnClientPossessFinished(APawn* P)`(BlueprintImplementableEvent)— Possess 完成时的客户端初始化事件,蓝图可选择性实现 **BP_TestCtl 新增** - `SetupControllingPawn`(EventGraph 中定义的自定义函数)— 控制权切换后调用,用于初始化被控制 Pawn 的状态。无公开 BlueprintCallable 标注,在蓝图层内部调用 **EventGraph 事件** | 事件 | 类型 | 触发时机 | 行为 | |------|------|----------|------| | `事件开始运行` | 原生覆盖 (BeginPlay) | 控制器创建时由引擎自动触发 | 延迟 0.2 秒 → 显示鼠标光标 → 设置视图目标为自引用的 Possessed Pawn → 获取 HUD → Cast 到 BP_Hud → 获取 CommandRouter → 注册内部路由端点 | | `事件OnClientPossessFinished` | 原生覆盖 | 客户端 Possess 流程完成后 | 调用 SetupControllingPawn → 获取 BP_Controller 组件 → 调用 ResetControllerLocation | | `UpdateInvComp_RPCReplicated` | 自定义事件 (RPC) | 客户端库存变化时 | 接收 BP_InventoryComp 引用 → 调用服务器端 UpdateViewCache, 客户端 UpdateViewCacheRPC | **外部交互方式** - 引擎通过 GameMode 的 PlayerControllerClass 设置自动创建实例(BP_TestMode 中配置) - C++ 层通过 `Cast` 获取引用 - 蓝图层通过 `GetPlayerController` 节点获取 ## 使用方法 BP_TestCtl 在项目中的典型调用流程: - **游戏初始化流程** — BP_TestMode 将 PlayerControllerClass 设为 BP_TestCtl → 引擎自动实例化 → 触发 BeginPlay → 延迟后显示鼠标光标、设置视图目标、从 HUD 获取 CommandRouter 并注册端点 - **Possess 完成流程** — 引擎 Possess Pawn 完成后 → 触发 OnClientPossessFinished → SetupControllingPawn → 获取 BP_ControllerComp → 调用 ResetControllerLocation 重置摄像机 - **库存同步流程** — 客户端库存变化 → UpdateInvComp_RPCReplicated 触发 → 服务器端更新 ViewCache → 客户端同步刷新 ## 用例 | 引用方 | 路径 | 用途 | |--------|------|------| | BP_TestMode | `/Game/Blueprints/BP_TestMode` | 设为 PlayerControllerClass,游戏启动时自动实例化 | | BP_Barrel | `/Game/Blueprints/Playground/BP_Barrel` | 引用 BP_TestCtl 用于木桶交互 |