UE4多人VR随笔 —— 关于playerController 不得不说的故事
**
关于playerController 不得不说的故事
**
开局一张图,玄机都在图里面。
在开发多人VR 应用过程中, 我们会发现 playerController 是一个非常重要的类。 我们先阐述它的一些重要的基本点。
一,基本点
- 每一个client 都有一个独立的playercontroller, 一个client的 playercontroller 只存在于它自身以及server端(可理解为替身)上。
- client 之间是无法直接互相访问到 各自的 playercontroller 的。
- playerController 它是 Client 的核心, 因为 它是 client 拥有”Owns” 的第一个类。
二, 关于调用
playercontroller的调用 ,有一个经典调用 方式: Get player Controller[0] 或者 UGameplayStatics::GetplayerController[GetWorld,0] 在 server 端 和在client 端 工作的方式是完全不一样的, So, 主要如下:
- 如果在 Listen—Server 端(我们平常用的server)调用 , 将会返回 Listen—Server 端 的 PlayerController 。
- 如果在 Client 端调用, 将会返回 Client 端 的 PlayerController 。
- 如果在 Delicated Server 端调用 ,将会返回 第一个 Client 端的 PlayerController 。(此模式下的框架, 我们几乎很少用)
三, 一个演示的例子
我们计划 在WidgetButton 中通过按键 增加 GameState 中一个 复制的(Replicated)的变量。
提问: 为什么我们需要使用 PlayerController ?
回答: 因为 Wiggets 只存在与 Client 和 Listen—Server 端。即使Widgets 被 Clients 端所有, Server 端的 RPC(远程过程调用) 仍然 没有 这个 widget 的实例可以在 server 端上运行。 它不是复制的。
所以,我们需要一种方式 获取 按键按下 给到 server 端 ,这样 server端就可以 增加这个 变量的数值。
提问: 为什么 我们不使用 RPC 在 GameState 上?
回答: 因为 RPC 是被 Server端拥有的、 一个Server端的RPC 需要 Client 作为拥有者。 (这句话目前还没理解,这句话可能就是关键的钥匙)
实现步骤: 按照倒叙的方式进行,这样逻辑会稍微清楚一点。
GameState 端执行的函数:
Player controller 端执行的函数:
UMG 蓝图中调用的函数: