[Unity Mirror] Network Manager

81 篇文章 30 订阅

英文原文:

https://mirror-networking.gitbook.io/docs/components/network-manager

  网络管理器是用于管理多人游戏的网络方面的组件。

网络管理器功能包括:

  • 游戏状态管理
  • Spaw管理
  • 场景管理
  • 调试信息
  • 定制化

网络管理器入门

  网络管理器是多人游戏的核心控制组件。首先,在您的起始场景中创建一个空的游戏对象,然后添加网络管理器组件。新添加的网络管理器组件如下所示:
在这里插入图片描述
&esmp; 编辑器中网络管理器的 Inspector 允许您配置和控制与网络相关的许多事情。

&esmp; 注意:每个场景中只能有一个活动的网络管理器,因为它是单例的。不要将 Network Manager 组件放置在联网的游戏对象(具有 Network Identity 组件的游戏对象)上,因为 Mirror 在场景加载时会禁用这些。

&esmp; 如果您已经熟悉多人游戏开发,您可能会发现网络管理器组件完全使用 API 实现很有用,因此您也可以通过脚本获得它所做的一切。对于高级用户,如果您发现需要扩展 Network Manager 组件的功能,您可以使用脚本从 Network Manager 派生您自己的类,并通过覆盖它提供的任何虚函数挂钩来自定义其行为。然而,网络管理器组件将许多有用的功能封装到一个地方,并使创建、运行和调试多人游戏尽可能简单。


传输

  Mirror 使用一个单独的组件(派生自 Transport 类)通过网络进行连接。默认情况下,它是 Telepathy Transport。这种将传输分离成自己的组件的设计选择允许游戏开发人员选择最适合他们游戏需求的传输。更改传输就像换出网络管理器对象上的组件并将其分配给传输字段一样简单。

  传输可用于 TCP、UDP、WebGL 和 Steam。此外,还有一个 Multiplex 传输允许在服务器上同时使用两个传输,例如Telepathy 和 WebSockets,使桌面和浏览器播放器可以在同一台服务器上无缝地一起玩。有关详细信息,请参阅传输。


游戏状态管理

  网络多人游戏可以以三种模式运行 - 作为客户端、作为专用服务器或作为同时作为客户端和服务器的主机。

  如果您使用的是Network Manager HUD,它会根据玩家单击的按钮自动告诉网络管理器以哪种模式启动。如果您正在编写自己的 UI 以允许玩家开始游戏,则需要从您自己的代码中调用它们。这些方法是:

  • NetworkManager.StartClient
  • NetworkManager.StartServer
  • NetworkManager.StartHost

在这里插入图片描述
  无论游戏以哪种模式开始(客户端、服务器或主机),都会使用网络地址和传输端口属性。

  • 在客户端模式下,游戏会尝试连接到指定的地址和端口。完全限定域名fully-qualified domain name (FQDN) 也可用于网络地址,例如“game.example.com”。
  • 在服务器或主机模式下,游戏侦听指定端口上的传入连接,但不绑定到任何特定 IP 地址(它侦听所有可用的)。

Spawn Management

  使用网络管理器管理来自 Prefab 的网络游戏对象的生成(网络实例化)。

在这里插入图片描述
  大多数游戏都有一个代表玩家的 Prefab,因此网络管理器有一个 Player Prefab 插槽。您应该将此插槽分配给您的Player预制件。当您设置了玩家预制件时,会自动从该预制件中为游戏中的每个用户生成一个玩家游戏对象。这适用于托管服务器上的本地player和远程客户端上的远程player。在将其分配给此字段之前,您必须将Network Identity组件附加到 Player Prefab。

  一旦分配了 Player Prefab,您就可以作为主机启动游戏并查看玩家游戏对象的生成。停止游戏会销毁玩家游戏对象。如果您构建并运行游戏的另一个副本并将其作为客户端连接到 localhost,则网络管理器会显示另一个玩家游戏对象。当您停止该客户端时,它会销毁该玩家的游戏对象。

  除了 Player Prefab 之外,您还必须注册其他要在玩游戏期间使用 Network Manager 动态生成的 prefab。

  您可以将预制件添加到标记为 Registered Spawnable Prefabs 的检查器中显示的列表中。您还可以使用 ClientScene.RegisterPrefab 方法通过代码注册预制件。

  如果您有一个通过 Don’t Destroy On Load (DDOL) 在场景中持续存在的网络管理器,则需要将所有可能在任何场景中生成的预制件注册到它。如果您在每个场景中都有单独的网络管理器,则只需注册与该场景相关的预制件。


Start Positions

  默认情况下,网络管理器将在其定义的transform位置和旋转处生成 Player Prefab,但是 Player Spawn Method 属性允许您控制如何选择起始位置以及 Network Start Position 组件。

  • 选择随机以随机选择的 startPosition 选项生成玩家。
  • 选择 Round Robin 以循环通过设置列表中的 startPosition 选项。

  如果随机或循环模式不适合您的游戏,您可以使用代码自定义开始位置的选择方式。您可以通过列表 NetworkManager.startPositions 访问可用的网络起始位置组件,并且您可以使用网络管理器上的辅助方法 GetStartPosition,该方法可用于 OnServerAddPlayer 的实现中来查找起始位置。


场景管理

  大多数游戏都有不止一个场景。至少,除了实际玩游戏的场景之外,通常还有一个title scene 或开始 menu scene。网络管理器旨在以适用于多人游戏的方式自动管理场景状态和场景转换。

  Network Manager 检查器上有两个用于场景的插槽:离线场景和在线场景。将场景资源拖入这些插槽可激活联网场景管理。

  启动服务器或主机时,将加载在线场景。这便成为当前的网络场景。指示连接到该服务器的任何客户端也加载该场景。此场景的名称存储在 networkSceneName 属性中。

  当网络停止时,通过停止服务器或主机或客户端断开连接,加载离线场景。这允许游戏在与多人游戏断开连接时自动返回菜单场景。

  您还可以通过调用 ServerChangeScene 在游戏处于活动状态时更改场景。这使得所有当前连接的客户端也会更改场景,并更新 networkSceneName 以便新客户端也加载新场景。

  当网络场景管理处于活动状态时,任何对游戏状态管理函数(如 StartHost 或 StopClient)的调用都可能导致场景更改。这适用于运行时控制 UI。通过设置场景并调用这些方法,您可以控制多人游戏的流程。

请注意,场景更改会导致前一个场景中的所有游戏对象被销毁。

  您通常应该确保网络管理器在场景之间持续存在,否则网络连接会在场景更改时中断。为此,请确保在检查器中选中 Don’t Destroy On Load 复选框。但是,也可以在每个场景中使用不同的设置单独的网络管理器,如果您希望控制增量预制件加载或不同的场景转换,这可能会有所帮助。


Customization

  NetworkManager 类上有一些虚函数,您可以通过创建自己的继承自 NetworkManager 的派生类来自定义这些虚函数。在实现这些功能时,请务必注意默认实现提供的功能。例如,在 OnServerAddPlayer 中,必须调用函数 NetworkServer.AddPlayer 来激活玩家游戏对象以进行连接。

  为了使这更容易,我们制作了一组脚本模板,其中包含为您删除的所有覆盖。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值