☰
开源协作游戏引擎Superpowers:安装、架构与多人实时开发实践
2026/10/29 12:46:31 网站建设 项目流程

看到"想要安装 superpowers"这个搜索词的时候,我大概能猜到搜索者心里的画面:给自己的开发环境装上点什么,然后做游戏这件事就能一键起飞。老实说,我当初也是带着这个期待去折腾这个项目的,完整装完、跑通、做出一个能多人实时编辑的小场景之后发现,它确实是一种特别的"超能力",只不过和第一印象里的可能不太一样。

先说清楚身份,避免装错东西。superpowers 这个关键词在开源世界里能撞上好几个项目:有浏览器里的协作游戏引擎 Superpowers,有给 Visual Studio Code 增强技能的各种插件合集,还有一些名字相近的零散库。本文要聊的是那个在浏览器里直接做 2D/3D 游戏、并且自带多人实时协作编辑能力的开源引擎——Superpowers。它由开源社区里的 Sponge 团队发起,编辑器跑在网页端,游戏逻辑用 TypeScript 编写,服务端统一负责构建、同步和托管。换句话说,你的开发工具不再是装在电脑上的一个巨大 IDE,而是一个打开浏览器就能进入的协作空间。

这篇文章就是一份从零到一的安装与上手记录:怎么装、装完先做什么、编辑器背后的同步机制是怎么设计的、第一段脚本怎么写、怎么把作品发布给别人玩,以及我在实际安装和写脚本过程中踩过的一些坑。如果你跟我一样属于"先跑通再研究原理"的类型,照着往下走就行。

1. 先弄明白你装的是什么:一个把协作当成第一优先级的引擎

1.1 它和 Unity、Godot 最大的区别不在渲染,而在协作方式

绝大多数游戏引擎的工作流是这样的:你下载一个巨大的本地编辑器,创建项目,然后团队成员各自 clone 一份代码,用 Git 管理分支,改完提交,冲突了再解决冲突。这套流程对独立开发者没有问题,但对一个小团队来说,光是"我改的场景怎么和他改的场景合并"就能消耗大量精力。

Superpowers 走的是完全相反的方向:编辑器本身跑在浏览器里,项目文件和资产统一由服务器托管,多个人可以同时打开同一个项目实时编辑。这个体验更像 Google Docs 或者 Figma,而不是传统 IDE。你拖一个立方体进来,几秒钟后队友的浏览器里也出现了那个立方体;你改了一行脚本并保存,服务器立刻完成编译,其他成员马上就能看到最新效果。

当年 Sponge 团队做这个引擎的时候,目标就很明确:让一组人——哪怕是没有版本管理经验的游戏爱好者——能够像写协作文档一样一起做网页游戏。所以协作不是附加功能,而是整个架构的出发点。

1.2 为什么拆成三套服务器:构建、LIVE、发布

我第一次打开控制台的时候,看到系统管理页里有好几个服务器选项,第一反应是"一个引擎而已,怎么还搞出三套进程"。后来用熟了才理解这个拆分思路其实是整个设计的精髓。

服务器职责类比
构建服务器(build server)把项目里的资产和 TypeScript 脚本编译成浏览器可运行的 JS,保存即触发编译相当于传统引擎里的"编译器 + 资源管线"
LIVE 服务器(live server)给编辑器提供实时数据同步,同时承载局域网/本地联调运行环境相当于传统引擎里的"本地运行 + 热更新"
发布服务器(publish server)把项目构建成一个静态网站版本,方便部署到任意托管平台相当于"导出/构建发布包"

把这三件事拆开,核心原因只有一个:把编译从个人电脑搬到中央服务器。这样一来,大家的开发环境完全一致,你本地的 Node 版本、系统依赖不会影响其他人看到的结果;同时服务器实时持有权威数据,任何人的修改都会广播给所有在线客户端。设计上它就默认团队是"一群人围着同一个游戏在改",而不是"每个人各改各的,最后再合并"。

理解了这一点,后面上手会顺畅很多——你会意识到,Superpowers 里的"项目"不是一个文件夹,而是一个服务器管辖的实时共享空间。

1.3 谁适合装它,谁建议绕道

我不是劝所有人都弃 Unity 来用 Superpowers,至少应该先判断它合不合适。我的建议是这样:

  • 适合:想做网页游戏原型验证的人;喜欢 TypeScript 的开发者;想带着三五个朋友一起做小游戏、但不想折腾 Git 协作的小团队;学校或培训场景里需要多人同时上手的环境。
  • 不适合:追求 3A 级画质、重度材质管线和复杂渲染效果的项目;主要目标是 iOS/Android/Steam 原生发行的作品;需要庞大商业生态(现成插件、商店资产)的团队。

另外要提前打个预防针:这个项目已经开源免费,但维护节奏不像商业引擎那么快,更新频率不算高。它更像一个设计思路很有特色、拿来即用的工具,适合快速出原型和小型可玩作品,不适合赌上整个产品周期去依赖它追新特性。

2. 安装全流程:从 clone 到创建出第一个项目

2.1 先说版本雷区:Node.js 千万别直接上最新版

老规矩,上手之前先看环境。Superpowers 这个项目的发布时间比较早,虽然用 TypeScript 写游戏逻辑,但项目本身的依赖栈带着那个年代的特征。我自己第一次装的时候直接用当时机器上的最新版 Node.js,结果npm install阶段就卡住了,报错信息集中在 node-gyp 编译原生模块这一步。

所以我的第一条安装经验是:别用太新的 Node 版本,选一个较旧但仍可用的 LTS 版本。一般来说官方文档时期推荐的是 Node 6/8/10 这一代,在实际测试里选 Node 10 或 12 的兼容性比较稳妥。如果你的机器上已经装了多个版本,直接用nvm切换最省事:

nvm install 12 nvm use 12

Windows 用户还要额外注意一点:如果npm install过程中出现 node-gyp 编译报错,多半是因为系统里缺少 Python 或 Visual Studio Build Tools。当年不少新手都倒在这一步,其实只要装上 VS 的 C++ 构建工具再重新编译就能过。

2.2 拉取代码与安装依赖

环境准备好之后,安装流程本身并不复杂。先把项目拉下来:

git clone https://github.com/superpowers/superpowers.git cd superpowers npm install

如果网络情况不太好,npm install可能会因为下载超时而失败,这时候可以换用镜像源再试:

npm install --registry=https://registry.npmmirror.com

这一步完成后,项目根目录就会有完整的依赖和启动脚本。这里说句题外话:不同分支或版本的启动方式可能会略有一点差异,如果你启动时发现node superpowers这个命令提示找不到文件或没有对应入口,去看一眼根目录下package.json里的 scripts 字段,找到真实的启动命令即可。

2.3 启动控制台并创建项目

依赖装好之后,执行:

node superpowers

控制台会打印一串日志,提示你服务跑起来了。默认情况下,控制台地址是:

http://localhost:9800

第一次打开会要求你注册一个本地账号,这个账号是给你自己的编辑器用的,不需要联网。注册完成后进入系统管理页面,有点像服务器后台,能看到各个组件的运行状态。我的建议是先把 LIVE 服务器和构建服务器都启动起来,再创建项目——否则创建项目并打开编辑器后,首次编译会慢得让你以为卡死了。

创建一个新项目后,你会看到一个典型的"编辑器"界面,但它跑在浏览器里。主要区域就这么几块:

区域作用
资源面板管理图片、音频、脚本、场景等一切项目内容
场景面板编辑当前场景的实体层级和 3D/2D 空间布局
脚本面板编写 TypeScript 脚本,保存后触发服务器编译
属性面板查看和修改选中实体、组件的属性

看到这个界面的时候,安装这一步就算正式通关了。接下来真正有价值的部分,是理解这个编辑器背后的资产同步和多人协作机制——因为这决定了你以后怎么写脚本、怎么组织项目结构。

3. 编辑器底层逻辑:项目不是"文件夹",而是一套带同步协议的资产库

3.1 项目里到底存了什么,编辑器怎么向服务器要数据

用习惯了传统引擎的人,刚进 Superpowers 的编辑器时最容易有个错觉:以为左侧的资源面板就是本地文件系统的镜像。其实完全不是这样。

Superpowers 里的所有资产——图片、音频、脚本、场景、材质——都是由服务器统一存储和管理的,浏览器端只是实时显示服务器数据的一个"视图窗口"。当你拖动一个正方体到场景里,你的操作会转换成一条条原子的修改指令,通过 WebSocket 同步到服务器;服务器把数据落盘,再把修改广播给所有在线客户端。整个过程不需要 Git,不需要手动提交,因为所有改动已经实时中央化了。

这种架构带来的直接好处是:不会再出现"我改了但队友看不到"的问题。只要你们同时打开同一个项目,看到的就是同一份最新状态。它不是靠"保存文件 + 刷新"这种传统方式来同步的,而是靠服务器实时的状态广播。这也解释了为什么系统管理页里有 LIVE 服务器这个东西——它管的不只是"怎么运行游戏",还包括"多人编辑时数据怎么流转"。

3.2 用一次双开实验理解协作同步

我第一次完全理解这套同步机制,不是靠读文档,而是靠一个特别土的操作:打开两个浏览器窗口,登录同一个账号,打开同一个项目,然后左手和右手同时开始改。

结果很有意思。我在左边窗口把一个立方体的位置往后拖,右边窗口几乎同时看到它移动;在右边窗口把立方体改成红色,左边窗口也会立刻变色。这个体验和 Google Docs 里两个人同时打字没什么区别。更关键的是,如果两个人都去改同一个物体的同一个属性,最后以谁为准,是服务器内部的状态处理逻辑决定的,不会出现某个人刷新一下就把另一个人的改动覆盖掉的荒唐局面。

这个实验强烈建议你自己做一次,因为它会改变你对"项目文件"的认知——Superpowers 从一开始就不是为了单人单机工作流设计的,它默认的协作颗粒度就是"实时、原子、无锁定"。

3.3 从资源进入场景:实体-组件的心智模型

理解了服务器同步机制后,接下来要适应的是它场景组织方式。Superpowers 里的游戏世界由一堆"实体"(Entity)组成,每个实体可以挂上各种组件:渲染组件、光源组件、脚本行为组件等。一个 3D 立方体在场景里就是"一个实体 + 一个渲染组件 + 一个变换组件"的组合;想要它动起来,就再挂一个脚本行为组件。

新手最容易在这里犯迷糊的是:把场景结构理解成传统文件夹和子文件的关系,然后在资源面板里到处找"嵌套层级"。实际上,场景里没有那种严格的父子文件树,而是一个个对象组成的图结构。你要操作哪个物体,就选中哪个实体,然后在属性面板里改它的 position、rotation、scale,或者往它身上添加行为组件。

当你把这些概念理顺,编辑器界面就不再是一堆陌生按钮了。下一步,就是让一个东西真正动起来。

4. 第一段脚本:让物体动起来,顺便理解双端执行的"行为"

4.1 在编辑器里新建脚本,先看模板再看 API

在 Superpowers 里写游戏逻辑,用的是 TypeScript。新建脚本时,编辑器会自动生成一个模板,模板里已经包含了一个最基础的结构。大致长这样(具体 API 名称以你本机安装的版本模板为准,但骨架是通用的):

import { Behavior } from "simulator"; export class MyBehavior extends Behavior { // 编辑器模板会在这里给出生命周期方法的骨架 update() { // 每帧都会执行 } }

这段代码的核心是:你的脚本导出一个继承了Behavior的类。Behavior是 Superpowers 里"行为组件"的基类,它会在实体的生命周期里被服务器统一调度。写完之后,选中场景里的实体,在属性面板里点击添加行为,选择刚才的脚本,就完成挂载了。

这里有个特别重要的操作习惯:写完脚本一定记得保存。保存的动作不是只把文本存下来,而是会触发一次完整的服务器编译。如果代码有类型错误或者语法问题,编译错误会直接显示在脚本编辑器下方,而不是像传统引擎那样等你切回编辑器里跑一下才报错。

4.2 为什么一个脚本可以同时在"服务器"和"客户端"跑

Superpowers 里最让我觉得巧妙的设计,是一个行为脚本默认可以同时存在于服务器端和客户端。也就是说,你写一段逻辑,服务器上会跑一份,浏览器客户端上也会跑一份,属性数据由服务器持续同步到客户端。

为什么这么设计?道理其实和很多主打多人联机的商业游戏一样:游戏规则必须以服务器为权威,才能保证所有玩家看到一致的世界。比如一个物体在每秒移动 2 个单位,如果每个客户端各自算位移,那不同设备的帧率差异会马上导致位置漂移,出现"我这边看到了你,你那边看不到我"的尴尬情况。而放在服务器上跑逻辑,所有客户端拿到的是同一份权威数据;客户端这边的行为脚本则很适合处理纯表现层的东西,比如播放动画、显示 UI、本地特效。

你不需要自己写 WebSocket 协议、不需要手动网络同步,引擎帮你把这条链路封装在了行为系统里。这也是我后来觉得它特别适合小团队做联机网页游戏的核心原因——多人同步这件事的门槛被降得很低。

4.3 一个足够简单又能看出效果的例子

为了演示完整流程,我写了一个最朴素的"来回移动"脚本。注意这段代码的 API 字段名在你安装的版本里可能略有差异,动手实践时对照编辑器里的模板修正就行,核心结构是通用的:

import { Behavior } from "simulator"; export class PingPong extends Behavior { speed = 2; private _dir = 1; update() { const pos = this.entity.position; pos.x += this.speed * this._dir * this.system.deltaTime; if (pos.x > 3 || pos.x < -3) { this._dir *= -1; } } }

挂上这个脚本后,运行项目,你会看到立方体在场景里永无止境地左右移动。如果把update改成每个客户端各自执行,你会发现不同浏览器窗口里物体的位置开始出现细微偏差——这就是服务器权威模式和本地直接改属性之间的区别。亲手把两种方式都试一遍,你对"服务器逻辑和客户端逻辑分别该放什么"的理解会一下子通掉。

5. 让别人玩到你的项目:LIVE 联调与静态发布两条路

5.1 局域网内即时联调

游戏做出来总得给别人玩。Superpowers 上最简单的一步是用 LIVE 服务器做局域网联调。在系统管理页里把 LIVE 服务器启动之后,它会监听一个端口,你只需要拿到本机在局域网里的 IP,把它和端口一起发给同一个局域网里的朋友,对方浏览器打开就能直接玩。

这一步本质上和编辑器协作共用同一套同步机制——对方访问的不是一个"打包好的成品",而是服务器实时在跑的权威状态。所以联调的时候你改了代码保存,对方刷新一下就能体验最新效果,不需要折腾构建和部署。

有个坑提一下:有些路由器默认开启了 AP 隔离,导致同一 WiFi 下的设备之间互相访问不到。如果局域网联调时发现别人打不开你的地址,先去路由器后台把 AP 隔离关掉,这是最常见的原因。

5.2 发布静态版本:从"编辑器项目"到"可部署网页"

联调只是临时方案,真正想把游戏发布出去,用的是发布服务器。它会把项目构建成一套完全静态的网页资源,包括编译后的 JavaScript、HTML 和所有资产文件。

发布完成后,生成的静态资源完全可以脱离 Superpowers 服务器运行。你可以把它扔到任意支持静态文件托管的服务上,配上自定义域名和 HTTPS,就是一个正规的网页游戏了。不需要数据库,不需要额外的后台进程——这也是我特别喜欢这套设计的一点,发布流程简单到不需要专门写部署文档。

发布之后还有一个额外好处:最终运行的游戏代码已经被服务端统一编译过,和编辑器环境没有任何耦合。玩家的浏览器只是加载一个普通网页,不需要安装任何插件。

5.3 插件与规模化建议

Superpowers 本身支持插件机制,官方和社区提供了一些扩展能力,比较典型的是资源导入类插件——比如把外部 3D 模型、音频、字体导进项目。装上插件之后,资产管线的完整度会接近主流引擎。

如果你想把它用于稍微正式一点的项目,我有几个实操层面的建议:

  • 项目拆分:不要把所有东西塞进一个场景里,把一个玩法模块做成一个相对独立的场景或资产集合,多人协作时减少直接冲突。
  • 命名规范:资源和脚本统一命名,比如Character_Player、Enemy_Slime这样的前缀结构,否则项目一大,资产面板里找东西会痛苦。
  • 节约资产体积:图片和音频在导入前先压缩,Superpowers 构建时会做优化,但原始资产太大仍然会影响编译和加载速度。

6. 安装和上手阶段最容易踩的三个坑,附带我的处理方式

6.1 node-gyp 编译原生模块失败

这是安装阶段最劝退的报错。现象是npm install跑到一半,终端里冒出一堆红色报错,核心信息里能看到node-gyp、build、Failed这类词。原因基本只有一个:Node 版本太新,或者系统缺少编译工具链。

我的处理顺序是:先用nvm install 12 && nvm use 12切到旧版本,然后清理掉之前装了一半的依赖重来一遍:

rm -rf node_modules npm install

如果是 Windows,先去安装 VS Build Tools,选上"使用 C++ 的桌面开发"工作负载,再重试npm install。大多数情况下这样就能解决。

6.2 首屏白屏或一直转圈

好不容易启动成功了,结果浏览器打开localhost:9800一直白屏或者转圈圈。我遇到过一次,排查之后发现是构建服务器没有启动。系统管理页里虽然有"构建服务器"的入口,但默认状态下它并不会自动起来。

处理方式:回到系统管理页,确保 build server 和 live server 都处于运行状态,然后刷新编辑器页面。如果仍然白屏,再看启动控制台的终端日志,有没有端口被占用之类的提示。另外,第一次项目编译确实会有几秒延迟,耐心等一等,不要频繁刷新页面。

6.3 写脚本时"改了没反应"和"多人不同步"

到了写脚本阶段,最常见的两个困惑我来提前拆解掉。

第一个,"我改了脚本保存了,但场景里的物体毫无反应"。这时候先去脚本编辑器的编译错误面板看一眼——保存只是在文本层面触发编译,如果 TypeScript 类型不对、字段拼写错了,编译失败,运行中的项目当然不会应用新代码。养成保存后扫一眼错误面板的习惯,能省下大量排查时间。

第二个,"为什么两个浏览器窗口里的物体位置不一样"。这个我在前面详细讲过,根因是规则逻辑跑在客户端而不是服务器权威端。记住一个原则:影响游戏世界的规则放服务器行为,只做界面表现的代码放客户端行为。分清了这一层,多人同步的大部分问题都不存在了。


最后分享一点我个人的实际体会。Superpowers 不是那种装完就能让你做出商业级大作的引擎,它的价值在于把"协作做游戏"这个环节做到了极致:浏览器打开即可开发、保存即编译、多人实时同步、发布即静态网页。如果你只是想带几个朋友快速把一个点子变成能一起玩的网页游戏,这套东西确实有点"超能力"的意思。安装阶段最折腾的往往就是 Node 版本问题,跨过那一步,后面的路会顺畅很多。建议上手的时候先打开引擎自带的示例项目拆开看看,把里面的脚本和场景结构吃透,再动手写自己的项目——比我一开始就硬碰硬地自己搭项目要高效得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询