Fish Game 是 Heroic Labs 推出的一款 2 至 4 人在线格斗游戏,旨在展示 Nakama 的功能。Edgegap 的分支版本将其移植到了 Godot 4,并在其专属的专用游戏服务器上运行每场在线对战。
Nakama 继续发挥其专长:账户系统、匹配机制和排行榜。当它找到一场对局时,会通过 Edgegap Fleet Manager for Nakama 在匹配玩家附近启动一个 Edgegap 服务器。
没有玩家主持对局:无头(headless)Godot 服务器负责判定击中、死亡、回合及获胜者,然后将胜局记录到 Nakama 中并自行停止运行。
Edgegap 的网络覆盖 615 多个边缘云节点(了解更多)。每台服务器都会部署在最适合其玩家的可用位置,并且仅在比赛运行期间计费。
完整指南:通过 Nakama 集成指南将 Edgegap 添加到您自己的 Nakama 游戏中
平台:Windows、macOS 和 Linux 桌面构建版本。原始游戏由 Heroic Labs 制作;代码基于 Apache 2.0 协议,大部分美术、音乐和音效基于 CC BY-NC 协议。
工作原理
玩家使用邮箱登录 Nakama 并点击匹配。Nakama 的匹配器将他们分在一组。
Nakama 的 Fleet Manager 根据每个玩家登录时的 IP,在匹配玩家附近启动 Edgegap 部署。
游戏服务器启动,监听 UDP 端口 7777,并向 Nakama 发送其 IP 和端口以通知就绪(READY)。
Nakama 将服务器地址发送给每位玩家。玩家通过 ENet 连接;服务器检查每个玩家的 Nakama 会话,并且只允许匹配成功的玩家进入。
首个赢得 5 个回合的鱼获胜。服务器在
fish_game_wins排行榜上记录获胜情况,然后指示 Nakama 停止(STOP)部署。
该分支修改的内容:
路径 | 功能说明 |
|---|---|
| 客户端:匹配票据、服务器地址通知、ENet 连接。服务器:允许匹配玩家进入。 |
| 专用服务器模式:监听、向 Nakama 报告就绪(READY)、连接状态和停止(STOP),自行停止运行。 |
| 联机状态下,服务器掌控回合、拾取物、击中和死亡判定。 |
| 带有 Go 模块的 Nakama 3.39:Fleet Manager、匹配钩子、权威排行榜。 |
| 导出“Linux Server”预设并使用无头(headless)Godot 运行它。 |

来自 Heroic Labs Nakama 的 Fish Game,运行在 Edgegap 上
1. 开始之前
一个免费的 Edgegap 账户,以及从控制面板 → 用户设置 → 令牌 (Dashboard → User Settings → Tokens)获取的 API 令牌。该令牌适用于整个组织,因此它只会配置在 Nakama 的设置文件中,绝不会进入游戏中。
Godot 4.7(4.3 或更高版本应该均可)。
Docker Desktop,用于 Nakama 和游戏服务器镜像。
Nakama 的公网 HTTPS 地址。 Edgegap 服务器需要回呼 Nakama,因此
localhost无法使用。用于测试时,使用隧道即可(步骤 3)。克隆该 fork 分支。
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 上运行:
Nakama 启动服务器。将 Nakama 的 Edgegap Fleet Manager 添加到您的 Nakama Go 模块中,并添加一个配对钩子(matchmaker hook),以便为每场比赛创建一个 Edgegap 部署(见复刻项目的
nakama/文件夹)。游戏以无头(headless)模式作为服务器运行。当 Godot 以无头模式运行时,游戏会以服务器模式启动,监听固定的 UDP 端口并掌控游戏规则:命中、阵亡、回合、结果(
autoload/EdgegapServer.gd、Game.gd)。服务器向 Nakama 报告状态。它会发送包含其 IP 和端口的 READY 状态,每 5 秒上报一次已连接的玩家,并在比赛结束时发送 STOP,以便 Nakama 终止部署并停止计费。
客户端等待其服务器。配对成功后,客户端通过 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 的工作室案例研究。

《以太之战 2》完美的全球发布
Aether Studios
了解Aether Studios是如何快速添加Edgegap并向他们的社区交付完美的启动和后启动服务的。
Case Study

克服因虚拟现实在竞技Multiplay中使用WiFi而引入的延迟
Halfbrick Studios
Discover how Halfbrick successfully launched & maintains a multiplayer-focused Early Access on META Quest's VR platform.
Case Study

MENA的社交应用添加了在线游戏
WOLF
了解这款在中东和北非地区广受欢迎的社交应用如何轻松地将 matchmaking 和多人游戏编排添加到 WOLF Qanawat。
Case Study

混合编排让开球策略随时应对任何流量做好准备
Birch Games
混合编排如何帮助 Birch Games 应对流量——将免流出费用的 Fleets 与无区域限制云相结合。
Case Study

7天血月
The Fun Pimps & iLLOGIKA
了解 Illogika 如何大幅降低服务器成本,并确保提供《七日杀 (7 Days to Die)》玩家所期望的在线体验。
Case Study

真实的在线战争需要终极的协调
Highwire Games
了解Highwire对性能的需求如何需要只有Edgegap才能提供的编排。
Case Study

22,000 条评价、4.8 颗星以及自动扩展的基础架构
Sinn Studios
一个由 Slack 提供支持的简单集成,如何让 Sinn Studio 的热门 VR 游戏快速上线并保持稳定运行。
Case Study

动态服务器编排
Under NDA - AAA Studio
了解世界上最大的AAA工作室之一如何通过边缘计算改善其对等多人游戏体验。
Case Study

对于 AAA 格斗游戏的近零延迟
AAA Studio - Under NDA
一个未宣布的项目如何实现了最低延迟,并改善了其1v1游戏中的公平性。
Case Study

Play Gods with Multiplayer Physics
Squido Studio
Learn how Squido uses Edgegap's highligh optimized game servers to deliver mind-bending & chaotic VR gameplay.
Case Study

全面托管的解决方案为独立游戏节省时间 多人VR恐怖游戏
Dirty Pearl Studios
了解Dirty Pearl Studios如何通过Edgegap的轻松集成和自动编排,以及其Nakama集成,节省了开发时间。
Case Study

即时全球服务器部署以促进协作式XR医学教育
AlensiaXR
AlensiaXR如何利用Edgegap为全球医学生提供低延迟、始终可用的共享解剖课程。
Case Study

守光人:具有专用服务器的 VR 社交合作游戏
Spectral Games
Spectral Games 如何在无需任何服务器经验的情况下,利用 Edgegap Matchmaking 和 Server Browser 为其 VR 社交大厅启动专用服务器。
Case Study

全球范围内快速可靠的部署,适用于PvPvE挑战者Gravebound
Crater Studios
Edgegap 的调度和配对如何帮助 Crater Studios 使他们能够将重心从基础设施转移到游戏玩法上。
Case Study

快速扩展网络元宇宙
Hiber
了解Hiber如何通过Edgegap消除服务器容量规划中的猜测。
Case Study

高硬件要求和自定义游戏服务器池
Alderon Games
了解Alderon Games如何瞬间利用全球多个供应商的自定义游戏服务器池来支持其热门MMO。
Case Study

独立开发者的简单集成
WhaleFood Games
阅读关于WhaleFood Games如何使用Edgegap解决其网络代码问题的文章。
Case Study

推动东南亚首款电子竞技游戏的尖端技术。
Anantarupa Studios
了解Edgegap如何通过一个无缝解决方案简化复杂基础设施和尖端技术,从而改变东南亚的游戏格局。
Case Study

一次打击。全球抵达。
Triple Hill Interactive
Triple Hill Interactive如何利用Edgegap的编排来提供低延迟,并提高在每毫秒都至关重要的游戏类型中的公平性。
Case Study

快节奏团队大逃杀...带着枪的动物毛绒玩具!
SANDYFLOOR
了解一家韩国独立工作室是如何将其多人游戏发布到全球的。
Case Study

移动端赛马游戏凭借即时、高效能的服务器走向全球
Mirai Labs
看 Mirai Labs 如何通过即时服务器部署和细分 vCPU 来运行 Pegaxy Blaze 的全球多人竞速游戏,从而将单个玩家的成本保持在极低水平。
Case Study

服务器管理与分发
Matrioshka Games
阅读关于Matrioshka Games如何在资源有限的情况下发布早期访问的战斗 Royale。
Case Study

听我的信号,释放地狱!
TyGames
探索独立工作室TyGames如何让玩家沉浸在第三人称角斗士战斗的多人游戏中。
Case Study

瞬时全球编排
Soliton Interactive
探索Soliton Interactive如何做到了不可能……首次推出可多人玩的版本!
Case Study

竞技游戏具有服务器端物理引擎,确保理想的低于50毫秒的延迟
NS7
了解为什么仅有Edgegap能够使独立工作室通过服务器端物理和权限实现其AAA质量的免费游戏体育玩法愿景。
Case Study

iGaming的区域部署
X1 Contra 1
X1 Contra 1 通过经济高效的托管和区域部署,为其巴西玩家提供实时 PvP 休闲游戏,确保数据和法律合规。
Case Study

仅在玩家游玩时付费:经济实惠的多人游戏基础设施
Meltdown Interactive
Edgegap 如何帮助独立开发商 Meltdown Interactive Media 在无需复杂方案的情况下,以高性价比解决扩缩容和匹配问题,从而让他们能够专注于游戏开发。
Case Study

同一个 Edgegap 平台,三种截然不同的网络配置
Warped Games
了解 Warped Games 如何在同一个 Edgegap 部署 API 和同一个容器管线上运行社交中心、实时合作以及回合制合作。
Case Study

台球大师巡回赛Max
RETA Games
Case Study

韩国的Web3 POP提取射击游戏走向全球,即刻启程
NDUS Entertainment
XOCIETY 如何轻松地添加 Edgegap 编排并集成自定义 matchmaking,与 Edgegap Ping Beacons 一起优化延迟。
Case Study

Multiplayer in Every Dimension
Arcadia.tv
Discover how Arcadia.tv uses Edgegap's edge network to deliver an innovative, team and location-based athletic VR sport.
Case Study

F2P 移动格斗游戏利用即时(Just-In-Time)服务器降低基础设施成本
Game Changers Worldwide
Game Changer Worldwide 如何在全球移动端托管 Rumble Rush 的实时 3v3 PvP 游戏。
Case Study
他们选择 Edgegap 的关键原因
了解 Edgegap 自动化游戏服务器编排如何带来无缝的多人游戏体验。









