Unity Mirror 示例
欢迎使用 Unity Mirror 示例项目!本项目展示了如何搭配使用 Unity Transport Package (UTP)、Relay 和 Mirror 网络 API。
- Unity Transport Package (UTP) 是通过 UDP 套接字提供基于连接的抽象层的底层网络库,具有信度、排序和碎片化等可选功能。
- Relay 是一项利用“加入代码”工作流程来实现为玩家提供安全连接的 Unity 服务,使用“加入代码”型的工作流程,无需专用游戏服务器或对等通信。
- Mirror 是 Unity 平台的上层网络库。
您可以在 Assets/UTPTransport
目录下找到 UTP 相关文件,在 Assets/Mirror
目录下找到 Mirror 相关文件。
注意:该示例项目使用的代码和信息来自 YouTube 上的“Shrine 谈 Mirror 网络”系列。
要求和限制
Unity Mirror 示例具有以下要求:
- 受支持的 Unity 编辑器版本。该示例项目支持版本 2020.3 或更高版本。
- Unity 游戏服务 (UGS) 帐户
- Unity 服务
- Unity Relay
- Unity Transport Package(随 Relay 提供)
- Unity 任务
- Unity Authentication Service (UAS)
- Mirror 网络 API v67.1.0
限制
该示例无法直接与 Game Server Hosting (GSH) 配合使用,需要经过修改才有可能实现配合使用。如果要修改该示例以便使用 GSH,请注意,Relay 是一种对等仿制解决方案,与 GSH 占用相同空间,因此,搭配 GSH 使用 Relay 并没有意义。
先决条件
继续操作之前,请确保已满足使用该示例项目的所有先决条件:
- 创建 Unity Dashboard(Unity 后台)项目
- 启用 Relay 服务
- 安装 Unity 编辑器(版本 2020.3 或更高版本)
- 登录 Unity 编辑器
- 将 Unity Dashboard(Unity 后台)项目链接到 Unity 编辑器
示例架构
Unity Mirror 示例项目具有两个不同的组件:
游戏客户端和游戏服务器组件使用 Unity 和 Mirror 网络 API。
游戏客户端
游戏客户端是玩家在本机上运行的可执行程序,用于连接游戏服务器和后端服务。您可以使用 Relay 来运行游戏客户端,也可以不使用。
游戏服务器
游戏服务器是运行游戏服务器进程的版本可执行程序。
您可以在本地运行游戏服务器可执行程序(用于开发)或将其托管在 Game Server Hosting 等服务上(用于生产)。
注意:从 Relay 服务的角度而言,游戏服务器是主机玩家的游戏客户端。
指南
以下各部分介绍了如何测试、修改示例项目以及与之交互:
从资源商店安装 Mirror 示例
完成以下步骤,将示例项目中的 UTP Transport 实现包安装到您的项目。此外,也可以从 GitHub 上的代码仓库中获取示例项目代码。
- 转到资源商店中的“Mirror”页面。
- 选择 Add Mirror to My Assets(将 Mirror 添加到我的资源)。
- 启动 Unity 编辑器。
使用 Package Manager(包管理器)导入 Mirror。
- 选择 Window(窗口)> Package Manager(包管理器)> Packages: My Assets(包:我的资源)> Mirror > Download/Import(下载/导入)。
使用 Package Manager(包管理器)导入 Relay。
- 选择 Window(窗口)> Package Manager(包管理器)> Add(添加)> Add package from git URL...(从 git URL 添加包...)>“com.unity.services.relay@1.0.4”。
使用 Package Manager(包管理器)导入任务。
- 选择 Window(窗口)> Package Manager(包管理器)> Add(添加)> Add package from git URL...(从 git URL 添加包...)>“com.unity.jobs”。
将示例项目中的
Assets\UTPTransport
目录复制到您的项目。将
Mirror.NetworkManager
组件关联到GameObject
。将
UTP.UtpTransport
组件关联到GameObject
。将
UTP.UtpTransport
组件分配到Mirror.NetworkManager
组件的Transport
字段中。删除 Mirror 自动关联到您的 GameObject 中的
kcp2k.KcpTransport
组件。
测试示例项目
警告:测试示例项目之前,请确保已在 Unity Dashboard(Unity 后台)中启用并设置 Relay。
要启动示例项目的两个实例用于测试,请完成以下步骤:
- 在 Unity 编辑器中打开示例项目。该项目支持 Unity 2020.3 或更高版本。
- 从编辑器的下拉菜单中选择 ParallelSync > Clones Manager(克隆管理器) 。ParallelSync 支持启动同一项目的多个编辑器实例。
- 选择 Add new clone(添加新的克隆)。
- 创建克隆后,选择 Open in New Editor(在新编辑器中打开)。
- 在两个编辑器实例中选择 Play(播放)。
- 在两个编辑器实例上选择 Auth Login(身份验证登录)。身份验证通过适用于 Relay 的 Unity Authentication Service (UAS) 来实现。
通过适用于 Relay 的 UAS 对两个编辑器实例进行身份验证后,可以测试示例项目的 UTP 传输和 Relay 功能。
使用示例 GUI 测试以下功能:
- 选择 Standard Host(标准主机),启动使用 UTP 传输的服务器。
- 选择 Client (without Relay)(客户端(不使用 Relay)),连接到使用 UTP 传输的服务器。
- 选择 Relay Host(Relay 主机),以分配 Relay 服务器。
- 选择 Client (with Relay)(客户端(使用 Relay)),连接到 Relay 服务器。
注意:请确保使用正确的按钮测试各个组件。
针对 Linux 的交叉编译
可以通过 Unity 编辑器对 Linux 游戏客户端和游戏服务器可执行程序进行交叉编译:
- 启动 Unity Hub,然后选择 Installs(安装量)。
- 选择版本 2020.3.24f1 旁边的齿轮。
- 选择 Add modules(添加模块)。
- 选择 **Linux Build Support (IL2CPP and Mono)(Linux Build Support(IL2CPP 和 Mono))**模块,然后选择 Install(安装)。
完成 Linux Build Support 模块安装后,在 Unity 编辑器中选择 Linux 作为构建选项:
- 启动 Unity 编辑器。
- 选择 File(文件)> Build Settings(构建设置)。
- 选择 Linux 作为目标平台。
- 选择 Server build(服务器构建),以打包服务器编译版本。否则,选择 **Build(构建)**并选择构建位置。
运行游戏客户端
可以在本地将游戏客户端组件作为独立应用程序运行,也可以通过 Unity 编辑器运行游戏客户端组件。
要将游戏客户端作为独立应用程序运行,需通过文件资源管理器或命令行界面选择游戏客户端可执行程序。
要通过 Unity 编辑器运行游戏客户端:
- 使用 Unity 编辑器(版本 2020.3 或更高版本)打开 Unity Mirror 示例项目。
- 选择 Play(播放)。
注意:首次打开 Unity Mirror 示例项目时,Unity 可能需要几分钟的时间来导入所有文件和包。
运行游戏服务器
可以通过命令行界面并使用 -server
参数,在本地运行游戏服务器组件。
同时运行游戏客户端和游戏服务器
可以在本地同时运行游戏客户端和游戏服务器可执行程序,一个作为独立应用程序运行,另一个通过 Unity 编辑器运行。
注意:在运行游戏客户端和游戏服务器之前,必须同时创建服务器和客户端版本。
例如,要将游戏服务器作为独立应用程序运行,同时通过 Unity 编辑器运行游戏客户端:
- 通过命令行界面启动游戏服务器。
- 附加
-log
参数,以便实时查看日志。 - 在 Unity 编辑器中,选择 Start Client(启动客户端)。
注意:游戏服务器的默认端口为 7777
。使用 -port
参数可更改端口号。
修改示例项目
Unity Mirror 示例项目提供了用于执行以下任务的示例代码:
初始化 Mirror Network Manager
Assets/Mirror/Runtime/NetworkManager.cs
中的 NetworkManager
类是 Mirror Network Manager 的单例实例。使用 Mirror Network Manager 组件管理多人游戏的网络任务,例如游戏状态管理、生成管理和场景管理。
添加 Relay 功能
Assets/UTPTransport/RelayNetworkManager.cs
中的 RelayNetworkManager
类可扩展 NetworkManager
,以便添加 Relay 功能。它可演示如何:
- 使用加入代码。
- 获取 Relay 服务器信息。
- 请查看可用的 Relay 地区。
- 以主机玩家身份启动 NetworkDriver。
- 加入 Relay 服务器。
- 使用加入代码进行连接。
添加 UTP 功能
Assets/UTPTransport/UtpTransport.cs
中的 UtpTransport
类是 Mirror.Transport
的实例(与 UTP 和 Relay 兼容)。它可演示如何:
- 使用 Relay 加入代码配置客户端
- 从加入代码获取分配
- 获取 Relay 地区
- 分配 Relay 服务器
创建自定义 Network Manager
Assets/Scripts/MyNetworkManager.cs
中的 MyNetworkManager
类是 RelayNetworkManager
的实例,将用于 Mirror 的 UTP 传输功能与 Relay 服务绑定在一起。
公开用户界面
Assets/Scripts/MenuUI.cs
中的 MenuUI
负责显示可驱动该示例的 UI,并与 MyNetworkManager
进行交互以启动服务器并连接客户端。
在项目中针对 Mirror 使用 UTP 传输
该示例针对 Mirror 使用 Unity Transport Package (UTP) 传输。您可以按照以下各节中的说明,在项目中使用该示例中的代码。
注意:请先参阅要求和限制部分,然后再继续。
从现有传输迁移到 UTP 传输
如果准备好使用 Mirror 并希望从任一内置传输迁移到 UTP 传输,请完成以下步骤。
- 启动 Unity 编辑器。
- 找到并打开包含
Mirror.NetworkManager
组件的场景。 - 将
UTP.UtpTransport
组件关联到GameObject
。 - 将
UTP.UtpTransport
组件分配到Mirror.NetworkManager
组件的Transport
字段中。 - 从
GameObject
中删除现有的Mirror.Transport
组件。 - 根据需要配置
UTP.UtpTransport
组件的参数,例如端口和日志详细级别。
搭配 UTP 使用 Relay
如果要使用 Relay,必须使用 UTP.RelayNetworkManager
而非 Mirror.NetworkManager
,原因在于 UTP.RelayNetworkManager
继承了 Mirror.NetworkManager
,并添加了与 Relay 服务进行交互的功能。
使用 Relay 之前,必须使用 Unity Authentication Service (UAS) 进行身份验证。即使您使用自己的身份验证服务,Relay 服务也需要对您进行身份验证。
以下代码片段展示了如何使用 Unity Authentication Service 进行身份验证:
try
{
await UnityServices.InitializeAsync();
await AuthenticationService.Instance.SignInAnonymouslyAsync();
Debug.Log("Logged into Unity, player ID: " + AuthenticationService.Instance.PlayerId);
}
catch (Exception e)
{
Debug.LogError(e);
}
通过身份验证后,您可以使用 UTP.RelayNetworkManager
分配 Relay 服务器或使用加入代码加入 Relay 服务器。
获取帮助
如果您在开始使用后遇到问题,我们可以为您提供帮助。转到 Relay 支持门户并提交工单。请确保根据工单类型选择 Networking Package(网络包)> Mirror。