UE4多人VR随笔 —— 关于playerController 不得不说的故事

**

关于playerController 不得不说的故事

**
开局一张图,玄机都在图里面。
UE4多人VR随笔 —— 关于playerController 不得不说的故事
在开发多人VR 应用过程中, 我们会发现 playerController 是一个非常重要的类。 我们先阐述它的一些重要的基本点。

一,基本点

  1. 每一个client 都有一个独立的playercontroller, 一个client的 playercontroller 只存在于它自身以及server端(可理解为替身)上。
  2. client 之间是无法直接互相访问到 各自的 playercontroller 的。
  3. playerController 它是 Client 的核心, 因为 它是 client 拥有”Owns” 的第一个类。
    UE4多人VR随笔 —— 关于playerController 不得不说的故事

二, 关于调用

playercontroller的调用 ,有一个经典调用 方式: Get player Controller[0] 或者 UGameplayStatics::GetplayerController[GetWorld,0] 在 server 端 和在client 端 工作的方式是完全不一样的, So, 主要如下:

  1. 如果在 Listen—Server 端(我们平常用的server)调用 , 将会返回 Listen—Server 端 的 PlayerController 。
  2. 如果在 Client 端调用, 将会返回 Client 端 的 PlayerController 。
  3. 如果在 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 作为拥有者。 (这句话目前还没理解,这句话可能就是关键的钥匙)
UE4多人VR随笔 —— 关于playerController 不得不说的故事

实现步骤: 按照倒叙的方式进行,这样逻辑会稍微清楚一点。

GameState 端执行的函数:
UE4多人VR随笔 —— 关于playerController 不得不说的故事
Player controller 端执行的函数:
UE4多人VR随笔 —— 关于playerController 不得不说的故事
UMG 蓝图中调用的函数:
UE4多人VR随笔 —— 关于playerController 不得不说的故事