19 KiB
Unity 低成本联机方案选型(Steam 全球联机 / 2–10 人 / 独立开发者)
文档性质:选型与实施蓝图。不改动工程代码/包,仅作决策依据。 数据快照:2026-09(结论基于官方文档与仓库实时状态,价格类条目请以官网为准)。 工程环境:Unity
6000.6.0f1,URP 17.6,Input System 1.20,Packages/manifest.json目前无任何网络包。
0. TL;DR
| 项 | 结论 |
|---|---|
| 推荐方案 | FishNet + FishySteamworks(Steam P2P / SDR)+ Steam Lobby |
| 服务器成本 | 0(玩家自建主机 + Valve 中继) |
| 联机形态 | 客户端-主机权威(client-host),非全 P2P 网状、非专用服务器 |
| 网络拓扑 | Steam Datagram Relay 中继,无需公网 IP / 端口转发,跨区域自动选路 |
| 一次性成本 | Steam Direct 上架费(约 $100/应用,需核实)+ 时间 |
| 主要风险 | Steam 渠道绑定、主机作弊/主机优势、主机迁移体验、Unity 6.6 较新 |
一句话:对 2–10 人合作/PvE 游戏,"玩家当主机 + Valve 免费中继" 是成本/体验最优解;把联机核心与 Steam API 解耦,保留未来加专用服务器的余地。
1. 需求与约束
| 维度 | 取值 | 对选型的含义 |
|---|---|---|
| 平台 | Steam(全球发行) | 优先用 Steam 原生网络能力(SDR、Lobby、邀请) |
| 人数 | 2–10 人/房间 | 单房间小、并发房间多;不适合 MMO 式架构 |
| 团队 | 独立开发者(1 人或极小团队) | 运维预算 ≈ 0,必须选"无后台"方案 |
| 成本 | 低成本 | 免费/免版税库 + 零服务器费 |
| 玩法 | 合作 / PvE / 派对,主机权威足够 | 可接受房主权威;反作弊要求低,无需专用服务器 |
| 编辑器 | Unity 6000.6.0f1 | 需确认第三方库的 Unity 6 兼容性 |
明确不在本期范围:竞技 PvP 反作弊、跨平台(主机/移动)、持久化账号与云存档后端。
2. 推荐技术栈(冻结版本决策)
| 层 | 选型 | 获取方式 | 费用 |
|---|---|---|---|
| 网络框架 | FishNet(V4 系列) | UPM Git URL:https://github.com/FirstGearGames/FishNet.git?path=Assets/FishNet,或 Asset Store |
免费(源码许可,禁止用于同类网络库产品) |
| Steam 传输 | FishySteamworks | GitHub Releases 下载 FishySteamworks.unitypackage 导入 |
免费 |
| Steam API 绑定 | Steamworks.NET | https://github.com/rlabrecque/Steamworks.NET |
免费(MIT 系) |
| 大厅/邀请 | Steam Matchmaking & Lobbies(Steamworks 原生) | Steamworks SDK 内 | 免费 |
| 中继 | Steam Datagram Relay (SDR) | 随 Steamworks 网络 API 使用 | 免费(Valve 保留对异常带宽限制权) |
| 后端服务 | 无(本期不需要) | — | 0 |
| 本地开发传输 | Tugboat(FishNet 内置) | 随 FishNet | 免费 |
关键依据:
- FishNet 许可为 "worldwide, non-exclusive, no-charge, royalty-free",商业游戏不受限(LICENSE.md)。
- FishySteamworks 由 FishNet 作者一方维护,README 明确支持 "Peer to Peer to connect using the Steam relay",客户端通过主机
steamId64连接(仓库)。 - FishNet 核心自带 Multipass,可同时挂多个传输,便于本地测试与未来扩展(Transports 目录)。
安装顺序(供实施阶段直接照做)
- 安装 FishNet(UPM Git URL 或 Asset Store)。
- 安装 Steamworks.NET(注意 API Compatibility Level,见 §8)。
- 放置 Steam 原生库:
steam_api64.dll(Windows 64 位)等,确认运行时能被加载。 - 导入
FishySteamworks.unitypackage。 - 在 NetworkManager 上挂
FishySteamworks传输组件,模式选 Peer to Peer,填入AppId;需要时附加其自带的SteamManager。 - 本地双端联调时切回 Tugboat(原因见 §8)。
3. 架构设计(client-host)
3.1 拓扑
Steam Lobby(房间元数据 / 好友邀请)
│
┌────────────┴────────────┐
│ │
[Host] ◄── SDR 中继 ──► [Client]×N (2–10)
权威逻辑 输入 + 表现
- Host(玩家之一):跑权威模拟、刷怪、掉落、判定、存档。
- Client:只发输入,接收状态,做插值/预测表现。
- 禁止全 P2P 网状:10 人网状 = 45 条连接,NAT/带宽/一致性都不可控。
3.2 连接时序
- Host 启动 → 创建 Steam Lobby(
lobbyType、maxMembers=10、写入版本号/地图/难度/模式到 lobby data)。 - 其他人:好友邀请(Steam Overlay 邀请)或大厅列表加入。
- 加入者读取 lobby data → 取 Host 的
steamId64。 - 加入者
ClientManager.StartConnection(steamId64)(FishySteamworks)。 - Host 校验客户端版本/Mod 一致性 → 分配 PlayerId → 同步场景 → 开始同步。
- 断线:客户端自动重连(带退避);Host 掉线 → 主机迁移或结算结束(§3.4)。
3.3 同步策略(合作/PvE 场景)
- 同步频率:20–30 Hz(动作类取 30,慢节奏取 15–20)。
- 只同步必要字段:位置用量化(如 short 定点/单位向量),朝向用最低位宽;能同步"输入 + 确定性表现"的就不要同步结果。
- 开启 Interest Management(FishNet 支持按观察者裁剪),10 人小场景收益有限但可省带宽。
- 本地玩家做客户端预测 + 服务器回滚校正;其他玩家做插值(interpolation buffer 100–150 ms)。
- 权威判定(命中、拾取、伤害)一律在 Host 计算。
3.4 主机迁移(体验关键项)
合作游戏建议按"可接受中断"设计:
- 方案 A(推荐先做):存档快照 + 重新组房。Host 掉线后,最近快照存在每个 Client(或 Steam Cloud),剩余玩家重开房间并继续。
- 方案 B(后续):完整 host migration(选举新 Host、状态交接、连接重建),实现成本高,FishNet 只提供连接层能力,业务交接需自写。
3.5 分层原则(务必遵守)
Gameplay 逻辑 → NetworkBehaviour / RPC(不出现 Steam API)
Session 层 → Lobby / 邀请 / 房主 id(允许 Steam API)
Transport 层 → FishySteamworks(Steam)/ Tugboat(本地)/ 未来其它
好处:本地能用 Tugboat 调试;未来上 itch/Epic/主机时只替换 Session + Transport 层。
4. 备选方案对比矩阵
| 方案 | 授权/费用 | 服务器成本(2–10 人,全球) | Steam 支持 | 上手难度 | 结论 |
|---|---|---|---|---|---|
| FishNet + FishySteamworks | 免费(源码许可) | 0(玩家主机 + SDR) | 一方 Steam transport | 中 | ⭐ 首选 |
| Mirror + FizzySteamworks | MIT 免费 | 0 | 第三方传输,维护偏慢(FizzySteamworks 最后 push 2025-07) | 中低(教程最多) | 次选 |
| Unity NGO + Relay/Lobby | 包免费;服务按 CCU/流量计费 | 低起步、随规模上升 | 无官方 Steam 传输,仅社区实现 | 低 | 快速原型可选 |
| Photon Fusion | 免费 100 CCU(限 1 个 App,含 0.3 TB/月);500 CCU $125/月;超额流量 $0.05–0.10/GB | 0 运维,随 CCU 涨 | 不依赖 Steam | 中低 | 多平台/托管优先时可选 |
| 自建 headless 服务器 | 库免费 | VPS $5–15/月 可跑多房间;或按分钟计费托管 | 可配 Steam Game Server + SDR | 高 | 竞技 PvP 才值得 |
| Steam Remote Play Together | 免费 | 0 | 原生 | 极低(零联网代码) | 仅 2–4 人本地同屏 |
引用:Mirror(仓库、MIT、6.3k★、2026-09 活跃,但核心 Transports 无 Steam)、FizzySteamworks(419★,2025-07)、NGO Steam transport(sagering 76★、RaybelGames)、Photon(官方定价)。
为什么不选它们
- Mirror:不是差,而是本需求下"一方 Steam 传输"这一条 FishNet 明显领先;Mirror 的 Steam 走社区库且更新慢。若你更看重中文教程密度,Mirror 仍可翻盘。
- NGO + Relay:免费额度够 2–10 人,但没有官方 Steam 传输,且超出后按 CCU/流量计费,长期成本与全球中继质量都劣于 SDR。
- Photon Fusion:免费 100 CCU 对合作游戏其实够用,但"限一个 App"且超额按 CCU 月费增长;已有 Steam 免费中继时属于额外支出。
- 专用服务器:合作/PvE 无强反作弊需求,不值得引入运维。
5. 成本明细(Steam-only 路线)
| 项目 | 金额 | 说明 |
|---|---|---|
| Steam Direct 上架费 | ≈ $100 / 应用,一次性(可回收,需核实) | 上架前必须先有 Steamworks 后台与 AppID |
| Steamworks SDK / SDR / Lobby | $0 | 随 Steam 免费提供 |
| FishNet | $0 | 免费许可,商业可用 |
| FishySteamworks / Steamworks.NET | $0 | 免费 / MIT 系 |
| 服务器/带宽 | $0 | 玩家主机 + Valve 中继 |
| 合计 | ≈ $100 + 你的工时 | 无经常性支出 |
可选支出:FishNet-Pro(Patreon/GitHub Sponsors,非必需)、专用服务器(若未来做竞技)、VPS(若自建大厅后端)。
6. 带宽与时延预算(10 人,估算)
| 场景 | 同步频率 | 每客户端下行 | Host 上行 |
|---|---|---|---|
| 动作合作(10 人) | 30 Hz + 量化 | 20–60 KB/s | 约 50–150 KB/s(0.4–1.2 Mbps) |
| 慢节奏合作 | 15–20 Hz | 5–20 KB/s | 10–40 KB/s |
| 回合制/派对小游戏 | 事件驱动 | <5 KB/s | <10 KB/s |
- 结论:普通家宽可承载(Host 上行是最紧的资源,建议在 UI 上做"主机质量提示")。
- 跨洲房间物理时延不可消除(EU↔Asia 常见 200 ms+):靠 20 Hz + 插值 + 预测把体验做"顺",而不是追求低延迟。
- 优化抓手:位置量化、变化阈值发送、Interest Management、把非必要同步降到低频(10 Hz)。
7. 实施路线图(建议里程碑)
| 阶段 | 内容 | 验收标准 |
|---|---|---|
| P0 冒烟(0.5–1 天) | 装包、Tugboat 本地双端跑通移动同步 | 编辑器 + 一个 build 互见、能移动 |
| P1 Steam 直连(1–2 天) | 用开发 AppID 480,steamId64 直连 |
两台设备(两个 Steam 账号)能进同一局 |
| P2 Lobby/邀请(2–4 天) | 建房、好友邀请、大厅列表、lobby data 显示人数/版本 | 从 Steam 好友列表一键进房 |
| P3 玩法同步(持续) | 权威判定、预测/插值、断线重连 | 10 人同局 30 分钟无崩坏、掉线可回 |
| P4 发布前(2–3 天) | 真 AppID、版本校验、主机迁移/存档快照、崩溃与日志上报 | 通过 Steam Playtest 多人验证 |
工时是独立开发者粗估,P0–P2 约一周可完成"能玩"的闭环。
8. 开发与测试要点(高频踩坑)
- 同机不能双开互连:FishySteamworks 文档明确说明 Steam 限制同一设备两个 build/账号互连;本地双端调试请切 Tugboat。
- 开发 AppID 用 480(Spacewar):发售前替换为真实 AppID;测试账号需拥有该 App。
- Steam 客户端必须运行:未登录/离线模式下 SDR 与 Lobby 不可用,需在 UI 里给出明确提示。
- API Compatibility Level:Steamworks.NET 通常需要 .NET Framework(而非 .NET Standard);改后确认其他依赖仍编译通过。
- 原生库部署:
steam_api64.dll必须随构建产物就位(按 Steamworks.NET 安装指南放置),否则运行时报初始化失败。 - Unity 6.6 兼容性:编辑器版本很新,导入第三方库后先做一次全量编译与 Play 模式验证;关注过时 API 警告。
- 版本一致性:Build 版本/内容哈希写入 lobby data,Host 拒绝不匹配客户端(避免不同版本同局)。
- 主机优势与作弊:合作/PvE 可接受;若将来加 PvP,必须把判定搬到服务器或加校验,否则房主可作弊。
- 渠道锁定:Steam 传输不能在 itch/Epic/主机使用 → 保持 §3.5 分层,别把 Steam API 混进玩法代码。
- 主机质量差异:玩家主机性能/网络参差,需要"主机质量"UI 提示与最低上行门槛(如 <2 Mbps 时警告)。
9. 风险登记
| 风险 | 概率 | 影响 | 缓解 |
|---|---|---|---|
| Unity 6.6 与第三方库不兼容 | 中 | 高 | 先做 P0 冒烟再投入玩法;必要时锁定 Unity 版本 |
| Steamworks.NET 配置错误导致初始化失败 | 中 | 中 | 严格按安装指南,CI 里加运行冒烟测试 |
| Host 掉线导致整局中断 | 高 | 中 | 快照 + 重开房(方案 A),后续再考虑迁移 |
| Host 网络差导致全房卡顿 | 中 | 中 | 主机质量提示、可选"推荐主机"、限制 10 人上限 |
| 未来要上非 Steam 平台 | 中 | 中 | 传输/会话分层,预留 Tugboat/UTP |
| 价格与政策变化(Steam/Photon/Unity) | 低 | 中 | 发布前复核官方定价页 |
10. 待核实清单(发布前必查)
- Steam Direct 上架费与回收政策的当前条款。
- Steam SDR 的带宽使用指引与是否存在限额/收费触发条件。
- FishNet / FishySteamworks 对 Unity 6000.6 的官方支持声明与最新 Release。
- Steamworks.NET 当前推荐的 UPM/包管理方式与 .NET 目标。
- 若改用 NGO 路线:Unity Relay/Lobby 的当前免费额度与计费口径。
11. 参考链接
- FishNet 仓库与许可:https://github.com/FirstGearGames/FishNet | https://github.com/FirstGearGames/FishNet/blob/main/LICENSE.md
- FishNet 文档:https://fish-networking.gitbook.io/docs/ | Discord:https://discord.gg/Ta9HgDh4Hj
- FishySteamworks:https://github.com/FirstGearGames/FishySteamworks
- Steamworks.NET:https://github.com/rlabrecque/Steamworks.NET | 安装指南:https://kb.heathenengineering.com/assets/steamworks/installation
- Steam Datagram Relay:https://partner.steamgames.com/doc/features/multiplayer/steamdatagramrelay
- Steam Networking:https://partner.steamgames.com/doc/features/multiplayer/networking
- Steam Matchmaking & Lobbies:https://partner.steamgames.com/doc/features/multiplayer/matchmaking
- Mirror:https://github.com/MirrorNetworking/Mirror | FizzySteamworks:https://github.com/Chykary/FizzySteamworks
- Photon Fusion 定价:https://www.photonengine.com/fusion/pricing
- Unity Relay 文档:https://docs.unity.com/relay
- NGO Steam 传输(社区):https://github.com/sagering/UnityNetcodeSteamP2PRelayTransport | https://github.com/RaybelGames/Steam-Network-Transport-for-NGO
12. 视频教程现状(2026-09 核实)
12.1 先说结论
| 主题 | 视频教程覆盖 | 说明 |
|---|---|---|
| FishNet 基础(RPC / SyncVar / 生成 Player / 移动) | ⚠️ 仅 1 套中文合集(10 集,2022 年) | 够跑通入门,但版本偏旧 |
| FishNet 进阶(预测、对象池、兴趣管理) | ❌ 基本没有 | 只能读官方文档 |
| FishySteamworks / Steam 传输 | ❌ 没有视频 | 只有官方 README + Discord,本方案最大的资料短板 |
| Steam Lobby / 好友邀请 | ❌ 没有中文视频 | 需读 Steamworks 文档 |
| Mirror(联网、部署、成品) | ✅ 中文视频较多(4 套 + PUN2 1 套) | 若"必须跟着视频学",这是选 Mirror 的现实理由 |
| 英文 YouTube | ❓ 当前环境无法访问,未验证不予列出 | 见 §12.4 建议自查关键词 |
决策含义:视频依赖度是选型的真实权重项。FishNet 的资料形态是"文档 + Discord",Mirror/NGO 是"视频 + 博客";两者都能做成,但学习方式不同。
12.2 FishNet 中文视频合集(目前唯一找到的一套)
UP 主:无法停止奔跑的马 | 合集:Unity免费游戏网络库Fishnet使用教程(上) | 共 10 集(2022-10 发布)
| # | 内容 | 链接 |
|---|---|---|
| 1 | 安装 | https://www.bilibili.com/video/BV1g14y177Nn/ |
| 2 | 生成 Player | https://www.bilibili.com/video/BV1nG4y1p7Ts/ |
| 3 | Transform 同步 | https://www.bilibili.com/video/BV1JT411N7F5/ |
| 4 | 客户端权威 | https://www.bilibili.com/video/BV1NT411N7qd/ |
| 5 | Player 移动 | https://www.bilibili.com/video/BV1514y177nU/ |
| 6 | 指定 Player 生成位置 | https://www.bilibili.com/video/BV1JW4y1H74n/ |
| 7 | 相机 Camera | https://www.bilibili.com/video/BV1zD4y1k74f/ |
| 8 | 生成子弹 | https://www.bilibili.com/video/BV1rV4y1L73x/ |
| 9 | 子弹运动 | https://www.bilibili.com/video/BV1z14y177BC/ |
| 10 | 子弹超时与碰撞销毁 | https://www.bilibili.com/video/BV1gD4y1C7RR/ |
- 配套工程代码:https://gitee.com/ghostking9/fishnet-tutorial
- ⚠️ 版本差异提醒:录制于 2022 年(约 FishNet V3 时期),当前为 V4 系列,部分组件名/配置项/API 已变化。对不上时以官方文档为准,不要硬套。
12.3 Mirror / Photon 中文视频(同一 UP 主,可作概念对照)
| 主题 | 集数 | 链接 |
|---|---|---|
| Unity Mirror 网络游戏 API 官方教程(英文中字,译自 YouTube) | 10P | https://www.bilibili.com/video/BV1G7411w7Ve/ |
| Unity 多人联机 API Mirror 学习(一)安装 Mirror | 1P | https://www.bilibili.com/video/BV1e7411B7Wn/ |
| 如何在互联网上部署 Unity Mirror 网络游戏服务器 | 1P | https://www.bilibili.com/video/BV1Sb4y1f7sz/ |
| Unity 使用 Mirror 做的多人联网游戏(成品展示) | 22P | https://www.bilibili.com/video/BV1r7411e76U/ |
| Unity 使用 PUN2 多人联机游戏开发——入门篇 | 13P / 约 4h | https://www.bilibili.com/video/BV114411s7pw/ |
原版英文视频 ID(来自该 UP 主视频简介):Mirror 官方 API 教程 oR9P0gSaAOU,可在 YouTube 直接检索。
12.4 英文 / 官方资源(文字为主,链接均经核实)
- FishNet 入门文档:https://fish-networking.gitbook.io/docs/tutorials/getting-started/installing-fish-networking
- FishNet 官方 API 参考:https://firstgeargames.com/FishNet/api/api/index.html
- FishNet 源码架构索引(查类关系很快):https://deepwiki.com/FirstGearGames/FishNet
- FishNet 官方 Discord(Steam 传输问题主要靠这里):https://discord.gg/Ta9HgDh4Hj
- FishySteamworks 安装/配置(Steam 传输的唯一权威来源):https://github.com/FirstGearGames/FishySteamworks
- Steamworks.NET 安装指南:https://kb.heathenengineering.com/assets/steamworks/installation
YouTube 在当前环境不可访问、搜索接口也不可用,故不列任何未核实的视频标题/链接。自查关键词:
FishNet Unity tutorial、FishySteamworks setup、Steamworks.NET Unity lobby、Steam Datagram Relay Unity、Unity Mirror FizzySteamworks。
12.5 建议学习顺序(配合 §7 路线图)
- P0 之前:跟 §12.2 的第 1–5 集跑通"两个进程互相看见并移动",不必追完全部 10 集。
- P1(Steam 直连):视频帮不上忙,按 FishySteamworks README 五步走 + Discord 提问。
- P2(Lobby/邀请):读 Steamworks Matchmaking 文档,对照 §3.2 的连接时序自查。
- 若卡在概念层(RPC / SyncVar / 权威):用 §12.3 的 Mirror 系列做概念对照,概念是通用的。