update
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
- **类型**: Blueprint (PlayerController)
|
||||
- **父类**: AMyPlayerController
|
||||
- **源文件**: /Game/Blueprints/BP_TestCtl.BP_TestCtl
|
||||
- **模块**: Content
|
||||
- **模块**: Content/Blueprints
|
||||
|
||||
## 功能概述
|
||||
BP_TestCtl 是项目的玩家控制器蓝图实现,继承 C++ 的 AMyPlayerController。它实现了 OnClientPossessFinished 事件用于 Possess 完成后的初始化,并提供 SetupControllingPawn 自定义函数用于控制权切换后的 Pawn 设置。
|
||||
@@ -20,24 +20,41 @@ BP_TestCtl 负责 Possess 完成时的客户端初始化和控制权切换后的
|
||||
|--------|------|--------|
|
||||
| AMyPlayerController | 父类 | C++ 源码 |
|
||||
|
||||
## 对外接口
|
||||
- **继承自 AMyPlayerController 的 BlueprintCallable 函数**:
|
||||
- `GetOwnedPawn()` -- 获取当前控制的 Pawn,返回 APawn*,供蓝图查询当前 Possess 目标
|
||||
- **继承自 AMyPlayerController 的 BlueprintImplementableEvent 事件**:
|
||||
- `OnClientPossessFinished(APawn* P)` -- 客户端 Possess 完成时调用,在 BP_TestCtl 的 EventGraph 中实现,客户端收到 Possess 确认后的初始化入口(EventGraph 中 event_count=3)
|
||||
- **蓝图自定义函数**:
|
||||
- `SetupControllingPawn()` -- 控制权切换后的 Pawn 设置函数,无参数,在 EventGraph 的 18 个节点中被调用
|
||||
- **继承自 APlayerController 的标准接口**:所有 APlayerController 的标准事件和函数均可用(如 OnPossess、OnUnPossess、GetPlayerViewPoint 等)
|
||||
## 外部视角
|
||||
|
||||
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<AMyPlayerController>` 获取引用
|
||||
- 蓝图层通过 `GetPlayerController` 节点获取
|
||||
|
||||
## 使用方法
|
||||
- 在 BP_TestMode 中设置为 `PlayerControllerClass`,作为项目的默认玩家控制器
|
||||
- 父类 AMyPlayerController 重写了 `CalcCamera`(空操作),禁用默认摄像机计算,配合 ACameraPawn 的分离式摄像机设计
|
||||
- 父类 AMyPlayerController 重写了 `AcknowledgePossession`,在 Possess 确认后触发 `OnClientPossessFinished` 事件
|
||||
- `OnClientPossessFinished` 在蓝图 EventGraph 中实现,用于客户端在 Possess 完成后的初始化逻辑
|
||||
- `SetupControllingPawn` 在控制权切换时调用,设置新的受控 Pawn 所需的配置(如 UI 绑定、输入上下文切换等)
|
||||
- 作为薄蓝图层,主要职责是将 C++ 层的控制器能力暴露给蓝图系统
|
||||
|
||||
BP_TestCtl 在项目中的典型调用流程:
|
||||
|
||||
- **游戏初始化流程** — BP_TestMode 将 PlayerControllerClass 设为 BP_TestCtl → 引擎自动实例化 → 触发 BeginPlay → 延迟后显示鼠标光标、设置视图目标、从 HUD 获取 CommandRouter 并注册端点
|
||||
- **Possess 完成流程** — 引擎 Possess Pawn 完成后 → 触发 OnClientPossessFinished → SetupControllingPawn → 获取 BP_ControllerComp → 调用 ResetControllerLocation 重置摄像机
|
||||
- **库存同步流程** — 客户端库存变化 → UpdateInvComp_RPCReplicated 触发 → 服务器端更新 ViewCache → 客户端同步刷新
|
||||
|
||||
## 用例
|
||||
- BP_TestMode 的 `PlayerControllerClass`,每次玩家加入时实例化
|
||||
- `OnClientPossessFinished` 事件连接客户端 Possess 完成的初始化流程
|
||||
- `SetupControllingPawn` 在角色切换时重新配置 Pawn 资源
|
||||
|
||||
| 引用方 | 路径 | 用途 |
|
||||
|--------|------|------|
|
||||
| BP_TestMode | `/Game/Blueprints/BP_TestMode` | 设为 PlayerControllerClass,游戏启动时自动实例化 |
|
||||
| BP_Barrel | `/Game/Blueprints/Playground/BP_Barrel` | 引用 BP_TestCtl 用于木桶交互 |
|
||||
|
||||
Reference in New Issue
Block a user