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

19 KiB
Raw Permalink Blame History

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 目录)。

安装顺序(供实施阶段直接照做)

  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(仓库、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. 开发与测试要点(高频踩坑)

  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 提示与最低上行门槛(如 <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. 参考链接


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 英文 / 官方资源(文字为主,链接均经核实)

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 系列做概念对照,概念是通用的。