天天看点

[Unity Mirror] General

  Mirror 是一个为 Unity 游戏构建多人游戏功能的系统。它建立在较低级别的传输实时通信层之上,并处理多人游戏所需的许多常见任务。传输层支持任何类型的网络拓扑,而 Mirror 是服务器权威系统;虽然它允许参与者之一同时是客户端和服务器,所以不需要专门的服务器进程。与互联网服务一起工作,这使得多人游戏可以在互联网上玩,而开发人员几乎不需要做任何工作。

  Mirror 专注于易用性和迭代开发,并为多人游戏提供有用的功能,例如:

  • 消息处理程序
  • 通用高性能序列化
  • 分布式对象管理
  • 状态同步
  • 网络类:服务器、客户端、连接等

Mirror 由一系列添加功能的层构建而成:

[Unity Mirror] General

Server 和 Host

Mirror多人游戏包括:

  • Server

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

  • Clients

    客户端是游戏的实例,通常从不同的计算机连接到服务器。客户端可以通过本地网络或在线连接。

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

  服务器可能是一个“专用服务器(Dedicated server)”或“主机服务器(host server)”。

  • 专用服务器(Dedicated server)

    这是一个仅作为服务器运行的游戏实例。

  • 主机服务器(host server)

    当没有专用服务器时,其中一个客户端也扮演服务器的角色。该客户端是“主机服务器”。主机服务器创建游戏的单个实例(称为主机),它既充当服务器又充当客户端。

  下图代表多人游戏中的三个玩家。在这个游戏中,一个客户端同时充当主机,这意味着客户端本身就是“本地客户端”。本地客户端连接到host服务器,并且都在同一台计算机上运行。另外两个玩家是远程客户端——也就是说,他们在不同的计算机上,连接到host服务器。

[Unity Mirror] General

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

  多人系统的目标之一是本地客户端和远程客户端的代码相同,以便您在开发游戏时大部分时间只需要考虑一种类型的客户端。在大多数情况下,Mirror 会自动处理这种差异,因此您应该很少需要考虑在本地客户端或远程客户端上运行的代码之间的差异。

实例化和生成

  在 Unity 中制作单人游戏时,通常使用 GameObject.Instantiate 方法在运行时创建新的游戏对象。但是,对于多人游戏系统,服务器本身必须“spawn”游戏对象,以便它们在网络游戏中处于活动状态。当服务器生成游戏对象时,它会触发在连接的客户端上创建游戏对象。spawn系统管理游戏对象的生命周期,并根据您设置游戏对象的方式同步游戏对象的状态。

  有关网络实例化和生成的更多详细信息,请参阅 Spawning GameObjects 文档。

玩家和本地玩家

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

有关更多详细信息,请参阅有关 Player GameObjects 的文档。

权限(Authority)

  服务器和客户端都可以管理游戏对象的行为。 “权限”的概念是指游戏对象的管理方式和位置。Mirror基于“服务器权限”作为默认状态,服务器对所有游戏对象具有权限。玩家游戏对象是一种特殊情况,被视为具有“本地权限”。您可能希望使用不同的权限系统来构建您的游戏 - 有关更多详细信息,请参阅网络权限。

继续阅读