Files
agame_for_unity/Docs/联机方案选型.md
T

294 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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](https://github.com/FirstGearGames/FishNet/blob/main/LICENSE.md))。
- FishySteamworks 由 FishNet 作者一方维护,README 明确支持 "Peer to Peer to connect using the Steam relay",客户端通过主机 `steamId64` 连接([仓库](https://github.com/FirstGearGames/FishySteamworks))。
- FishNet 核心自带 Multipass,可**同时挂多个传输**,便于本地测试与未来扩展([Transports 目录](https://github.com/FirstGearGames/FishNet/tree/main/Assets/FishNet/Runtime/Transporting/Transports))。
### 安装顺序(供实施阶段直接照做)
1. 安装 FishNet(UPM Git URL 或 Asset Store)。
2. 安装 Steamworks.NET(注意 API Compatibility Level,见 §8)。
3. 放置 Steam 原生库:`steam_api64.dll`(Windows 64 位)等,确认运行时能被加载。
4. 导入 `FishySteamworks.unitypackage`。
5. 在 NetworkManager 上挂 `FishySteamworks` 传输组件,模式选 **Peer to Peer**,填入 `AppId`;需要时附加其自带的 `SteamManager`。
6. 本地双端联调时切回 **Tugboat**(原因见 §8)。
---
## 3. 架构设计(client-host)
### 3.1 拓扑
```
Steam Lobby(房间元数据 / 好友邀请)
│
┌────────────┴────────────┐
│ │
[Host] ◄── SDR 中继 ──► [Client]×N (2–10)
权威逻辑 输入 + 表现
```
- **Host(玩家之一)**:跑权威模拟、刷怪、掉落、判定、存档。
- **Client**:只发输入,接收状态,做插值/预测表现。
- **禁止全 P2P 网状**:10 人网状 = 45 条连接,NAT/带宽/一致性都不可控。
### 3.2 连接时序
1. Host 启动 → 创建 Steam Lobby(`lobbyType`、`maxMembers=10`、写入版本号/地图/难度/模式到 lobby data)。
2. 其他人:好友邀请(Steam Overlay 邀请)或大厅列表加入。
3. 加入者读取 lobby data → 取 Host 的 `steamId64`。
4. 加入者 `ClientManager.StartConnection(steamId64)`(FishySteamworks)。
5. Host 校验客户端版本/Mod 一致性 → 分配 PlayerId → 同步场景 → 开始同步。
6. 断线:客户端自动重连(带退避);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([仓库](https://github.com/MirrorNetworking/Mirror)、MIT、6.3k★、2026-09 活跃,但[核心 Transports 无 Steam](https://github.com/MirrorNetworking/Mirror/tree/master/Assets/Mirror/Transports))、FizzySteamworks([419★,2025-07](https://github.com/Chykary/FizzySteamworks))、NGO Steam transport([sagering 76★](https://github.com/sagering/UnityNetcodeSteamP2PRelayTransport)、[RaybelGames](https://github.com/RaybelGames/Steam-Network-Transport-for-NGO))、Photon([官方定价](https://www.photonengine.com/fusion/pricing))。
### 为什么不选它们
- **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. 开发与测试要点(高频踩坑)
1. **同机不能双开互连**:FishySteamworks 文档明确说明 Steam 限制同一设备两个 build/账号互连;本地双端调试请切 **Tugboat**。
2. **开发 AppID 用 480(Spacewar)**:发售前替换为真实 AppID;测试账号需拥有该 App。
3. **Steam 客户端必须运行**:未登录/离线模式下 SDR 与 Lobby 不可用,需在 UI 里给出明确提示。
4. **API Compatibility Level**:Steamworks.NET 通常需要 **.NET Framework**(而非 .NET Standard);改后确认其他依赖仍编译通过。
5. **原生库部署**:`steam_api64.dll` 必须随构建产物就位(按 Steamworks.NET 安装指南放置),否则运行时报初始化失败。
6. **Unity 6.6 兼容性**:编辑器版本很新,导入第三方库后先做一次全量编译与 Play 模式验证;关注过时 API 警告。
7. **版本一致性**:Build 版本/内容哈希写入 lobby data,Host 拒绝不匹配客户端(避免不同版本同局)。
8. **主机优势与作弊**:合作/PvE 可接受;若将来加 PvP,必须把判定搬到服务器或加校验,否则房主可作弊。
9. **渠道锁定**:Steam 传输不能在 itch/Epic/主机使用 → 保持 §3.5 分层,别把 Steam API 混进玩法代码。
10. **主机质量差异**:玩家主机性能/网络参差,需要"主机质量"UI 提示与最低上行门槛(如 &lt;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 路线图)
1. **P0 之前**:跟 §12.2 的第 1–5 集跑通"两个进程互相看见并移动",不必追完全部 10 集。
2. **P1(Steam 直连)**:视频帮不上忙,按 FishySteamworks README 五步走 + Discord 提问。
3. **P2(Lobby/邀请)**:读 Steamworks Matchmaking 文档,对照 §3.2 的连接时序自查。
4. 若卡在概念层(RPC / SyncVar / 权威):用 §12.3 的 Mirror 系列做概念对照,概念是通用的。