SpaceEdge 是 Edgegap 基于 Unity 构建的针对 Fish-Networking (FishNet) 的太空射击游戏示例。该版本在浏览器中运行:玩家在 Unity WebGL 中飞行、射击并计分,每场比赛都在各自专用的 Edgegap 游戏服务器上运行。
游戏代码保持 FishNet 原样:相同的 NetworkManager、Bayou 传输、预测和 RPC。该示例在其周围添加了几个 Edgegap 脚本:一个用于启动服务器,一个用于寻找比赛,另一个用于在场景切换时保持它们处于活动状态。
没有玩家作为比赛的主机。专用服务器会校验每一次射击,控制生命值和得分,并在所有人离开后停止其自身的部署。游戏客户端不保存任何 Edgegap API 令牌。
Edgegap 的网络覆盖 615 多个边缘云节点(了解更多)。每台服务器都部署在适合其玩家的最佳可用位置,并且仅在比赛运行期间计费。
完整指南:通过 Fish-Networking integration guide 将 Edgegap 添加到您自己的 FishNet 游戏中
平台:浏览器中的 Unity WebGL,基于安全 WebSockets (
wss://);Linux 专用服务器。README 说明 Windows 桌面构建版本也可以通过 Bayou 运行(不属于测试运行的一部分)。Unity 2021.3.45f2,FishNet 4.1.6R。在其各自许可下使用免费的 Unity Asset Store 资产(Cartoon FX、Sci-Fi Sfx、Star Sparrow、Starfield Skybox、TotalJSON)。
工作原理
玩家在浏览器中打开游戏并选择开始游戏。
直连模式(默认):客户端连接到在
MatchmakingSystem上设置的服务器地址和端口。匹配器模式(可选):客户端向 Edgegap Matchmaker 发送票据,由其将 2 到 4 名玩家分组并在离他们较近的位置启动 Edgegap 服务器。服务器通过普通 WebSockets 在
0.0.0.0:7770上启动 FishNet。Edgegap 的 TLS 升级添加了安全层,因此浏览器使用wss://连接到部署的主机名。无需购买证书。玩家在
BattleScene中飞行和射击。服务器校验每一次射击并控制生命值和得分。如果在 120 秒内没有人加入,或者最后一名玩家离开 30 秒后,服务器将停止其自身的部署,计费也会停止。
示例做出的更改:
路径 | 作用 |
|---|---|
| 将开始游戏连接到直连(默认)或匹配客户端。在关闭匹配器时,它会禁用匹配客户端。 |
| 匹配器模式:创建票据,等待 |
| 服务器构建:在端口 7770 上启动 FishNet 服务器,读取 Edgegap 注入的变量,并在房间为空时停止部署。替换了 FishNet 的 Start On Headless。 |
| 在 MainMenu → BattleScene → MainMenu 的场景切换中保持 |
| 命令行 Linux 服务器和客户端构建,以及场景设置。 |
| 将 Edgegap Unity SDK 作为 Git 包 ( |
| 基于带有 CA 证书的 Ubuntu 22.04 服务器镜像;面向浏览器的匹配器配置文件。 |

浏览器中的 SpaceEdge:每艘飞船都在同一个 Edgegap 专用服务器上飞行。
1. 开始之前
一个免费的 Edgegap 账户。请验证您的电子邮箱。测试无需信用卡。
带有 Linux Build Support (Mono)、Linux Dedicated Server Build Support 和 WebGL Build Support 模块的 Unity 2021.3.45f2。
已安装并正在运行的 Docker Desktop。
Python 3 或任何静态 Web 服务器,用于在本地托管 WebGL 构建版本。
使用
git clone克隆该代码仓库,然后在 Unity Hub 中打开Fishnet_v4.1.6R_WebGL_Matchmaker文件夹。其他文件夹为旧版示例;部分示例在游戏客户端中包含了 Edgegap API 令牌,因此仅可用于本地测试。
Git:Unity 需要在 PATH 环境变量中配置 Git 客户端(2.14.0 或更高版本),以便从 Git URL 安装软件包(例如 Edgegap 插件)。macOS 通常已自带(Xcode 命令行工具);在 Windows 上,请安装 Git。
2. 本地播放
通过 Tools → Edgegap → Build Linux Dedicated Server 构建服务器。构建产物将输出至 Builds/EdgegapServer/。然后在示例文件夹中,在 Docker 中运行它:
docker build --platform linux/amd64 -t fishnet-server:local .
docker run --rm -p 7770:7770 fishnet-server:local
日志会显示 Edgegap Server | Starting server on 0.0.0.0:7770. 和 Not running on Edgegap, self-stop disabled.
从 File → Build Settings 构建 WebGL 客户端,或从命令行构建:
Unity -batchmode -quit -projectPath . -executeMethod EdgegapServerBuild.BuildClient -edgegapClientTarget webgl
托管 Builds/Client/webgl,例如使用 python -m http.server 8080,在两个标签页中打开 http://localhost:8080,并在每个标签页中选择 Start Game。默认设置(localhost、7770、Direct Use Wss 关闭)将连接到本地服务器。
3. 将游戏服务器部署到 Edgegap
将镜像推送到您的 Edgegap 注册表。容器注册表页面包含您的项目、用户名和令牌:
docker login registry.edgegap.com
docker build --platform linux/amd64 -t registry.edgegap.com/<project>/fishnet-server:v1 .
docker push registry.edgegap.com/<project>/fishnet-server:v1
在控制面板中,创建一个应用程序(示例的配对器配置需要 fishnet-webgl-matchmaker)并为该镜像创建版本 v1:
端口:名称
gameport,端口7770,协议 WS,开启 TLS 升级 (TLS Upgrade)。Edgegap 会处理 TLS,因此浏览器使用wss://连接,而服务器端运行普通的ws。设置容器注册表用户名和令牌,否则部署拉取镜像将会失败。
每次构建都使用新的镜像标签,切勿使用 latest。
4. 在 Edgegap 服务器上开始游戏
从仪表板部署该版本,选择离您较近的区域。当状态为Ready时:
在
MainMenu场景中的MatchmakingSystem对象上,将 Direct Address 设置为部署的主机名(<id>.pr.edgegap.net,而不是其 IP),将 Direct Port 设置为其外部端口,并勾选 Direct Use Wss。重新构建 WebGL 客户端,提供托管服务,并在两个标签页中进行游戏。
每次部署外部端口都会改变,因此每次都需要读取它。如果无人加入,服务器将在启动 120 秒后停止部署;最后一名玩家离开后 30 秒也会停止部署。
5. 将其添加到你自己的 FishNet 游戏中
该示例是一个可用的参考:您的编码智能体可以直接复制其经过测试的文件,而无需从头编写。通过四处修改,即可使 FishNet 浏览器游戏在 Edgegap 上运行:
服务器自行启动。
Assets/Edgegap/EdgegapServerLifecycle.cs会在服务器构建中通过固定端口启动 FishNet。请在ServerManager上关闭 Start On Headless,这样同一场景即可同时适用于客户端和服务器构建。服务器自行停止。同一个脚本会读取 Edgegap 注入的变量,并在没有玩家时停止部署,从而停止计费。
在场景切换时保持存活。
Assets/Edgegap/EdgegapPersistence.cs会在 FishNet 加载场景时保持Edgegap对象存活。如果没有它,服务器的自停止逻辑将随菜单场景一同销毁。浏览器安全连接。运行在 7770 端口的 Bayou、应用版本上带有 TLS Upgrade 的 WS 端口,以及通过
wss://连接到主机名的客户端(MatchmakingSystem.cs、EdgegapMatchmakingClient.cs)。
然后以示例的 Dockerfile 为模板对服务器进行容器化,并按照步骤 3 创建应用版本。
配合您的智能体:
"加载 edgegap 技能,然后加载 edgegap-fishnet。以 github.com/edgegap/netcode-game-sample-unity-fishnet-hashgrid/tree/main/Fishnet_v4.1.6R_WebGL_Matchmaker 为参考,将我的 FishNet 游戏转换为 WebGL 专属服务器游戏:7770 端口上的 Bayou、Edgegap 服务器生命周期、持久化和匹配客户端脚本、关闭 Start On Headless、客户端通过 wss 连接到主机名,以及一个没有延迟规则且在 allowed_cors_origins 中包含我的 Web 源的匹配器配置。"
如需手动查看每个步骤的详细信息,请参阅 Fish-Networking 集成指南。有关适用于任何 Unity 网络代码的浏览器规则,请参阅 Unity WebGL。
6. 开启 Edgegap Matchmaker
撮合服务(Matchmaker)将玩家分组,在他们附近启动一个 Edgegap 服务器,并将该服务器地址提供给每个客户端。在示例中,该功能默认关闭,直到您将其勾选。
在
matchmaker-config.json中,将application.name和version设置为您的应用和版本,并在allowed_cors_origins中列出提供 WebGL 构建版本服务的所有网址(该文件中已有http://localhost:8080)。在控制面板中,打开 Matchmaker,选择 Create Matchmaker,上传该文件并选择 Create and Start。
在
MainMenu中,将 API URL 和 Auth Token 复制到Edgegap对象的 Edgegap 匹配 Client 上的 Base Url 和 Auth Token 中。Auth Token 可以安全地随客户端一同发布。在MatchmakingSystem上勾选 Use Edgegap Matchmaker。重新构建客户端,从允许的来源提供服务,打开两个标签页并在两处都选择 Start Game。
针对网页端游戏的两个规则,已包含在示例的配置中:
无延迟规则。浏览器无法 ping 通 Edgegap 的延迟信标(latency beacon),因此 Edgegap 会根据玩家的 IP 来部署服务器。
列出您的来源。如果未将它们添加到
allowed_cors_origins中,浏览器将拦截撮合服务的回复。
casual 配置文件匹配 2 到 4 名玩家。当您发布新的服务器构建版本时,推送新标签(tag),创建新的应用版本,然后在撮合服务中依次点击 Stop → Edit application.version → Start。
已知限制
使用两名玩家进行测试。该配置在 30 秒后会扩展为 1 名玩家,但在 Edgegap 的测试中,单人玩家只有在票证接近 5 分钟到期时才能获取服务器。
免费套餐。匹配系统每 3 小时重启一次(URL 和令牌保持不变),并且一次只能运行一个部署。被遗忘的测试部署会阻止匹配。
服务器上尚未进行票证检查。服务器不会检查正在连接的客户端是否持有比赛的有效票证之一(
MM_TICKET_IDS),并且没有回填机制。对于实际游戏而言,这两者都是接下来的步骤。直连模式是手动的。如果不使用匹配系统,您需要将每个部署的主机名和端口复制到客户端并重新构建。
测试了什么
于 2026 年 10 月 15 日在 Edgegap 上进行了端到端测试,配置包括:Unity 2021.3.45f2、FishNet 4.1.6R、Bayou、带有 3.5.6 版本中发布的 POST 修复补丁的 Edgegap Unity SDK 3.5.5,以及免费套餐上的 matchmaker 3.3.2:
撮合系统(Matchmaker):两个 WebGL 标签页成功匹配,分配到同一服务器,通过带有 TLS 升级的
wss://成功连接并进行游戏。自动停止(Self-stop):比赛结束后,服务器自行停止了部署。
本地(Local):Docker 服务器记录日志
Starting server on 0.0.0.0:7770.,并在localhost上接收 WebGL 客户端连接。
2026 年 10 月 21 日,该示例已迁移至 SDK 的 main 分支(3.5.6 或更高版本),其中包含相同的修复。通过 Bayou 连接的桌面客户端:应该可以正常工作,但未包含在本次测试运行中。
常见问题
关于在 Edgegap 上通过浏览器运行 FishNet 的 SpaceEdge 示例的疑问。
FishNet WebGL 游戏可以连接到专用服务器吗?
是的,使用 Bayou WebSocket 传输即可。服务器在端口 7770 上运行普通 WebSocket,Edgegap 的 TLS Upgrade 添加了安全层,浏览器使用 wss:// 连接到部署的主机名。SpaceEdge 正是这样做的。
在线游玩 SpaceEdge 需要使用 Edgegap Matchmaker 吗?
不。默认情况下,示例会直接连接到您设置的服务器地址和端口,因此您可以针对从控制面板启动的部署进行测试。勾选“Use Edgegap Matchmaker”(使用 Edgegap 匹配器)可让玩家自动分组并连接。
SpaceEdge 客户端是否持有 Edgegap API 令牌?
不。在配对(matchmaker)模式下,它仅使用配对器的身份验证令牌(Auth Token),这可以安全地打包到客户端中。同一代码库中的旧文件夹会从客户端调用 Edgegap API,因此这些文件夹仅用于本地测试。
为什么匹配系统在 Unity 2021.3 上会失败?
在 Unity 2022.3 之前,Edgegap Unity SDK 3.5.5 及更早版本发送的工单 JSON 会被匹配系统拒绝并返回 HTTP 400 错误。请使用 SDK 3.5.6 或更高版本;该示例跟踪 SDK 的 main 分支。

客户
了解更多已接入 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 自动化游戏服务器编排如何带来无缝的多人游戏体验。









