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。