Goldberg Steam模拟器怎么用?一文讲透如何离线玩Steam游戏与搭建局域网联机
【免费下载链接】gbe_forkFork of https://gitlab.com/Mr_Goldberg/goldberg_emulator项目地址: https://gitcode.com/gh_mirrors/gbe/gbe_fork
Goldberg Steam模拟器是一款免费开源游戏模拟器,核心能力是让你不必启动 Steam 客户端,就能离线畅玩依赖 Steamworks 的单机游戏,并和朋友在局域网里直接联机对战。它同时是一把研究游戏机制的好工具:成就、存档、DLC 的判定逻辑都可以被拆开观察。本文不打算堆一份"照着抄"的操作流水账,而是先讲清楚它为什么能骗过游戏,再带你完成从安装到配置的完整过程。
游戏是怎么确认"我在Steam上"的?
深夜两点,你终于下好一款惦记很久的游戏,双击启动,Steam 客户端却死活登不上去。这个场景,大概是很多人接触模拟器的最初动机。
要理解 Goldberg Steam模拟器,先要回答一个更基础的问题:一款普通的单机游戏,凭什么认定"我必须有 Steam 才能玩"?
答案藏在游戏目录里的一个小文件——steam_api.dll(Linux 下叫libsteam_api.so)。它是 Valve 官方 Steamworks SDK 的入口,游戏的所有联网、成就、存档、好友功能,都要通过这个文件向"真正的 Steam"提问:
- "我的 AppID 是多少?"(你是谁)
- "请给我 ISteamUser 接口"(我是谁)
- "请给我 ISteamFriends 接口"(我的朋友列表呢)
- "这个成就解锁了吗?"(我的进度呢)
你把这些请求想象成一位客人在前台点名要见不同部门,就很好理解了。Goldberg Steam模拟器做的事,就是整座楼"换了个前台"——它把游戏目录里的steam_api.dll整个替换掉,然后对游戏的每一个问题都给出一个"听起来很合理"的答案:
- 你说 AppID?
steam_appid.txt文件里写着呢。 - 你要 ISteamUser、ISteamFriends?
steam_interfaces.txt文件列了哪些,我就准备哪些。 - 成就、存档、好友?我都记在本地的"假账号"里。
游戏问了一圈,每个问题都得到了回答,于是它放心地以为 Steam 正在后台运行。这就是为什么它被称为开源游戏模拟器——它不是模拟某款游戏,而是模拟"Steam 这个平台"本身。
搞懂了这一点,后面所有配置都会变得顺理成章:所谓安装,本质就是"告诉前台该准备哪些部门"。
Goldberg模拟器安装教程:从克隆仓库到生成接口文件
第一步,其实是第零步:准备编译环境
这个项目需要自己动手编译,好在门槛不高。
Windows 用户:安装 Visual Studio 2022 Community(记得勾选"C++ 桌面开发"工作负载),然后运行项目根目录的build_win_premake.bat,等它把依赖和主程序全部编译完。
Linux 用户(以 Ubuntu 20.04 及以上为例):先装好编译工具链:
sudo apt install -y build-essential gcc-multilib g++-multilib libglx-dev libgl-dev然后运行build_linux_premake.sh。如果你只玩离线单机,那些libgl开头的依赖可以暂时不装,但建议一次装齐,后面体验覆盖层功能时不用返工。
拿到源码:两个容易踩的坑
获取项目用这条命令:
git clone --recurse-submodules -j8 https://gitcode.com/gh_mirrors/gbe/gbe_fork这里有两条容易被忽略的细节,先说清楚为什么:
--recurse-submodules:项目依赖不少第三方库(JSON 解析、图像处理、手柄支持等),它们以"子模块"形式挂在仓库下。不带上这个参数,编译到一半会报"找不到头文件"。-j8只是让 Git 并行下载 8 个子模块,能快一些。- Windows 上建议先关闭自动换行转换:
git config --local core.autocrlf false。否则 Git 会把源码里的换行符改来改去,Windows 下编译时容易出现"符号名被破坏"之类的诡异报错。
生成"部门清单":steam_interfaces.txt
编译完成后,先别急着拷贝文件。项目 README 里有一句反复强调的话:每次都要用generate_interfaces工具生成接口文件。
这个工具位于tools/generate_interfaces/,运行它之后会产出一个steam_interfaces.txt。它的作用,就是前面说的"前台部门清单"——游戏要什么接口、要哪个版本,都由这个文件决定。不同游戏、不同 SDK 版本需要的接口不一样,所以不要图省事从别处抄一份,每款游戏都应当用这个工具重新生成一次。
如何离线玩Steam游戏:第一次配置的全过程
现在进入正题。假设你已经编译完成,目录里出现了一个steam_settings.EXAMPLE文件夹——先别动它,它只是示例模板。
配置的核心,是整理出下面这个结构(以 Windows 为例):
| 文件/文件夹 | 放在哪 | 干什么用 |
|---|---|---|
steam_api64.dll | 游戏根目录(替换原文件) | 模拟器本体,游戏的所有 Steam 请求都由它应答 |
steam_settings/ | 和 DLL 同一目录 | 所有配置的家 |
steam_settings/steam_appid.txt | steam_settings 内 | 告诉游戏"你的 AppID 是多少" |
steam_settings/steam_interfaces.txt | steam_settings 内 | 声明游戏要的接口版本列表 |
steam_settings/configs.main.ini等 | steam_settings 内 | 模拟器行为配置,按需裁剪 |
1. 替换 Steam API 文件
把编译产物steam_api.dll/steam_api64.dll(Linux 是libsteam_api.so)复制到游戏根目录,覆盖掉原来的文件。动手前建议把原文件备份到一个安全的地方——不是因为它有用,而是万一你想还原,找不到就麻烦了。
2. 建立 steam_settings 文件夹
在游戏根目录新建steam_settings文件夹,把刚才生成的steam_interfaces.txt放进去,再新建一个steam_appid.txt,写入这款游戏的 AppID(一个纯数字,就是 Steam 商店页面 URL 里那一串)。
为什么不直接放游戏根目录而放进steam_settings?因为模拟器的查找顺序是"先看 steam_settings,再看游戏运行目录"。统一放进steam_settings,能让每款游戏的配置自洽成一包,管理起来清爽很多。
3. 拷贝配置文件并"做减法"
从steam_settings.EXAMPLE里把configs.main.ini、configs.user.ini、configs.app.ini、configs.overlay.ini四个示例拷进你的steam_settings,删掉文件名里的.EXAMPLE后缀。
这里有一条官方反复叮嘱的原则:只保留你真正需要的配置项,不要什么都写进去。这些 ini 文件里有上百个选项,绝大多数都有合理的默认值。新手常见的翻车原因,就是把示例文件原封不动搬进去——比如某选项默认是关闭的,示例里恰好打开了,游戏反而出问题。
官方文档原话:配置全部完成后,把整个
steam_settings文件夹放在模拟器 DLL 旁边即可。项目有额外 DRM(非 Steamworks)的游戏,需要先移除 DRM 才能谈模拟。
4. 存档位置:先知道它会在哪
首次运行后,模拟器会在系统目录建立存档文件夹,默认路径是:
- Windows:
%appdata%\GSE Saves\ - Linux:
$HOME/.local/share/GSE Saves/(或$XDG_DATA_HOME/GSE Saves/)
每款游戏的存档、成就、统计,都会按 AppID 分门别类存在这里。游戏内存档和 Steam 云存档是两回事——模拟器管的是"Steam 层的存档"(成就、统计、排行榜),游戏自己的存档文件依然写在该游戏原来的位置。
Steam游戏局域网联机方案:同网络下的发现与握手
离线单机只是开胃菜,局域网联机才是这个模拟器最有魅力的地方。原理同样不复杂:每台运行模拟器的机器都会在局域网里持续广播"我在这,我在玩 AppID 为 xxx 的游戏",同时监听一个固定端口等待回应。当两台机器发现彼此玩的是同一款游戏,它们就能直接建立连接——中间不经过任何 Steam 服务器。
这个端口默认是UDP 47584。注意,所有参与者必须使用同一个端口,否则互相之间"听不见"。官方还特别提醒:同一台电脑上不要同时运行两个相同 AppID 的游戏,否则网络广播会打架,联机表现会变得诡异。
想玩宿舍联机派对,按这个思路检查一遍:
- 所有人在同一个局域网内,防火墙放行 UDP 47584;
- 游戏版本和模拟器版本尽量一致,避免协议对不上;
- 如果游戏有"服务器浏览器",模拟器默认会把所有服务器标成 LAN 服务器(在
configs.main.ini里有对应开关); - 如果广播找不到人,可以在
steam_settings/custom_broadcasts.txt里手动写 IP 或域名,模拟器会额外向这些地址发送广播包。
对于有大厅(Lobby)机制的游戏,实验构建的覆盖层里还会弹出"某某邀请你加入游戏"的通知,甚至可以用auto_accept_invite.txt实现自动接受指定好友的邀请。这已经接近真正的"Steam 体验"了。
游戏存档管理:位置、改名与便携模式
很多人玩到一半想换电脑,才发现存档找不着。这里把存档管理的三个关键词讲透:
改名字:如果你觉得GSE Saves这个文件夹名太丑,或者想让每款游戏各用各的存档根目录,在configs.user.ini里设置saves_folder_name即可。模拟器会用这个名字替代默认的GSE Saves。
便携模式:如果你想"游戏文件夹走到哪,存档跟到哪",在steam_settings/configs.user.ini里设置local_save_path。一旦设置,模拟器会完全忽略全局存档目录,所有数据都写入你指定的本地路径。这非常适合放在移动硬盘或同步盘里的绿色游戏。
备份:无论哪种模式,存档本质上就是一堆本地文件。定时把GSE Saves目录复制到别处,就是最朴素的"云存档"。如果你想跨设备同步,把存档根目录指到同步网盘的本地目录,就是最省事的方案。
让游戏"看起来更完整":语言、成就与DLC内容模拟
模拟器能"装"到什么程度?答案是:只要你愿意写配置,它可以做到让游戏以为你拥有完整的账号、订阅过 DLC、解锁过成就。
语言:游戏默认用系统语言,如果它不认识你的语言,会自动退回英语。想让游戏用你指定的语言,在steam_settings/supported_languages.txt里列出游戏支持的语言代码即可。列在第一个的语言会被当作默认语言——所以把你想用的语言放第一行。
成就与统计:游戏会调用"解锁成就""更新统计"这类接口。模拟器对它们的处理规则是:在achievements.json和stats.txt里定义过的成就和统计才有效,未定义的一律拒绝(configs.main.ini里有allow_unknown_stats开关可以放宽)。想研究某款游戏的成就触发机制,这两个文件就是现成的观察窗口。
DLC内容模拟:部分游戏会通过"Depot ID"来检查 DLC 是否已安装。在steam_settings/depots.txt里列出已安装的 depot ID,游戏就会认为对应的 DLC 内容就绪。这对想体验完整版内容的玩家很实用,格式参考steam_settings.EXAMPLE/depots.EXAMPLE.txt。
其他锦上添花的文件:items.json定义游戏内物品、leaderboards.txt定义排行榜、subscribed_groups.txt模拟已订阅的创意工坊小组(有的游戏会据此解锁专属内容)。项目还提供了一个generate_emu_config命令行工具,能自动抓取并生成大部分这类配置——与其手写,不如先跑一遍工具再手工微调。
控制器自定义配置:让手柄说出游戏听得懂的话
现代游戏普遍用 SteamInput 读取手柄,而 SteamInput 的按键含义并不是"A 键 = 确认"这么简单——游戏读的是动作名(Action),比如"跳跃""奔跑"。每个动作名对应手柄上的哪个物理按键,由配置决定。
模拟器在steam_settings/controller/目录下按"动作集"管理这些映射:每创建一个动作集文件(文件名就是动作集名),就在里面声明动作和按键的对应关系。
格式分两种:
# 数字型动作(按键):动作名=按键名 Jump=A Interact=X # 模拟型动作(摇杆、扳机):动作名=模拟输入=输入源模式 Move=LJOY=joystick move一个动作也可以绑定多个按键,用逗号分隔,例如Jump=A,B。可用的按键名(DUP、LSTICK、LBUMPER、DLTRIGGER等)和模拟输入名(LTRIGGER、RTRIGGER、LJOY、RJOY、DPAD)在官方文档里都有完整列表。
需要提醒两点:
- 控制器支持目前仅限XInput手柄。非 XInput 手柄,Windows 上可以借助第三方工具把它伪装成 XInput 设备;
steam_settings.EXAMPLE/controller.EXAMPLE/glyphs/目录里自带一套免费的按键图标,游戏如果调用"获取按键图标"接口,会用到这些资源。想换成 Steam 官方图标,可以从 Steam 安装目录的tenfoot资源里复制。
常见问题速查表
| 现象 | 大概率原因 | 解决思路 |
|---|---|---|
| 游戏启动后直接崩溃或闪退 | 接口文件缺失或过旧 | 用generate_interfaces重新生成steam_interfaces.txt并放入steam_settings |
| 提示找不到 Steam / 未登录 | 没放steam_appid.txt,或位置不对 | 确认文件在steam_settings内且内容只有数字 AppID |
| 手柄完全没反应 | 非 XInput 设备,或没配置动作集 | 先转成 XInput,再在steam_settings/controller/配好动作映射 |
| 局域网找不到朋友 | 端口、防火墙或版本不一致 | 确认都是 UDP 47584、防火墙放行、双方版本一致 |
| 杀毒软件报毒 | Windows 版带有一个自签名的假证书 | 确认是误报,不要把它安装进系统证书库 |
| 游戏能进但成就/统计异常 | 相关配置未定义 | 检查achievements.json、stats.txt是否存在且格式有效 |
| 想还原原版 | 没备份原文件 | 平时就把原始steam_api.dll单独存好 |
再往前一步:覆盖层、调试与社区
基础配置玩熟之后,这个项目还有几层可以继续挖。
内置覆盖层(实验构建):在configs.overlay.ini里打开enable_experimental_overlay=1,游戏内按SHIFT+TAB就能呼出类似 Steam 的界面,能看到成就、好友、聊天通知,甚至成就解锁时的音效(放一个overlay_achievement_notification.wav到steam_settings/sounds/即可)。它是实验功能,个别游戏可能崩溃,但体验一下非常值得。
调试模式:如果游戏行为异常,换用 debug 构建版运行,它会在 DLL 旁边生成一份STEAM_LOG.txt,记录游戏对每个 Steam 接口的调用过程。排查"哪个接口没被正确应答"时,这份日志就是现场录像。
Mod 与外观:模拟器支持把steam_settings/mods/<数字ID>/目录伪装成创意工坊 Mod 供游戏读取,还能配合mod_images/放预览图。
资料在哪:post_build/steam_settings.EXAMPLE/是活教材,每个配置文件都带注释;post_build/README.release.md是官方使用说明全集;CHANGELOG.md记录了每个版本的改动动机;dev.notes/里甚至有几篇开发者写的心得,比如"Steam 接口的不同版本是如何分发的"。想看懂底层,从这几份文档入手最实在。
另外提醒一句:你拿到的gbe_fork是社区维护的分支,作者在 README 里明确欢迎任何人 fork 和提 PR。如果你在配置中发现了 bug 或顺手修好了什么,往上游提交贡献,就是对这个项目最好的支持。
动手吧:今晚就能玩上的最小流程
如果只看一篇就够了,请记住这五件事:
- 克隆仓库时记得带上
--recurse-submodules; - 编译完成后,用
generate_interfaces生成接口文件,并把它放进steam_settings; - 替换游戏目录里的
steam_api(64).dll或libsteam_api.so,同时放入steam_appid.txt; - 配置文件只保留需要的选项,别整篇照抄示例;
- 存档默认在
GSE Saves目录,想便携就设local_save_path。
选一款你已经拥有的游戏,从离线单机开始,确认能跑通之后再尝试和朋友联机。当你在局域网里成功连上好友的那一刻,你会真正理解这个开源游戏模拟器的价值——它让"游戏属于玩家自己"这件事,变成了可配置、可研究、可分享的现实。祝玩得开心。
【免费下载链接】gbe_forkFork of https://gitlab.com/Mr_Goldberg/goldberg_emulator项目地址: https://gitcode.com/gh_mirrors/gbe/gbe_fork
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考