主控概念
关于主控与网络主控概念你所需要知道的一切。
主控
某些类只能在服务器上生成,其他类只能生成在客户端, 并且有一些可以在服务器或客户端中生成。 类被生成的哪一侧被称为主控(Authority)。
方法和事件的可用性
API 中的某些方法和事件仅在特定侧(客户端或服务器)可用,而另一些则仅在生成它的那一侧(即主控端)可用:

服务器端
- 方法: 只能在服务器端调用。
- 事件: 只能在服务器端触发。
- 类: 只能在服务器端生成。

客户端
- 方法: 只能在客户端调用。
- 事件: 只能在客户端端发。
- 类: 只能在客户端生成。 (它不会与其他玩家同步)。

主控端
- 方法: 只能在生成该实体的端调用。
- 事件: 只能在生成该实体的端触发。

网络主控端

双端
- 方法: 可以在服务器和客户端调用。
- 事件: 可以在服务器和客户端触发。
- 类: 可以在服务器和客户端生成。 如果你在客户端生成它,它将不会与其他玩家同步。

双端(网络 主控优先)
- 方法: 仅适用于事件。
- 事件: 可以在服务器和客户端触发。 但会先在作为网络主控的客户端被调用(在发送到服务器之前)。 也就是说, 你不需要等待服务器在所有客户端上调用它,因为它会立即在作为该实体网络主控的客户端上调用。
所有在服务器生成的实体都会自动同步到客户端。 也就是说, 你可以直接访问它的方法并获取其所有数据,而无需进行手动同步。
同理,在客户端生成的实体将仅存在于该客户端,尝试将这些实体发送到服务器会导致错误。
网络主控
nanos world 中的另一个重要概念是网络主控。 我们采用了 “分布式网络主控” 的概念,这意味着计算物理效果的工作会被自动分配并分发给各个客户端。
通常情况下,如果一个 Base Actor 靠近游戏中的角色,它的物理效果将由该玩家的计算机进行计算。 负责计算并共享这些结果的玩家就被称为网络主控。
被分配的玩家由服务器自动计算,并会考虑以下因素:
- 角色到实体的距离。
- 玩家是否正在控制一个 Base Pawn。
- 角色是否正在抓取一个 Prop。
- 角色是否正在手持一个 Base Pickable。
- 角色是否正在驾驶一辆 Base Vehicle。
- 角色是否刚刚射击了一个实体(例如 Prop、Base Pickable、Base Vehicle 等)。
- 角色是否刚刚驾驶载具撞击了一个 Character。
在所有这些情况下,该玩家将自动被分配为该对象的网络主控。 请注意,只有在玩家控制一个角色时才会进行此计算。
覆盖当前的网络主控
可以通过使用方法 :SetNetworkAuthority() 来覆盖特定实体当前的网络主控。
在某些情况下,Actor 可能不处于分布式网络主控模式。 这意味着它们当前的网络主控无法被更改。 例如:如果一名玩家正在驾驶一辆载具或使用一把武器,那么他强制是该载具和武器的网络主控,并且这无法通过脚本来覆盖。 要验证一个 Actor 是否可以被覆盖,你可以使用方法 :IsNetworkDistributed()。
你也可以通过调用 :SetNetworkAuthorityAutoDistributed(false) 来阻止它被自动分发给其他玩家。
请务必记得通过调用 :SetNetworkAuthorityAutoDistributed(true) 来恢复自动的网络主控分发。 否则,该实体可能会表现得完全异常。
调试网络与网络主控
我们在设置中添加了一个新选项,用于在世界中绘制网络调试信息,你可以在设置中切换(设置 → 调试 → 绘制网络调试),它会在每个实体上绘制方块以及代表它们网络移动的轨迹。

实体方块 ■ 颜色含义
实体上的方块代表其在网络主控中的状态以及它的健康状况。
| 颜色 | 含义 | |
|---|---|---|
| ■ | 蓝色 | 你是当前的网络主控,且该实体处于睡眠状态。 你正在向其他玩家共享同步数据。 |
| ■ | 青色 | 你是当前的网络主控,且你当前正在传输数据。 你正在向其他玩家共享同步数据。 |
| ■ | 品红 | 你是该实体的主控。 该实体是在客户端生成的,因此你没有在发送同步数据。 |
| ■ | 白色 | 你不是网络主控,且该实体处于睡眠或附加状态。 当前的网络主控没有发送同步数据,因为该实体处于睡眠或附加状态。 |
| ■ | 绿色 | 你不是网络主控,且该实体正以完美的节奏进行同步(无延迟 - 小于 2 帧 - < 66ms)。 |
| ■ | 黄色 | 你不是网络主控,且该实体正以良好的节奏进行同步(轻微延迟 - 小于 4 帧 - < 132ms)。 |
| ■ | 橙色 | 你不是网络主控,且该实体正以尚可的节奏进行同步(一般延迟 - 小于 6 帧 - < 198ms)。 |
| ■ | 红色 | 你不是网络主控,且该实体正以较差的节奏进行同步(大延迟 - 超过 6 帧 - > 198ms,甚至可能存在丢包)。 |
| ■ | 黑色 | 你不是网络主控,且该实体正在跳过从网络接收到的数据包,因为它们到达的顺序错误(由于连接差 - 甚至可能存在丢包)。 |
实体箭头 → 轨迹颜色含义
实体中的箭头轨迹代表从服务器接收到的网络数据。 如果你是网络主控,你将不会看到箭头轨迹。 箭头从实体在你计算机上的当前位置指向它根据网络主控应当在的位置。
| 颜色 | 含义 |
|---|---|
| 绿色 | 实体正以完美的节奏接收数据包(延迟不超过 2 帧)。 |
| 黄色 | 实体超过 2 帧且少于 4 帧未接收到任何数据包。 |
| 橙色 | 实体超过 4 帧且少于 6 帧未接收到任何数据包。 |
| 红色 | 实体超过 6 帧未接收到任何数据包。 |