了解Edgegap的工作原理

了解Edgegap的工作原理

/

/

Fish Game

Nakama

Fish Game

部署至 Edgegap

已发布

已发布

已发布

Fish Game:在 Godot 4 中,通过 Edgegap 专属服务器运行 Heroic Labs 的 Nakama 示例

Fish Game:在 Godot 4 中,通过 Edgegap 专属服务器运行 Heroic Labs 的 Nakama 示例

Fish Game 是 Heroic Labs 推出的一款 2 至 4 人在线格斗游戏,旨在展示 Nakama 的功能。Edgegap 的分支版本将其移植到了 Godot 4,并在其专属的专用游戏服务器上运行每场在线对战。

Nakama 继续发挥其专长:账户系统、匹配机制和排行榜。当它找到一场对局时,会通过 Edgegap Fleet Manager for Nakama 在匹配玩家附近启动一个 Edgegap 服务器。

没有玩家主持对局:无头(headless)Godot 服务器负责判定击中、死亡、回合及获胜者,然后将胜局记录到 Nakama 中并自行停止运行。

Edgegap 的网络覆盖 615 多个边缘云节点(了解更多)。每台服务器都会部署在最适合其玩家的可用位置,并且仅在比赛运行期间计费。

平台:Windows、macOS 和 Linux 桌面构建版本。原始游戏由 Heroic Labs 制作;代码基于 Apache 2.0 协议,大部分美术、音乐和音效基于 CC BY-NC 协议。

工作原理

  1. 玩家使用邮箱登录 Nakama 并点击匹配。Nakama 的匹配器将他们分在一组。

  2. Nakama 的 Fleet Manager 根据每个玩家登录时的 IP,在匹配玩家附近启动 Edgegap 部署。

  3. 游戏服务器启动,监听 UDP 端口 7777,并向 Nakama 发送其 IP 和端口以通知就绪(READY)。

  4. Nakama 将服务器地址发送给每位玩家。玩家通过 ENet 连接;服务器检查每个玩家的 Nakama 会话,并且只允许匹配成功的玩家进入。

  5. 首个赢得 5 个回合的鱼获胜。服务器在 fish_game_wins 排行榜上记录获胜情况,然后指示 Nakama 停止(STOP)部署。

该分支修改的内容:

路径

功能说明

autoload/OnlineMatch.gd

客户端:匹配票据、服务器地址通知、ENet 连接。服务器:允许匹配玩家进入。

autoload/EdgegapServer.gd

专用服务器模式:监听、向 Nakama 报告就绪(READY)、连接状态和停止(STOP),自行停止运行。

Main.gd、Game.gd、actors/Player.gd、components/Hitbox.gd

联机状态下,服务器掌控回合、拾取物、击中和死亡判定。

nakama/

带有 Go 模块的 Nakama 3.39:Fleet Manager、匹配钩子、权威排行榜。

server/Dockerfile

导出“Linux Server”预设并使用无头(headless)Godot 运行它。

无需信用卡。免费版包含部署真实游戏服务器所需的资源。

无需信用卡。免费版包含部署真实游戏服务器所需的资源。

Add Edgegap dedicated game servers to Heroic Labs’ Fish Game, using Nakama for matchmaking in Godot 4.

来自 Heroic Labs Nakama 的 Fish Game,运行在 Edgegap 上

分步指南

运行示例

1. 开始之前

2. 将游戏服务器部署在 Edgegap 上

从仓库根目录构建镜像并将其推送到您的 Edgegap 镜像仓库。容器镜像仓库页面中包含您的项目、用户名和令牌:

docker build --platform linux/amd64 -f server/Dockerfile -t registry.edgegap.com/<project>/fishgame-godot:1.0.0 .

docker push registry.edgegap.com/<project>/fishgame-godot:1.0.0

在控制台中,创建应用 fishgame-godot 和版本 1.0.0:

  • 镜像 <project>/fishgame-godot,标签 1.0.0,以及您的镜像仓库用户名和令牌。

  • 0.5 vCPU 和 512 MB。

  • 一个端口:名称 gameport,7777,UDP。

  • 最长持续时间为 30 分钟。服务器也会自动停止。

服务器本身不需要环境变量:Fleet Manager 会在每次部署时向其传递 Nakama 的回调地址。

3. 运行 Nakama

复制 nakama/.env.example 为 nakama/.env 并填写内容:

  • EDGEGAP_API_TOKEN:您的 Edgegap API 令牌,包含其 token 前缀。

  • EDGEGAP_APPLICATION、INITIAL_EDGEGAP_VERSION、EDGEGAP_PORT_NAME:步骤 2 中的应用程序名称、版本和端口名称。

  • NAKAMA_ACCESS_URL:Nakama 的公开 HTTPS 地址。

  • NAKAMA_HTTP_KEY:一个较长的随机字符串。

要在您自己的机器上进行测试,可以使用 Cloudflare 快速隧道为 Nakama 提供一个公共地址。将它输出的 https://….trycloudflare.com 地址填入 NAKAMA_ACCESS_URL:

docker run -d --name fishgame-tunnel cloudflare/cloudflared:latest tunnel --no-autoupdate --url http://host.docker.internal:7350

然后启动 Nakama 和 Postgres:

docker compose -p fishgame -f nakama/docker-compose.yml up -d --build

4. 进行一场比赛

将游戏指向 Nakama,可以在 autoload/Online.gd 顶部的默认设置中进行配置,也可以在命令行中指定:

godot --path . -- --nakama-host=your-tunnel.trycloudflare.com --nakama-port=443 --nakama-scheme=https

玩家也应通过其公共地址访问 Nakama:Edgegap 会根据每位玩家登录时的 IP,将服务器部署在离他们较近的位置。

启动两个游戏客户端,选择 Online,在各自客户端中创建一个账户,然后在两者中都点击 Match。在出现“Match found! Starting a game server...”后,两者都会进入同一个 Edgegap 服务器的准备界面。率先赢得 5 轮比赛的鱼获胜,并在排行榜上获得 +1 分。随后部署将自动停止。

5. 将其添加到你自己的 Godot 和 Nakama 游戏中

该复刻(fork)是一个可运行的参考项目:您的代码智能体(coding agent)可以直接复制其经过测试的文件,而无需从头编写。通过四项改动即可让 Godot 游戏在结合 Nakama 的 Edgegap 上运行:

  1. Nakama 启动服务器。将 Nakama 的 Edgegap Fleet Manager 添加到您的 Nakama Go 模块中,并添加一个配对钩子(matchmaker hook),以便为每场比赛创建一个 Edgegap 部署(见复刻项目的 nakama/ 文件夹)。

  2. 游戏以无头(headless)模式作为服务器运行。当 Godot 以无头模式运行时,游戏会以服务器模式启动,监听固定的 UDP 端口并掌控游戏规则:命中、阵亡、回合、结果(autoload/EdgegapServer.gd、Game.gd)。

  3. 服务器向 Nakama 报告状态。它会发送包含其 IP 和端口的 READY 状态,每 5 秒上报一次已连接的玩家,并在比赛结束时发送 STOP,以便 Nakama 终止部署并停止计费。

  4. 客户端等待其服务器。配对成功后,客户端通过 Nakama 通知接收服务器的地址,并通过 ENet 进行连接,服务器会在允许其进入前验证其 Nakama 会话(autoload/OnlineMatch.gd)。

然后以复刻项目的 server/Dockerfile 为模板将服务器容器化,并按照步骤 2 创建应用版本。

与您的智能体配合使用:

“加载 edgegap 技能,然后加载 edgegap-nakama 和 edgegap-godot。以 github.com/edgegap/backend-game-sample-godot-nakama-fishgame 为参考,将 Edgegap Fleet Manager 添加到我的 Nakama 模块中,为我的 Godot 游戏添加无头服务器模式(该模式会向 Nakama 报告 READY、连接和 STOP 状态),并添加一个连接到 Nakama 在配对后发送的地址的客户端。”

如需查看每个步骤的手动操作详情,请参阅 Nakama 集成指南。

6. Nakama 如何进行玩家匹配和停止服务器

Nakama 的匹配器会对玩家进行分组,其 Fleet Manager 插件会启动 Edgegap 服务器并告知每位玩家要连接的位置。对于此示例,您不需要使用 Edgegap 的匹配器。

服务器会请求 Nakama 停止其部署,从而终止计费:

  • 在比赛获胜并在记录胜利之后;

  • 在比赛途中剩余玩家少于 2 人时;

  • 在所有人都离开时;

  • 在 60 秒内无人加入时;

  • 20 分钟后。

要将相同的配置添加到您自己的 Nakama 游戏中,请遵循 Nakama 集成指南。

已知限制

  • 浏览器中无法进行联机对战。 ENet 使用 UDP,而浏览器无法打开 UDP。Web 构建版本将需要 Godot 的 WebSocket 对等节点以及带有 TLS 升级的 WS 端口。

  • 移动仍由客户端控制。 服务器决定命中、死亡、拾取物、回合和胜利,但与原版一样,每位玩家都会发送自己鱼的位置。对于竞技游戏,应将移动移至服务器端并结合客户端预测。

  • 无法通过 ID 创建私人比赛。 每场比赛都来自匹配系统。队列管理器(Fleet Manager)的 instance_create 和 instance_join 调用可以将该功能重新引入。

测试了什么

于 2026 年 10 月 20 日在 Edgegap 上进行了端到端测试。该分支在 tests/ 中提供了 3 个测试:

  • 本地运行:godot --path . --script res://tests/smoke_test.gd 加载地图;鱼的着陆、拾取、挥动和投掷均无错误。

  • 网络,本地服务器:godot --headless --path . -- --test-auto-hit,然后运行网络测试客户端两次(命令位于 EDGEGAP.md 中)。

  • 在 Edgegap 上端到端运行:在 nakama/.env 中设置 FISHGAME_TEST_AUTO_HIT=true,然后针对您的 Nakama 运行网络测试客户端两次。服务器每轮命中一条鱼,因此比赛会自动结束。实际游戏中请将其关闭。

在不使用 Nakama 或 Edgegap 的情况下进行网络代码开发:godot --headless --path . 启动服务器,godot --path . -- --connect=127.0.0.1:7777 让客户端连接到该服务器。

常见问题

关于使用 Nakama 和 Edgegap 运行 Fish Game 的常见问题。

Nakama 可以启动专属游戏服务器吗?

是的。通过适用于 Nakama 的 Edgegap Fleet Manager,Nakama 的配对系统会在匹配的玩家附近启动一个 Edgegap 服务器,并将该服务器的地址发送给他们。该服务器会向 Nakama 报告状态,并在比赛结束时停止运行。

如何使用 Nakama 让 Godot 游戏实现服务端权威机制?

为每场比赛运行一个无头 Godot 服务器,由其全权负责判定命中、死亡、回合及比赛结果,并让 Nakama 处理账户、匹配和排行榜。Fish Game 就是这样做的:玩家无法自行提交获胜记录。

Fish Game 可以在 Godot 4 中运行吗?

是的。Edgegap 的分支已将 Heroic Labs 原版的 Godot 3 游戏移植到了 Godot 4.7,且 4.3 或更高版本应该都可以正常运行。原始的点对点托管版本仍保留在 Heroic Labs 的 GitHub 上。

Fish Game 的网页导出版本可以在线联机游玩吗?

暂且不行。该游戏基于 UDP 使用 ENet,浏览器无法打开。网页版构建需要使用 Godot 的 WebSocket peer,以及在 Edgegap 上配置支持 TLS 升级的 WebSocket 端口。

客户

了解更多已接入 Edgegap 的客户案例

提供 31 个从其他平台迁移至 Edgegap 的工作室案例研究。

他们选择 Edgegap 的关键原因

了解 Edgegap 自动化游戏服务器编排如何带来无缝的多人游戏体验。

费用

定价

定价

通过混合编排优化成本与性能

通过混合编排优化成本与性能

通过混合编排优化成本与性能

边缘云

按需

$0.00115

/ vCPU

/ 分钟

按分钟计费,仅按实际使用量收费

只有在玩家在线玩游戏时才需付费。0 个活动服务器 = $0

在全球 615 多个边缘云节点中按实例部署游戏服务器。零承诺。

只需添加信用卡。

边缘云

按需

$0.00115

/ vCPU

/ 分钟

按分钟计费,仅按实际使用量收费

只有在玩家在线玩游戏时才需付费。0 个活动服务器 = $0

在全球 615 多个边缘云节点中按实例部署游戏服务器。零承诺。

只需添加信用卡。

专属物理机集群 (裸金属)

预留容量

$0.0261

/ vCPU

/ 小时

按月计费,始终开启

每个主机每月 $280(12个月标准价),或按月支付每月 $350

通过无出站流量费用的专用机队托管,优化您游戏服务器的成本效益。

持久在线,24/7全天候可用,您的工作室专属。

专属物理机集群 (裸金属)

预留容量

$0.0261

/ vCPU

/ 小时

按月计费,始终开启

每个主机每月 $280(12个月标准价),或按月支付每月 $350

通过无出站流量费用的专用机队托管,优化您游戏服务器的成本效益。

持久在线,24/7全天候可用,您的工作室专属。

您的账单因费率和使用量而异;这可能会根据游戏类型、玩家人数等因素而有所不同。

您的账单因费率和使用量而异;这可能会根据游戏类型、玩家人数等因素而有所不同。

使用我们的预估计算器模拟您的用量 ->

使用我们的预估计算器模拟您的用量 ->

Edgegap 的功能与价格:边缘云与私有集群(Private Fleets)详细对比

Edgegap 的功能与价格:边缘云与私有集群(Private Fleets)详细对比

对比

免费试用

边缘云

Private Fleets

功能特色

分析与监控

账单警报

点击展开

还有 28 行

解锁

在帐户中添加信用卡后,即可解锁各项功能。

对比

免费试用

边缘云

Private Fleets

功能特色

分析与监控

账单警报

点击展开

还有 28 行

解锁

在帐户中添加信用卡后,即可解锁各项功能。

对比

免费试用

边缘云

Private Fleets

功能特色

分析与监控

账单警报

点击展开

还有 28 行

解锁

在帐户中添加信用卡后,即可解锁各项功能。