
最近搜“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 deniednpm 全局目录权限不足用 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 项目后续还可以往插件方向扩展也可以把导出的静态版本嵌进自己的网站里做成在线小游戏合集玩法很多关键先把项目跑起来。希望这篇文章能帮你少走一次弯路尽快做出你自己的第一个作品。