Mirror

Edgegap 上的 Mirror

本指南将帮助你在 Edgegap 上为一个 Unity 项目创建无头服务器,使用 Mirrorarrow-up-right 作为其网络解决方案。

本指南将使用开源示例项目 Tanks,它已在你的 Mirror 示例中可用,位置为 Assets/Mirror/Examples/Tanks。

最终示例可以在我们的 GitHubarrow-up-right.

构建游戏服务器

当你的游戏准备就绪后,前往 Build Unity 编辑器的界面,在 File -> Build Settings 顶端菜单中。请确保根据你的 Unity 版本选择正确的预设。

  • 2021.2 之前的版本:

    • 设置 目标平台 转向 Linux;

    • 设置 架构 转向 x86_64;

    • 勾选 Server Build 选项时,动态注入环境变量。

  • 否则:

    • 设置 平台 转向 Dedicated Server;

    • 设置 目标平台 转向 Linux.

然后点击构建,并选择一个名为 linux_server 的新空文件夹作为文件目标。将 linux_server 文件夹转移到第二个空文件夹中,在本文档中将其称为 [SERVER BUILD] 文件夹。

将专用游戏服务器容器化

在本部分我们将创建一个包含专用游戏服务器的 docker 镜像。你可能也会对阅读 Docker 中的 Unity Server.

感兴趣。如果你需要更多关于 Edgegap 与 Docker 的信息,请参考 文档。

Dockerfile

记下你用于网络通信的端口,称为 [GAME PORT]。默认情况下,使用的端口是 7777。你可以在 Unity 编辑器中找到此信息,位于 NetworkManager 游戏对象 上,在 Transport 组件中。

  • 复制以上行并将它们粘贴到你的 Dockerfile 中,放在 [SERVER BUILD]。将 [GAME PORT] 占位符修改为你的游戏端口。

[GAME PORT] 在 TCP 和 UDP 上都打开,可以让你在 NetworkManager Mirror 组件中使用任意你喜欢的传输。最后,在根目录创建一个名为 boot.sh[SERVER BUILD] 文件夹中。它将在容器中启动镜像时被执行。

  • 复制以下两行,务必将 [YOUR GAME] 占位符替换为生成文件的名称。

此时,你应当拥有如下层级结构:

  • [SERVER BUILD] 文件夹 > > - Dockerfile > > - boot.sh > > - linux_server 文件夹 > > > - Unity 生成的文件

  • [SERVER BUILD] 文件夹中启动命令行提示符,并运行以下 Docker 命令:

circle-exclamation

在 Linux 上使用

使用 cmd

使用 Powershell

完成这些命令后,如果你使用 Edgegap 容器注册表,应该能在 Edgegap 网站上看到你上传的镜像。参见 此文档 如果你想使用 Edgegap 注册表。你也可以使用其他私有仓库。

部署到 Edgegap

导航到网站的 Applications & Games 页面。点击右上角的 Create New 按钮进入应用程序表单。以下是各字段及其正确填写方式:

  • Application name:可以是任何你希望使用的醒目名称,便于在其他应用中轻松识别你的应用。

  • Image:可以是任何你希望使用的特定图像,以便在其他应用中轻松识别你的应用。

  • Version name:你可能希望使用版本名称来描述你正在部署的版本范围。例如“demo”、“production”、“v1”、“v2”。

  • Container:

    • Registry:“[URL]”,其中 [URL] 是你可以在容器仓库页面显示的凭据中的值。

    • Image repository:“[PROJECT]/[YOUR GAME]”,其中 [PROJECT] 和 [YOUR GAME] 是你之前推送 docker 镜像时使用的值。

    • Tag:“[TAG]”,其中 [TAG] 是你之前推送 docker 镜像时使用的值。

    • 勾选“Using a private repository”

    • Private registry username:“[USERNAME]”,其中 [USERNAME] 是你凭据中的值。

    • Private registry token:“[TOKEN]”,其中 [TOKEN] 是你凭据中的值。

    • Requirements:保持默认。

    • Ports:

      • 点击 + Add port 链接以添加新端口,并添加以下条目:

        • [GAME PORT] - TCP/UDP - 关闭 Verifications

        • 3389 - TCP - 关闭 Verifications

创建应用后,你可以按下 Deploy(部署) 按钮以继续部署你的游戏服务器。选择你要部署的区域,并根据你的游戏输入你想要生成的随机玩家数量。通过验证以下内容来检查一切是否正常运行:

  • Latest Status 应设置为 Ready.

  • 端口映射 选项卡中,你应能看到你在创建应用时设置的端口:

在你的客户端应用中添加示例 HUD

  • Port 的值,将 Transport 组件的 NetworkManager 设置为部署中在 端口映射 选项卡定义的外部端口。

在此示例中,端口被设置为 31887。这主要取决于你正在开发的游戏,并且很可能会在游戏代码库中以编程方式进行设置。

  • 设置 Network Address 的值,将 Network Manager 设置为你的部署的 Host。该 URL 可在 Deployment Summary 仪表板上或通过 API 找到。

在此示例中,地址被设置为 0ace560706a5.pr.edgegap.net。同样,此值很可能会在客户端与负责匹配流程的主服务器/API 通信期间以编程方式设置。

有了正确的信息,你应该能够正常连接到游戏服务器,并立即开始游戏。

你现在拥有一个可按需部署的 Mirror 项目!

借助基于席位的部署,可以使用 Mirror 创建一个系统:当玩家从服务器断开连接时,利用 NetworkManager 回调函数,以及 NetworkBehaviour 脚本(附加在玩家预制体上)来使用 RPC(远程过程调用)函数和 Command 函数,自动移除挂起的 Edgegap 会话。

当服务器启动时, NetworkManager 从 Edgegap API 获取与其部署关联的 会话 ID 列表并进行存储。之后,当新玩家连接到服务器时,通过 RPC 启动客户端函数,将 玩家的 IP 地址 通过 command发送回服务器。凭借玩家的 IP,服务器在每个会话的数据中检查是否有匹配 IP;服务器使用其在 Edgegap API 中缓存的 ID 获取会话数据。如果找到匹配, 会话 ID 将映射到该玩家的 NetworkConnectionToClient.

由于在服务器启动后可能会新增会话,如果第一次未找到匹配,会更新会话 ID 列表并检查新会话。

最后,一旦玩家从服务器断开连接,服务器使用该玩家的 NetworkConnectionToClient 来检索其关联的 会话 ID,然后使用 Edgegap API 删除该会话。这将释放部署中的一个套接字,供新玩家加入。

PlayerNetworkBehaviour

CustomNetworkManager

可选功能

该脚本可以扩展一些可选且相互独立的功能,以帮助在特定场景下管理会话。

例如,可以设置 超时 以移除 空席会话 在可配置的一段时间后, 即在服务器完全初始化之后。这在玩家在匹配票据被处理前就退出的情况下很有用,因为一旦匹配成功会创建一个空会话。如果在超时解决前,玩家从未发送其 IP 地址以映射到会话 ID,那么该会话会被删除以释放一个套接字。

另一个功能可以是 断开不活跃玩家连接 在较长时间后以释放套接字。一旦连接到服务器,客户端需要 向服务器发送一些极简的心跳消息 到服务器 每隔几秒,否则如果连续 错过过多心跳就会被断开。心跳之间的时间间隔以及可连续错过的最大消息数量都可以根据游戏的需要进行配置。在此示例中,如果坦克在地图上移动或射击,则每隔几秒发送一次心跳。

PlayerNetworkBehaviour - 席位会话管理

CustomNetworkManager - 席位会话管理

最后更新于

这有帮助吗?