Version: 2021.3
多人游戏概述
使用 Network Manager

设置多人游戏项目

Important: UNet is a deprecated solution, and a new Multiplayer and Networking Solution (Netcode for GameObjects) is under development. For more information and next steps see the information on the Unity Netcode for GameObjects website.

本页面概要介绍设置多人游戏项目时所需的最基本和最常见的事项。在项目的需求方面包括:

  • Network Manager

  • 用户界面(供玩家查找和加入游戏)

  • 联网玩家预制件(供玩家控制)

  • 具有多人游戏感知功能的脚本和游戏对象

根据具体情况,此列表可能会有所变化;例如,在多人国际象棋游戏或实时战略 (RTS) 游戏中,不需要可见的游戏对象来表示玩家。但是,可能仍然需要一个不可见的空游戏对象来表示玩家,并附加一个与玩家操作相关的脚本。

本介绍页面包含上面列出的每一项的简要说明。但是,每个部分都链接到更详细的文档,您需要继续阅读以完全理解它们。

在构建游戏时,还需要了解一些重要概念并做出相应选择。这些概念大体上可概括为:

  • 客户端服务器主机之间的关系

  • The idea of authority over GameObjects and actions

Network Manager

Network Manager 负责管理多人游戏的网络方面。同一时间应在场景中激活一个(且仅一个)Network Manager。

Network Manager 组件
Network Manager 组件

Unity 的内置 Network Manager 组件将用于管理多人游戏的所有功能整合到一个组件中。如果您有一些自定义要求,而此组件未涵盖这些要求,则可以使用脚本编写自己的 Network Manager 来代替此组件。如果刚开始了解多人游戏,应使用这个组件。

有关详细信息,请参阅 Network Manager 的文档。

供玩家查找和加入游戏的用户界面

几乎每个多人游戏都为玩家提供了发现、创建和加入单个游戏“实例”(也称为“比赛”)的方法。游戏的这一部分通常称为“大厅”,有时还有聊天等额外功能。

典型的多人游戏大厅,允许玩家查找、创建和加入游戏,来自于 Asset Store 中提供的 TANKS 网络演示。
典型的多人游戏大厅,允许玩家查找、创建和加入游戏,来自于 Asset Store 中提供的 TANKS 网络演示。

对于这种界面,Unity 有一个极其基本的内置版本,称为 NetworkManagerHUD。此界面在创建游戏的早期阶段非常有用,因为可以轻松创建比赛并测试游戏,而无需实现自己的 UI。但是,此界面在功能和视觉设计方面都非常简单,因此在完成项目之前,应该用自己的 UI 进行替换。

Unity 的内置 Network Manager HUD(MatchMaker 模式)。
Unity 的内置 Network Manager HUD(MatchMaker 模式)。

有关详细信息,请参阅 Network Manager HUD 的文档。

联网玩家游戏对象

大多数多人游戏都具有玩家可以控制的某种对象,如角色、汽车或其他对象。一些多人游戏不具有单个可见的“玩家对象”,而是允许玩家控制许多单元或物品,例如在国际象棋或实时战略游戏中就是如此。其他一些游戏甚至根本没有特定的对象,比如共享画布的绘画游戏。但是,在所有这些情况下,通常需要创建一个概念上代表游戏玩家的游戏对象。应将此游戏对象作为预制件,并将所有脚本附加到此预制件上,从而控制玩家在游戏中可以执行的操作。

如果使用 Unity Network Manager 组件(请参阅上面的 Network Manager),请将该预制件分配给 Player Prefab 字段。

在 Network Manager 的 Player Prefab 字段中分配了Player Car预制件。
在 Network Manager 的 Player Prefab 字段中分配了“Player Car”预制件。

当游戏运行时,Network Manager 会为连接到比赛的每个玩家创建玩家预制件的副本(“实例”)。

但是(对于刚接触多人游戏编程的人来说,这也是令人困惑的地方),需要确保玩家预制件实例上的脚本“知道”控制该实例的玩家是在使用主机计算机(管理游戏的计算机)还是使用客户端计算机(与管理游戏的计算机不同的计算机)。

这是因为两种情况会同时发生。

多人游戏感知脚本

Writing scripts for a multiplayer game is different to writing scripts for a single-player game. This is because when you write a script for a multiplayer game, you need to think about the different contexts that the scripts run in.

例如,放置在玩家预制件上的脚本应允许该玩家实例的“所有者”控制该实例,但不应允许其他人对其进行控制。

需要考虑服务器或客户端是否具有对脚本功能的授权。有时,可能希望脚本同时在服务器和客户端上运行。而其他时候,可能只希望脚本在服务器上运行,并只希望客户端复制游戏对象的移动方式(例如,在玩家拾取可收集的游戏对象的游戏中,该脚本应仅在服务器上运行,这样服务器就能掌控收集的游戏对象数量)。

根据脚本的功能,需要确定脚本的哪些部分应在哪些情况下激活。

对于玩家游戏对象,每个人通常都能主动控制自己的玩家实例。这意味着每个客户端都对自己的玩家具有本地授权,并且服务器接受客户端告知的该玩家正在执行的操作。

对于非玩家游戏对象,服务器通常对发生的操作(例如是否已收集物品)具有控制权,并且所有客户端都接受服务器告知的该游戏对象发生的操作。

多人游戏概述
使用 Network Manager