☰
Superpowers:开源实时协作的2D网页游戏开发环境
2026/10/29 13:44:42 网站建设 项目流程

最近折腾游戏开发工具,被安利了一款叫 Superpowers 的开源开发环境。说实话,一开始我对这种"小而美"的编辑器是持怀疑态度的,但实际装完、跑通一个 2D 小项目之后,我反而有点上头了——它把"实时协作"和"游戏编辑"做到了一款开源工具里,对于小团队做 Web 游戏、快速原型,体验相当特别。如果你搜"superpowers"是因为刷到了某款同名 Steam 策略游戏,那可能跑错片场了;这篇文章说的是开源游戏开发环境 Superpowers,它自带场景编辑器、脚本系统和多人协作能力,适合想低成本做 2D 网页游戏、或者给团队找一个"打开浏览器就能一起改项目"的工作流的人。

下面我把完整的下载安装、项目创建、脚本开发、协作实践和踩坑记录都整理一遍,直接照着抄就行。

1. 初见 Superpowers:一个把协作写进骨子里的开发环境

1.1 它到底是个什么东西

Superpowers 是 Floriant 基于 TypeScript、Electron 开发的开源项目,核心目标是让游戏开发像 Google Docs 一样实时协同。它不是一个"纯编辑器",而是把三样东西打包在了一起:

  • 服务器:启动后在本机跑一个服务,团队成员通过浏览器访问同一个 IP 和端口就能加入项目;
  • 客户端:基于浏览器的编辑器界面,包含文件树、场景视图、脚本编辑器、资源管理器;
  • 场景运行时:编辑完直接按运行按钮,就能在当前项目里预览游戏效果。

所以你不用像传统引擎那样先创建工程、再导入一堆 SDK。装好之后,启动服务、新建项目、拖个方块、写段脚本,一条龙全在一个窗口里完成。

我第一次打开它的感觉是:界面比 Unity 干净,比纯代码方式直观,脚本编辑器还是 Monaco(也就是 VS Code 那个内核),写代码的体验很熟悉。而且它的"协作"不是后加的插件,是原生能力——这意味着你不需要额外配置协同插件,改起场景来比某些商业引擎的联机方案还顺手。

1.2 和主流的对比:为什么我会选它

我常被问"你为什么不直接用 Unity 或者 Cocos"。说实话,如果你的目标是手游、复杂 3D 或者深度定制渲染管线,那 Superpowers 确实不是对手。但如果目标范围是 2D 网页游戏、教学演示、小团队快速迭代,它有几个优势是主流引擎给不了的:

  • 零安装客户端:团队成员只要浏览器能访问你的服务地址,不需要装引擎、不需要配环境;
  • 实时同步:两个人同时改同一个场景或脚本时,能看到对方的操作,几乎不用处理冲突;
  • 轻度代码:行为脚本基于 TypeScript,但语法比引擎的组件系统更简单,新手半天就能上手;
  • 导出即网页:发布出来的项目就是静态 HTML5,随便丢到任意静态托管就能跑。

我整理了一张对比表,方便你判断:

维度SuperpowersUnityCocos Creator
安装复杂度低(解压/克隆后 npm install)中(几十 GB 安装包)中
实时协作原生支持需借助第三方需付费服务
2D 网页游戏很顺手中等强
3D 能力弱强中等
学习曲线平缓陡中等
开源程度完全开源非全开源部分开源

1.3 哪些人适合,哪些人不适合

我用它做了一个 48 小时的小游戏原型之后,基本可以给出一个诚实的定位:

适合:

  • 想快速验证玩法的个人开发者;
  • 游戏开发课程/工作坊,需要让学生短时间内跑通一个可玩游戏;
  • 小团队做 2D 项目,且希望"改代码、改场景、看结果"在同一套浏览器环境里完成;
  • 喜欢 TypeScript、不想被大型编辑器重代理的人。

不适合:

  • 重度 3D 项目(它支持 3D 模型,但生态和工具链远不如成熟引擎);
  • 需要大量第三方插件/美术资源导入的团队;
  • 追求极致性能、要做原生打包的移动端/桌面端产品。

想清楚这一层,后面装起来就不会有落差。很多人安装 Superpowers 之后觉得"怎么这么简陋",多半是把它和商业引擎搞混了。

2. 动手安装前,先理清这套工具的运行逻辑

2.1 核心架构:服务器、客户端、浏览器三者的关系

听名字你可能猜不到,Superpowers 并不是你下载一个 App 然后离线用的工具。它提倡的工作方式是:

  1. 某台电脑(或者服务器)运行 Superpowers 服务端;
  2. 所有开发者(包括本机)通过浏览器访问同一个地址;
  3. 大家看到的是同一个项目列表,进去后实时协作。

这种架构的优点是团队协作几乎不需要额外配置,缺点是项目数据始终集中在那台运行服务的机器上。所以你如果是在自己的笔记本上跑服务,关电脑前最好确认代码已经导出或者备份到 Git 仓库,否则队友就访问不了了。

如果你只想自己一个人用,体验也完全没问题:本地启动服务、浏览器打开 localhost 端口,就当成一个本地 IDE 来用。桌面版客户端本质上就是把服务端和一个内置浏览器窗口打包在一起,让你不用手动开浏览器罢了。

2.2 环境准备:先确认 Node.js 和 npm

Superpowers 是用 Node.js 写的,所以无论走哪条安装路线,第一步都是准备 Node 环境。

我的建议是装一个Node.js LTS 版本,一般是 14 到 18 都可以。实际踩坑经验:太新的 Node(比如 19/20 早期版本)在这款老项目上偶尔会报一些原生依赖编译问题,反而 LTS 更稳。装好之后打开终端跑一下:

node -v npm -v

能看到版本号就说明环境没问题。Windows 用户记得把 Node 官方安装包一路 next 就行,装完会自动把 npm 加进 PATH。macOS 用户如果之前装过隔代版本,建议干净卸载再装,避免残留权限问题。

2.3 两条安装路线:下载桌面版 vs 源码启动

Superpowers 是开源的,官方提供两种使用方式,我建议你至少先看一遍这条对比再选:

安装方式优点缺点
官方桌面版(Windows/macOS/Linux)解压即用,不用碰命令行版本更新滞后,不便于二次开发
Git 克隆源码 + npm install永远能跟上游最新版,能改服务端逻辑首次安装依赖较久,可能需要翻看报错

如果不是开发者,直接下载桌面版是最省心的。解压之后运行 Superpowers 可执行文件,服务就起来了。

如果你想从源码跑(我很推荐,毕竟能感受下整个项目结构),命令也简单:

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

npm install 这一步会花几分钟,依赖比较多。装完之后 npm start,终端会看到提示,告诉你访问地址通常长这样:

http://localhost:8080

用浏览器打开这个地址,就能进入 Superpowers 的主界面。第一次进入会让你配置一个管理员账号,填完邮箱(注意只是用来识别,不是必须真实)和密码,就能正式使用了。

2.4 启动后的第一件事:创建管理员账号

别小看这一步,很多人第一次打开会找不到入口。主界面是一个项目列表,右上角有一个"新建项目"或者类似的按钮。点击后输入项目名称,选择模板(后面专门讲模板),然后进入编辑器。

如果你是在局域网中给队友分享,访问地址不能填 localhost,要用运行服务那台机器的局域网 IP。Windows 上可以用ipconfig查,macOS/Linux 用ifconfig或ip addr查。查到的形如192.168.x.x就是局域网地址,队友浏览器访问http://192.168.x.x:8080就能加入。我第一次在 windows 防火墙没放行,队友死活访问不了,最后在防火墙入站规则里放行 Node.js 才解决,这个坑后面详细说。

3. 从零创建你的第一个项目:场景、资源与脚本

3.1 新建项目与模板选择

Superpowers 提供多个项目模板,最常见的是2D 项目。如果你打开发现模板列表里有2D、3D、Blank之类的选项,不用纠结,做网页小游戏选 2D 就能直接跑。

新建项目后,界面大概分成三块:

  • 左上:项目资产面板,所有的图片、音频、场景、脚本都在这里;
  • 中间:场景视图/预览视图,场景编辑器的主要工作区;
  • 右下(或右侧):属性面板和脚本编辑器,选中对象后能在这里改参数、写代码。

这种布局和不少编辑器类似,但有个重要的概念差异:场景里的一切都是 Actor(对象)。Actor 可以挂各种组件(比如 SpriteRenderer 显示图片),也可以挂行为脚本。理解这个之后,整个工作流就顺了。

3.2 场景编辑器基础操作:添加对象、变换与父子层级

在场景视图里右键,一般可以创建 Actor,比如Create Actor或者New Object。新建出来的 Actor 默认是空的,在属性面板里可以给它添加组件。

拿一个最简单的需求举例:让一个方块从屏幕左边移动到右边。步骤是:

  1. 在资产面板里导入一张方块图片(PNG 或 JPG 直接拖进去);
  2. 场景中新建 Actor,给 Actor 添加 Sprite(精灵渲染)组件;
  3. 把图片资产拖到 Sprite 组件的贴图属性上。

此时场景视图里应该能看到方块。选中 Actor,属性面板里会显示它的位置(Position)、旋转(Rotation)、缩放(Scale)。直接改数字就能移动它,也可以在场景视图里用鼠标拖动。

层级关系也很直观:可以把一个 Actor 拖到另一个 Actor 下面,成为子对象。子对象会跟着父对象一起移动,这个在做角色和挂点的时候很常用。比如做一个角色,身体是父 Actor,手臂是子 Actor,你只需要改父 Actor 的位置,手臂就自动跟着走。

3.3 第一个行为脚本:Sup.Behavior 与生命周期

场景里的对象要动起来,就需要脚本。在资产面板里右键,选择新建脚本,文件扩展名通常是.script。双击新建的脚本,右侧就会出现 Monaco 编辑器。

Superpowers 的行为脚本继承Sup.Behavior,核心方法是awake和update:

class Mover extends Sup.Behavior { speed: number = 2; awake() { // 对象初始化时调用一次 Sup.log("Mover awake"); } update() { // 每一帧更新时调用 this.actor.move(speed * Sup.Game.getDeltaSeconds(), 0); } } Sup.registerBehavior(Mover);

把脚本拖到一个 Actor 上(或者选中 Actor 后在组件列表里添加行为脚本),项目运行时,这个 Actor 就会按照脚本逻辑移动。

这里必须解释几个关键概念,避免你一开始就懵:

  • this.actor:脚本挂在哪个 Actor 上,this.actor就是那个 Actor 的引用;
  • Sup.Game.getDeltaSeconds():返回上一帧到当前帧的时间差(秒),用它来乘移动速度,可以让运动速度不受帧率影响;
  • Sup.registerBehavior:把类注册为可用的行为,写错了脚本会编译失败,场景里对应的对象可能不会执行任何逻辑。

等你保存脚本(Ctrl+S),编辑器的控制台会进行 TypeScript 编译。如果语法有错误,控制台会报红字,场景里的行为不会生效。这个"编译驱动型"的设计很有用,它逼着你保证脚本是类型安全、语法正确的。

3.4 测试与预览:空格键就能看到结果

脚本保存之后,怎么查看效果?编辑器顶部有个运行/预览按钮,或者直接在键盘上按空格键。按下之后,Superpowers 会启动当前场景,你就会看到游戏画面。这个预览模式支持调试,比如查看对象位置、打印日志。

另一个非常实用的功能是Sup.log。它在浏览器控制台里输出,而编辑器下方正好有一个控制台面板。你可以在脚本里插入大量Sup.log来观察执行流程,这比闷头改代码高效得多。

我第一次跑通一个移动方块时,最大的感受是:从"新建项目"到"看到一个方块在移动"差不多只花了十分钟。作为编辑器新手,这个上手速度是相当友好的。

4. 多人实时协作的正确打开方式

4.1 协作原理:服务器共享与实时同步

Superpowers 的协作机制不是简单的"传文件",而是所有客户端连接同一台服务器,操作以增量的方式同步给其他客户端。简单来说:

  • 每个人在编辑器里做的修改(改场景、写代码、拖资源)会实时广播给其他在线用户;
  • 其他人不用刷新页面就能看到改动;
  • 如果两个人同时编辑同一个文档,界面会出现对方的光标和当前输入状态。

这种模式最大的好处是沟通成本低。以前用 Git 分支协作,改场景简直是灾难,合并冲突能让人崩溃。Superpowers 里,美术和程序可以同时工作,程序写脚本的同时美术在拖场景,互不干扰。当然,物理上同时改同一个对象还是有极小概率互相覆盖,所以更需要养成"做完一段及时保存"的习惯,但总体体验已经比传统流程顺畅太多。

4.2 局域网协作实践:从零到多人加入

要在局域网里协作,步骤很简单:

  1. 服务端那台电脑保持npm start(或桌面版)运行;
  2. 查一下这台电脑的局域网 IP;
  3. 其他团队的电脑打开浏览器,访问http://局域网IP:8080;
  4. 第一次打开会要求创建本地用户或登录管理员账号;
  5. 在项目列表里选择同一个项目,进去开始协作。

注意一个细节:如果服务端电脑的防火墙开了,外部访问会被挡下来。Windows 用户需要到"控制面板 -> Windows Defender 防火墙 -> 允许应用通过防火墙",把 Node.js 或桌面版程序勾上"专用"和"公用"网络。macOS 用户一般会直接弹窗问是否允许接收连接,点允许即可。这个操作在 Linux 服务器上就是配置防火墙开放端口。

我当时帮队友排查"打不开界面"的问题,发现十有八九是防火墙。先确认能不能 ping 通、再确认端口是否在监听,基本两步就能定位:

# 查看端口是否监听 netstat -an | grep 8080

如果服务端本机能访问 localhost:8080,其他机器却不行,九成是防火墙,别犹豫,直接去放行。

4.3 合作边界:项目和文件怎么分工

实时协作不意味着不需要分工。我实践下来,有几个原则能明显减少冲突:

  • 大场景拆分:尽量把游戏拆成多个场景(主菜单、关卡1、关卡2),一个人负责一个场景,不要都挤在同一个场景里编辑;
  • 资产命名规范:所有的图片、音频、脚本都用统一的命名前缀,比如player_、enemy_、ui_。屏幕上同时出现几十个文件和图片,没有规范真的很痛苦;
  • 脚本和场景分离:一个人写脚本,另一个人负责把脚本挂到场景里。脚本接口先说清楚(比如约定好公开的属性名),挂接的时候就不会一头雾水。

我还习惯在项目里放一个README.script或者文档资产,写上各种约定。Superpowers 具有实时的编辑器内注释,把约定写进去,团队每个人打开项目就能看到。

4.4 版本管理:内置备份与外部 Git 同步

如果多人协作出错,怎么回滚?Superpowers 本身设计得比较轻,它的项目数据存放在服务端的projects/项目名目录下,敏感操作前最好手动做备份。

实际维护中,我推荐两个做法:

  • 定期导出/导入:在项目设置里导出项目为一个压缩包,出问题就重新导入。适合小项目,快捷粗暴;
  • 把项目目录纳入 Git:服务端的项目目录本质上是普通文件,你可以把它做成一个 Git 仓库。每次改动后由服务端管理员提交一次,相当于外部版本控制。

有人可能会问,既然实时协作这么强,还要 Git 干嘛?答案是:实时协作管的是"当下",Git 管的是"历史"。两个人同时改飞了,实时同步是很难帮你找回三天前的正确版本,但 Git 可以。别偷懒,历史回滚永远是保命底线。

5. 脚本开发进阶与 API 避坑

5.1 核心 API:Sup.Actor、Sup.Math 和场景切换

一旦你开始写稍微复杂一点的玩法,就会频繁用到Sup全局命名空间。我挑几个最常用的讲:

  • Sup.Actor(实际上是this.actor涉及的方法):每个 Actor 都有move、setPosition、getPosition、setEulerAngles、getEulerAngles等变换操作。this.actor.move(x, y)是相对移动,setPosition(x, y)是绝对设置。2D 项目里如果你用正交相机,就直接用x、y即可。
  • Sup.Math.random():返回 0 到 1 的随机数,做随机位置、随机掉落非常方便。
  • Sup.loadScene("场景名"):切换场景。做菜单、关卡切换、失败重开,都会用到。
  • Sup.Audio.playSound("音频资产名"):播放音频。
  • Sup.Input.isKeyDown("LEFT"):判断按键是否被按下。键名通常是大写的:LEFT、RIGHT、UP、DOWN、SPACE、字母如"A"。

举个例子,一个简单的键盘控制角色移动脚本:

class PlayerController extends Sup.Behavior { speed: number = 3; update() { let moveX = 0; let moveY = 0; if (Sup.Input.isKeyDown("LEFT")) moveX -= 1; if (Sup.Input.isKeyDown("RIGHT")) moveX += 1; if (Sup.Input.isKeyDown("UP")) moveY += 1; if (Sup.Input.isKeyDown("DOWN")) moveY -= 1; if (moveX !== 0 || moveY !== 0) { this.actor.move(moveX * this.speed * Sup.Game.getDeltaSeconds(), moveY * this.speed * Sup.Game.getDeltaSeconds()); } } } Sup.registerBehavior(PlayerController);

这样的脚本你几乎可以复制到任何项目里改改就能用。注意move的第二个参数在 3D 项目里可能对应y轴还是z轴,2D 项目没这个问题,但如果你建了 3D 模板,就要留意坐标轴含义。

5.2 生命周期方法的真实执行顺序:awake 和 start

Superpowers 的脚本生命周期有两个常见方法:awake和start。很多人以为start在awake之后、第一次update之前调用,但实际上新版本更强调的是awake只有一次、onEnable和onDisable会在激活状态变化时触发。

具体踩坑点:如果脚本里引用另一个对象,但那个对象是在awake阶段才设置的,你直接在自己的awake里取对方就可能拿到空引用。更稳妥的做法是:脚本之间尽量通过明确公开的属性传递引用,比如设计一个targetName: string属性,在awake里通过Sup.getScene()查找目标 Actor。

另一个容易犯的错是在 awake 里播放音频或动画。场景加载的早期阶段,资源可能还没完全就绪,播放指令会被吞掉。如果你真的需要在加载后立刻播音频,可以加一个短暂的延时或者放到update的第一次执行时再处理。

5.3 常见报错与排查思路

写脚本必然遇到报错,把我遇到的典型问题列出来给你参考:

报错 / 现象原因解决办法
脚本保存后场景里行为不生效脚本编译失败,控制台有红字错误打开脚本查看具体行号,固定语法/类型错误
Sup.log没有输出脚本没挂在任何 Actor 上把脚本拖到场景中的 Actor 上
引用资产找不到资产被改名,脚本里还是旧名检查资产面板,更新脚本里的字符串
场景切换后控制失灵新场景里没有对应的 Actor/脚本到目标场景检查脚本挂接和属性配置
预览时画面黑屏相机未设置或朝向问题新建 Actor 并添加 Camera 组件,确保它在场景里

最开始写脚本时,我总觉得报错是编辑器的问题,后来才发现九成都是自己的类型没写对。Superpowers 的报错信息其实挺明确,会直接指出第几行有问题。耐心看一行行报错,比瞎猜有效得多。

5.4 性能与发布注意事项

项目做完,下一步是发布。Superpowers 的发布流程很简单:在项目设置里导出构建,生成一个静态网页目录,上传到你喜欢的静态托管平台就能玩。

不过有几个性能问题,我建议在开发阶段就注意:

  • 图片尺寸别硬塞原图:图片在浏览器里是按资源实际尺寸加载的,一张 2048x2048 的 PNG 会拖慢加载。发布前用工具把图片压缩到实际需要的分辨率;
  • 音频格式:优先使用 Web 友好的格式(比如 ogg/mp3),别直接塞无损 WAV,尤其是背景音乐;
  • 场景数量:一个场景里塞几百个 Actor 虽然能跑,但移动设备可能会吃力。尽量把场景拆开,需要时再用Sup.loadScene加载。

这些规则在任何 Web 游戏引擎里都适用,Superpowers 只是没有帮你自动优化而已。

6. 一段时间用下来的心得和真实建议

6.1 最让我上头的几个细节

用了一段时间,有几个细节是让我更新认知的:

第一,场景里的修改是即时持久化的。在传统编辑器里,忘了保存导致几个小时白干是常有的事。而在 Superpowers 里,你在场景视图里拖一下方块,这个改动基本立刻写到项目里。配合浏览器的自动保存机制,丢工作的概率低了很多。

第二,内建"预览 + 运行"一致性很好。编辑器里看到的场景、浏览器里预览出来的画面,几乎是一致的,不会出现"编辑器显示正常、导出后颜色全变"的糟心事。因为渲染都是在浏览器里做的,导出的是同一套 Web 渲染逻辑。

第三,脚本编辑器的代码补全很够用。虽然不是全宇宙最强,但对于Sup.*API 的自动补全,已经大幅降低查文档频率。写多了你会发现,Superpowers 的 API 面很窄但够用,反而减少了选择困难。

6.2 它的短板:生态、文档和 3D

我也要诚实地泼点冷水:Superpowers 的生态确实不算繁荣。官方文档存在但篇幅有限,社区资源也比不上大厂引擎。所以如果你的项目需要大量现成插件、商店资源、特效模板,Superpowers 会让你失望。

另外,3D 支持基本属于"能放模型、能旋转、能加点灯光"的水平,复杂材质、骨骼动画、物理系统都很原始。不要试图用 Superpowers 做一个次世代 3D 游戏,那是在为难自己。它的主场始终是 2D。

6.3 我推荐的日常使用姿势:外部编辑器 + 模板项目

如果你和我一样,习惯了 VS Code 的快捷键和扩展,可以试试这样的混合工作流:

  • 用 Superpowers 内置编辑器处理场景、资源、挂脚本、预览;
  • 遇到大段逻辑时,可以先用外部编辑器写好代码片段,再粘贴进内置编辑器。因为 Superpowers 的脚本是项目内资产,理论上可以直接改文件,但直接改源码文件夹里的脚本文件容易触发重新导入,我还是建议在编辑器内粘贴;
  • 把常用脚本(玩家控制、敌人移动、碰撞处理、UI 提示)存成一个"模板素材库"项目,每次新开项目直接导入复用,省去重复造轮子。

此外,团队开发时,我强烈推荐做一个"引导项目":把团队约定、脚本命名规范、常用 API 示例、美术资源格式要求全部放到一个项目里。新成员进来,打开这个项目看一遍,比看文档快十倍。

6.4 如果你想入坑,下一步从这里开始

如果你准备认真尝试 Superpowers,我建议按这个顺序走:

  1. 先用桌面版或者源码方式把它跑起来,5 分钟建立一个空项目;
  2. 打开官方示例项目,仔细看它的场景层级和脚本写法,特别是.script文件的生命周期;
  3. 把官方教程里的案例(通常是角色移动、射击、碰撞)逐个手敲一遍,不要只复制粘贴;
  4. 自己实现一个小玩法:比如"控制一个小方块躲避掉落的障碍物",体会完整闭环;
  5. 找一位朋友加入你的 TCP 端口,体验一次多人实时修改同一个场景的感受。

等这一步做完,你基本就算入门了。再往后,你就可以按照团队需求去探索更深层的 API,比如自定义组件、数据资产、多人状态同步等。这个过程比看十倍文档都有效。

我个人折腾下来最大的体会是:Superpowers 的价值不在于它能做多炫酷的东西,而在于它把"团队协作"这件事的门槛降到了极低,让做游戏变成了一种可以实时互动的集体创作。如果你正卡在"想法很多、团队协作成本太高"的困境里,这可能是你值得花一个下午试一下的工具。

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

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

立即咨询