Version: 2019.1
多玩家高级 API
联网游戏对象

网络 HLAPI 系统概念

注意:已弃用 UNet,未来会将其从 Unity 中删除。一个新系统正在开发中。如需了解更多信息和后续步骤,请参阅此博客文章以及常见问题解答 (FAQ)

服务器和主机

在 Unity 的高级 API (HLAPI) 系统中,多人游戏包括:

  • 服务器:服务器是所有其他玩家在想要一起玩游戏时连接的游戏实例。服务器通常管理游戏的各个方面,例如保存分数并将该数据传送回客户端。

  • 客户端:客户端是通常从不同计算机连接到服务器的游戏实例。客户端可以通过本地网络或互联网进行连接。

客户端是连接到服务器的游戏实例,因此游戏玩家可以与在自己客户端上连接的其他玩家一起玩游戏。

服务器可以是“专用服务器”,也可以是“主机服务器”。

  • 专用服务器:这是完全为了作为服务器而运行的游戏实例。

  • 主机服务器:当没有专用服务器时,其中一个客户端也可以扮演服务器的角色。该客户端是“主机服务器”。主机服务器创建游戏的单个实例(称为主机),此实例将同时充当服务器和客户端。

下图表示了多人游戏中的三名玩家。在此游戏中,一个客户端同时充当主机,这意味着该客户端本身为“本地客户端”。本地客户端连接到主机服务器,二者都在同一台计算机上运行。另外两个玩家是远程客户端,也就是说,它们位于不同的计算机上,但均连接到主机服务器。

此图显示了连接到主机的两个远程客户端。
此图显示了连接到主机的两个远程客户端。

主机是游戏的单个实例,同时充当服务器客户端。主机使用特殊类型的内部客户端进行本地客户端通信,而其他客户端则是远程客户端。本地客户端通过直接函数调用和消息队列的形式与服务器进行通信,因为它在同一个进程中。本地客户端实际上与服务器共享场景。远程客户端通过常规网络连接与服务器通信。如果使用 Unity 的 HLAPI,这一切都将自动处理。

Multiplayer 系统的目标之一是使本地客户端和远程客户端的代码保持一致,这样在开发游戏时大多数时间只需要考虑一种类型的客户端。在大多数情况下,Unity 会自动处理这种差异,因此您基本不需要考虑在本地客户端或远程客户端上运行的代码之间的差异。

实例化和生成

在 Unity 中开发单人游戏时,通常使用 GameObject.Instantiate 方法在运行时创建新的游戏对象。但是,对于 Multiplayer 系统,服务器本身必须“生成”游戏对象,使这些游戏对象在联网游戏中处于活动状态。服务器生成游戏对象时,会触发在连接的客户端上创建游戏对象的行为。生成系统负责管理游戏对象的生命周期,并根据游戏对象的设置同步游戏对象的状态。

有关联网实例化和生成的更多详细信息,请参阅关于生成游戏对象的文档。

玩家和本地玩家

Unity 的多玩家 HLAPI 系统对玩家游戏对象的处理方式不同于对非玩家游戏对象的处理方式。当新玩家加入游戏时(当新客户端连接到服务器时),该玩家的游戏对象成为该玩家客户端上的“本地玩家”游戏对象,并且 Unity 将玩家的连接与玩家的游戏对象相关联。Unity 为每个游戏玩家关联一个玩家游戏对象,并将网络命令路由到这一个游戏对象。一个玩家不能在另一个玩家的游戏对象上调用命令,只能在自己的游戏对象上调用命令。

有关更多详细信息,请参阅关于玩家游戏对象的文档。

授权

服务器和客户端都可以管理游戏对象的行为。“授权”的概念是指如何以及在何处管理游戏对象。Unity 的 HLAPI 在默认状态下基于“服务器授权”,这种情况下的服务器(主机)对所有不代表玩家的游戏对象具有授权。玩家游戏对象是一种特殊情况,被视为具有“本地授权”。有时可能希望使用不同的授权系统构建游戏;有关更多详细信息,请参阅网络授权

多玩家高级 API
联网游戏对象