最近搜“superpowers”这个词的人突然多起来了,而且大部分一开口就是“怎么安装”。我第一次接触这个项目时也挺迷惑:它既不是某个前端库,也不是传统意义的游戏引擎安装包,而是一整套跑在浏览器里的开源游戏开发环境。本质上,你只需要在本地起一个 Node.js 服务,然后用浏览器打开编辑器页面,就能完成建项目、搭场景、写脚本、做地图、做音效、多人协作这一整套游戏开发流程。这篇文章我会把自己从零折腾到跑通第一个小游戏的完整过程拆给你看,包括安装命令、核心概念、脚本写法、内置编辑器用法,以及我踩过的那些坑。照着操作基本都能跑起来,哪怕你是第一次接触 TypeScript,也不影响上手。
1. Superpowers 是什么:先看清项目再决定装不装
1.1 一句话讲清项目定位
Superpowers 是一个开源的 Web 游戏开发平台,核心代码以 TypeScript 为主。它跟 Unity、Godot 这类传统引擎最大的区别在于:整个工作环境都跑在浏览器里,本地只跑一个 Node.js 服务端,所有工具链都在网页标签页内完成。
这个设计不是说它是“网页玩具”。场景渲染基于 WebGL,脚本系统是完整的 TypeScript 编译链,内置的地图编辑器、模型编辑器、音乐编辑器都是实打实能用的生产级工具,不是样子货。我自己做 Game Jam 类型的快速原型时经常用它,从零到能玩的小玩法,一晚上出东西是完全现实的节奏。它的数据模型也很清晰:一个项目由多个场景组成,场景里放实体,实体挂脚本行为,资源独立管理。这套结构对独立开发和小组协作都非常友好。
1.2 为什么值得选它:协作优先与零安装
选择它而不是直接用其他引擎,我主要看中两件事。
第一,实时协作。Superpowers 的项目数据统一存在服务端,任何浏览器连上同一个服务,看到的就是同一个项目的最新状态。我和朋友配合做原型时,他负责关卡布局,我负责写逻辑调参数,我们打开的是同一个场景,拖拽物体、改数值都能即时互相看到。那种感觉就像大家一起维护一份在线文档,但改的是完整游戏项目。这种体验省掉了“改完提交、拉下来看、冲突再合并”的循环,对快速迭代的价值非常明显。
第二,零客户端安装。使用方只需要一个现代浏览器,不需要装 VS Code、不需要装引擎本体、不需要手动搭构建链。对于教学场景、新手入门、团队快速验证想法,这个特性非常实用。当然它也有边界:如果你要做重度商业项目、需要发布到主流游戏商店,那它不合适,它的强项是 Web 场景和快速原型。装之前先想清楚你要干什么,工具选对比工具用得熟练更重要。
2. 安装与启动:从零到浏览器出现编辑器界面
2.1 环境前置:只有两个依赖
安装 Superpowers 只需要两个东西:Node.js 和 npm。它本质是一个 Node.js 服务端程序,通过 npm 全局安装。官方推荐用 LTS 版本,我实测下来 Node 16 和 Node 18 都能正常跑,但早期用 Node 20 遇到过某些依赖构建报错的情况,所以建议别追新,装当前 LTS 最省事。
环境检查直接敲命令:
node -v npm -v能看到版本号输出,说明 Node 环境没问题。如果你在 macOS 或 Linux 上用系统自带的 Node,后面安装时大概率会遇到权限报错,我建议直接用 nvm 管理 Node,这样全局安装目录在用户主目录下,不需要 sudo,能避开很多不必要的麻烦。Windows 用户直接从官网下载安装包,一路下一步就行。
2.2 安装与首次启动
全局安装命令很简单:
npm install -g superpowers安装完成后,执行:
superpowers start正常启动后终端会打印服务已启动的提示,默认端口是 4237,浏览器打开:
http://localhost:4237就能看到 Superpowers 的主界面了。整个安装过程通常五分钟内能完成,比装任何传统游戏引擎都快。早期版本首次启动时还会尝试连接外部账号服务器做数据同步,但后来这个中心服务关闭了,现在跑起来就是纯本地模式,不需要注册账号、不依赖外部在线服务,你的项目数据全部保存在本机服务器端。这一点对长期使用其实是个好事,少了一个单点依赖。
2.3 换端口与升级这些日常操作
端口被占用是启动时最常见的异常。如果你发现superpowers start启动失败,报错信息里出现EADDRINUSE或者类似关键词,说明 4237 已经被其他程序占了。Superpowers 启动时支持通过参数指定端口,具体参数名可以让服务端打印的帮助信息告诉你,也可以用系统自带的进程检查先找出占用端口的程序。一般个人开发机是不会有冲突的,多数情况是之前手动起过其他服务。
升级的话,直接重新执行一遍全局安装命令,npm 会覆盖到最新版本。需要提醒的是,升级前最好备份一下数据目录,后面第五节我会详细讲数据在哪、怎么备份,这一步我建议养成习惯,别等到丢数据了才后悔。
3. 创建第一个项目:场景、实体与行为脚本
3.1 新建项目与界面布局
打开http://localhost:4237后,首页会列出已有的项目,第一次进来是空的,直接新建一个项目。命名时注意用英文和数字,避免中文目录在某些工具链下出现编码问题。项目创建后会自动进入编辑器界面,界面布局大体是中间的场景视图、左侧的场景树和资源面板、右侧的属性检查器。场景视图是 3D 视角,可以用鼠标中键旋转、滚轮缩放、右键平移,操作逻辑跟主流 3D 软件很像,基本不需要额外学。
从这里开始,你先要理解它的三个核心概念:场景、实体、行为。我的理解方法是把它们类比成拍戏:场景就是舞台,实体是舞台上的演员和道具,行为是演员手中的剧本。一个实体可以挂多个行为,每个行为控制它的一部分表现。
3.2 核心概念:场景、实体与行为
- 场景(Scene):一个游戏关卡、一个菜单界面都可以是一个场景。场景是整个项目的组成单元,游戏运行时从初始场景开始加载。
- 实体(Entity):场景中的具体对象,比如一个方块、一个角色、一台摄像机。实体可以有父子层级,子实体会跟随父实体运动。
- 行为(Behavior):附着在实体上的脚本,控制实体的逻辑。一个实体上可以挂多个行为脚本,互相配合。
- 资源(Asset):脚本、贴图、地图、模型、声音等素材的统称。资源是独立于场景存在的,可以被多个实体引用。
你新建一个空场景后,需要先加一个摄像机实体,否则运行游戏时画面是黑的。这个细节我第一次用的时候忽略了,盯着黑屏困惑了半天,后来才想起来场景里根本没有摄像机。
3.3 实操:让一个方块动起来
这里我带你走一遍最经典的“移动方块”案例,把这个跑通了,你对整个工作流就有体感了。
先在资源面板新建一个脚本资源,命名成PlayerBehavior.ts,然后双击打开代码编辑器,输入下面的内容:
class PlayerBehavior extends Sup.Behavior { speed = 0.06; update() { this.actor.moveRight(this.speed * Sup.Game.getDeltaTime()); } } Sup.registerBehavior(PlayerBehavior);这段脚本的逻辑是:每一帧让实体沿自身右侧方向移动一段距离。this.speed是一个公开属性,后面在属性检查器里可以直接调。Sup.Game.getDeltaTime()返回上一帧到现在经过的时间(毫秒),用它乘以速度,可以让移动速度不因帧率不同而变化。这就是为什么速度参数要乘 deltaTime 的关键原因:帧率越高,每帧间隔越短,如果不乘时间,高帧率下物体会跑得明显更快,游戏速度就不稳定。
写完脚本后,在场景里创建一个立方体实体,然后把PlayerBehavior脚本拖到立方体上。再在场景里加上摄像机,摆好位置对着立方体。点击运行预览,立方体应该会沿固定方向持续移动。这一步跑通了,你就已经把 Superpowers 从“装好了”推进到了“能用了”,剩下的都是在这套流程上做丰富。
4. 核心功能实战:脚本细节、内置编辑器和多人协作
4.1 脚本系统的几个关键点
Superpowers 的脚本系统基于 TypeScript,写起来并不复杂,但有几个点需要理解到位。
生命周期方法常用的有两个:start()在实体被加载时执行一次,update()每帧执行。两者都是挂在继承Sup.Behavior的类里面。类里面声明的公开字段会自动暴露到右侧属性检查器,也就是说你可以在编辑器里拖一个属性滑块,实时调速度、调血量、调颜色,不用每改一个参数就翻代码。这个设计对调参特别友好,我调手感基本都是开着的编辑器一边跑一边拖参数,数值实时生效。
实体之间的通信有一种实用方式:用this.actor.sendMessage("方法名", 参数)给实体上挂的其他行为发消息,接收方在行为里定义同名方法即可。这比直接拿引用互相调要解耦得多。比如玩家碰到敌人血包时,发送一个 "heal" 消息,血包行为里定义heal(amount) { this.hp += amount; },玩家行为完全不需要知道血包内部怎么实现的。这种消息机制是小型游戏里组织逻辑的好手段。
4.2 内置编辑器:地图、模型与音乐
Superpowers 最强的地方之一,是它内置了地图、模型和音乐三类编辑器,省掉了在外部工具和引擎之间来回导资源的流程。
地图编辑器用来做 tilemap 关卡,你导入一个 Tileset 贴图后,可以直接在编辑器里像画画一样铺地面、摆墙壁,刷子、橡皮、选择工具都齐全,做 2D 平台关卡非常顺手。模型编辑器更适合做 3D 用途,它允许你像捏橡皮泥一样逐个像素块地搭出实体模型,做 Low Poly 风格的小道具完全够用。音乐编辑器支持混音台式的编排,能直接写出 chiptune 风格的背景音乐,每个音符、乐器轨道、音量包络都可以手动调。
用这些内置编辑器的好处是:资源始终呆在同一个项目里,不存在外部文件丢失、路径断链的问题。我的建议是把项目内的资源按类型建文件夹分流,scripts、maps、models、sounds各归各位,命名统一用 snake_case。这些小习惯前期不觉得,项目做到后面文件多了,能救你不少时间。
4.3 编辑过程保存与多人协作
编辑器的保存是手动触发的,我强烈建议养成频繁按保存快捷键的习惯,浏览器崩溃或者误关标签页的时候,没保存的改动就会丢。这个项目没有传统意义上的自动保存,一切以服务端数据为准,修改后记得保存。
多人协作的使用方式非常直接:其他人在自己电脑上启动 Superpowers,连接到同一台服务器,然后在项目列表里打开同一个项目。因为项目状态在服务端,大家看到的是同一份场景,改动实时同步。需要注意的只是沟通成本:如果两个人同时在同一个场景里拖同一个实体,操作确实会互相干扰。我们的做法是分工明确,一个人管关卡布局,一个人管脚本和参数,各自操作不同实体,互不打架。
4.4 构建导出与 Web 分发
项目做完后,Superpowers 支持构建导出为静态 HTML5 页面。构建产物是一整套纯静态文件,包括入口页面、脚本打包结果和资源文件,你可以直接扔到任意静态网站托管服务上运行。这里有个细节:构建前记得先在浏览器里跑一遍预览,确认初始场景设置正确,导出后打开的页面才会符合预期。构建产物里不要放本地绝对路径的资源,全部走相对路径,否则换到其他目录或托管平台会出现加载失败。
5. 常见问题与排查技巧实录
5.1 安装阶段的典型报错
| 现象 | 原因 | 处理方法 |
|---|---|---|
EACCES: permission denied | npm 全局目录权限不足 | 用 nvm 重装 Node;或修改 npm 全局目录到用户目录 |
| 端口被占用启动失败 | 4237 被其他进程占用 | 结束占用进程,或给启动命令指定其他端口 |
| npm 安装卡住或超时 | 默认源下载慢 | 配置 npm 镜像源后重新执行安装 |
| Node 版本过高导致依赖构建失败 | 依赖兼容问题 | 切换到 Node LTS 版本 |
| 浏览器打开后一片黑 | WebGL 未启用 | 在浏览器设置中开启硬件加速,重启浏览器 |
第一行那个权限问题最容易劝退 Linux/macOS 新人。如果用了 sudo 装 npm 包,全局目录的归属就变得很混乱,之后每次升级都要 sudo,非常别扭。我的建议是趁早用 nvm,用户目录下的全局安装不需要任何提权操作。
5.2 运行阶段的坑
运行时常见的问题集中在浏览器兼容性上。日常开发建议用 Chrome,实测兼容性最稳。Safari 偶尔会出现 WebGL 相关渲染异常,Firefox 整体可用,但某些内置编辑器组件的交互在非 Chromium 内核下会有小瑕疵。如果场景内容较多、实体数量大,预览的帧率会明显下降,这时候先检查是不是场景里堆了过多的高精度模型,再做减法优化,不要一上来就怀疑引擎性能。
中文相关的问题也要注意。脚本注释和字符串里写中文正常没问题,但项目命名、资源文件名尽量避免中文,某些构建环节对非 ASCII 路径处理不完善,容易出现找不到资源的诡异错误。另外就是保存习惯,做了一段时间内容却不保存,然后浏览器标签页被误关,改动全没的情况,我周围不止一个人遇到过,血泪教训。
5.3 数据备份与迁移
Superpowers 的数据都存本地,找到数据目录是备份的关键。不同系统下位置略有差异,一般在用户主目录下会有一个隐藏的数据目录,里面按项目存放场景、资源和脚本文件。备份就很简单:关掉服务,把整个数据目录压缩复制一份到别处。恢复时把备份放回原位置再启动服务即可。跨机器迁移也可以用这个方式,把目录整个搬过去,启动后项目列表里就能看到原有项目。
我在实际操作中发现,新版本运行时不依赖外部在线服务,这点对长期使用帮助很大,意味着只要你自己本机的数据和程序还在,任何时候打开都能继续干活,不存在“官方服务关了项目就废了”的问题。加上上面说的备份习惯,基本可以放心投入实际项目。
5.4 最后再分享一个小技巧
如果你准备和同伴协作,又不想让所有人都直接访问你这台机器的端口,更稳的做法是你们各自维护一份项目副本,做完阶段性成果后用数据目录整体同步一次。这种方式虽然不如实时协作流畅,但适合网络环境不稳定、或者你们不在同一内网的情况。根据我的经验,小型两人团队用这种方式,配合明确的模块划分,效率反而很高,因为大家互不干扰,也没有“拖同一个实体”的尴尬。
我自己现在常用的组合是:Chrome 开编辑器 + LTS 版 Node 跑服务 + 本地备份脚本在数据目录上做一个定时快照。这套组合用了很久都没出过乱子。Superpowers 项目后续还可以往插件方向扩展,也可以把导出的静态版本嵌进自己的网站里做成在线小游戏合集,玩法很多,关键先把项目跑起来。希望这篇文章能帮你少走一次弯路,尽快做出你自己的第一个作品。