Mirror
Mirror 在 Edgegap 上
本指南将帮助您在 Edgegap 上为使用以下内容的 Unity 项目创建无头服务器: Mirror 作为其网络解决方案。
本指南将使用开源示例项目 Tanks,该示例已包含在您的 Mirror 示例中,位置为 Assets/Mirror/Examples/Tanks。
最终示例可以在我们的 GitHub.
构建游戏服务器
准备好游戏后,前往 Unity 编辑器的 构建 界面,位于 文件 -> 构建设置 在顶部菜单中。请根据您使用的 Unity 版本选择正确的预设。
在 2021.2 之前的版本:
将
目标平台设置为Linux;将
架构设置为x86_64;勾选
服务器构建选项。
否则:
将
平台设置为专用服务器;将
目标平台设置为Linux.
然后按构建并选择一个名为 linux_server 的新空文件夹作为文件目标。将 linux_server 文件夹转移到第二个空文件夹中,本文档将其称为 [SERVER BUILD] 文件夹。
为专用游戏服务器容器化
我们将在此部分创建包含专用游戏服务器的 Docker 镜像。您可能还想阅读 Docker 中的 Unity 服务器.
如果您需要有关在 Edgegap 上使用 Docker 的更多信息,请参阅 此 文档。
Dockerfile
记录您用于网络通信的端口,即本文中所称的 [GAME PORT]。默认使用的端口是 7777。您可以在 Unity 编辑器中找到此信息,位于 NetworkManager 游戏对象的 传输 组件中。
将上面的行复制并粘贴到位于
[SERVER BUILD]的 Dockerfile 中。修改[GAME PORT]占位符以匹配您的游戏端口。
将 [GAME PORT] 在 TCP 和 UDP 上打开可让您在 NetworkManager Mirror 组件中使用任意您偏好的传输方式。最后,在 根目录下创建一个名为 boot.sh [SERVER BUILD] 的文件。它将在容器中启动镜像时执行。
复制以下两行,确保将
[YOUR GAME]占位符替换为生成文件的名称。
此时,您应具有以下目录结构:
[SERVER BUILD] 文件夹> > -Dockerfile> > -根目录下创建一个名为> > -linux_server文件夹 > > > - Unity 生成的文件
在
[SERVER BUILD]文件夹中启动命令提示符,然后运行以下 Docker 命令:
对于 ARM CPU(Mac M1、M2 等)用户,向构建命令添加 --platform linux/amd64 选项。
使用 Linux
使用 cmd
使用 Powershell
执行这些命令后,如果您使用的是 Edgegap 容器注册表,您应该能够在 Edgegap 网站上看到已上传的镜像。参见 此文档 如果您想使用 Edgegap 注册表。您也可以使用其他私人注册表。
部署到 Edgegap
导航到网站的 应用与游戏 页面。点击右上角的 创建新建 按钮以访问应用表单。以下是各字段及其正确填写方法:
应用名称:可以是任何便于您在多个应用中识别该应用的显著名称。
镜像:可以是任何便于您识别该应用的特定镜像名称。
版本名称:您可能希望使用版本名称来描述正在部署版本的范围。例如可以使用 “demo”、“production”、“v1”、“v2”。
容器:
仓库:"[URL]",其中 [URL] 是您在容器仓库页面中显示的凭据中的值。
镜像仓库:"[PROJECT]/[YOUR GAME]",其中 [PROJECT] 和 [YOUR GAME] 是您在之前推送 Docker 镜像时使用的值。
标签:"[TAG]",其中 [TAG] 是您在之前推送 Docker 镜像时使用的值。
勾选“使用私人仓库”
私人注册表用户名:"[USERNAME]",其中 [USERNAME] 是您凭据中的值。
私人注册表令牌:"[TOKEN]",其中 [TOKEN] 是您凭据中的值。
需求:保持原样。
端口:
点击
+ 添加端口链接以添加新端口,并添加以下条目:[GAME PORT]-TCP/UDP- 禁用验证3389 - TCP - 禁用验证
应用创建完成后,您可以按 部署 按钮以继续部署您的游戏服务器。选择要部署的区域,并根据游戏输入要生成的随机玩家数量。通过验证以下内容来检查一切运行是否顺利:
最新状态应显示为
就绪.在
端口映射选项卡中,您应能看到在应用创建表单中设置的端口:

在客户端应用中添加示例 HUD
将
端口值设置在传输组件的NetworkManager到部署的端口映射选项卡中定义的外部端口。
在此示例中,端口设置为 31887。这主要取决于您开发的游戏,并且很可能会在游戏代码中以编程方式设置。
将
网络地址的值设置为网络管理器为您部署的主机。该 URL 可在仪表板的部署摘要中或通过 API 找到。
在此示例中,地址设置为 0ace560706a5.pr.edgegap.net。同样,此值很可能会在客户端与负责匹配的主服务器/API 通信时以编程方式设置。
使用正确的信息,您应该能够正常连接到游戏服务器并立即开始游戏。
现在您有一个可按需部署的 Mirror 项目!
使用基于座位的部署时,可以使用 Mirror 创建一个系统,该系统在玩家从服务器断开连接后自动移除悬挂的 Edgegap 会话,使用 NetworkManager 回调函数,以及一个 NetworkBehaviour 脚本附加到使用远程过程调用(RPC)函数和命令(Command)函数的玩家预制体上。
当服务器启动时, NetworkManager 会从 Edgegap API 检索与其部署关联的 会话 ID 列表 并将其存储。随后,当新玩家连接到服务器时,会通过 RPC 启动一个客户端函数,该函数会将 玩家的 IP 地址 通过一个 命令发送回服务器。服务器使用玩家的 IP 在每个会话的数据中检查是否有匹配;服务器使用其缓存的 ID 通过 Edgegap API 获取会话数据。如果找到匹配, 会话 ID 将映射到该玩家的 NetworkConnectionToClient.
由于服务器启动后可以添加新会话,如果第一次无法找到匹配,会话 ID 列表会更新并检查新会话。
最后,一旦玩家从服务器断开连接,服务器使用该玩家的 NetworkConnectionToClient 来检索其关联的 会话 ID,然后使用 Edgegap API 删除该会话。这将释放部署中的一个套接字以供新玩家加入。
PlayerNetworkBehaviour
CustomNetworkManager
可选功能
此脚本可以扩展为具有可选的独立功能,以帮助在特定情况下管理会话。
例如, 超时 可以设置为在可配置时间后删除 空座位会话 在完整服务器初始化后 。这是一个有用的功能,以防玩家在其匹配票据解决之前退出,一旦找到匹配将创建一个空会话。如果玩家在超时之前从未发送其 IP 地址以映射到会话 ID,则该会话将在超时后被删除以释放套接字。另一个功能可以是在长时间不活动后
断开不活动玩家 以释放套接字。一旦连接到服务器,客户端需要 向服务器发送一些最小化的心跳消息 每隔几秒 发送到服务器, 否则如果连续错过太多心跳消息则会被断开连接 。心跳之间的时间间隔和连续允许丢失的最大消息数可以根据游戏需求进行配置。在此示例中,如果坦克在地图上移动或射击,将每隔几秒发送一次心跳。PlayerNetworkBehaviour - 座位会话管理
private bool enableInactiveTimeout;
private bool listInProgress = false;
最后更新于
这有帮助吗?

