1. Superpowers 到底是什么,为什么值得折腾
如果你一直混迹于各类开源项目列表,大概率见过这个名字:Superpowers。它不是一个玄乎的“超能力”概念,也不是某个效率工具套件,而是一个基于 Web 的开源协作式游戏开发平台。你可以直接在浏览器里创建 2D 游戏项目,写 TypeScript 脚本,拖拽场景对象,还能像多人协作文档一样,和队友一起实时编辑同一个游戏工程。
我第一次接触它是在某个 Game Jam 的推荐工具清单里。当时我正在找一种能拉上两个朋友一起做小游戏、又不用安装大型引擎的方案。Unity 太重,Godot 虽然轻量但协作起来还是需要 Git 流程,LÖVE 更是只适合硬核玩家。Superpowers 的最核心卖点刚好切中这个痛点:服务端跑起来之后,所有参与者直接通过浏览器进入同一个项目空间,改动即时同步。
这个项目本身是一个完全开源、基于 TypeScript 构建的完整 IDE。注意,它不是你给游戏引擎写插件,也不是某种运行时库,而是一整套包含编辑器、脚本系统、素材管理、服务器架构的解决方案。你把 Superpowers 跑起来,它就是一个“带界面的、支持多人实时编辑的游戏开发工作台”。官方把它定位为“面向游戏学习的协作平台”,所以说人话就是:一边学编程,一边做一个真正能玩的 2D 游戏,队友还能实时看到你改了什么。
它的技术底层其实也不复杂:Node.js 负责启动服务,浏览器端通过 WebSocket 与服务器通信,脚本语言是 TypeScript,渲染基于 Canvas/WebGL。之所以看起来轻巧,是因为编辑器本身就是一个单页 Web 应用,资源文件和场景数据结构都放在服务器本地目录里,由 SQLite 管理元数据。这种架构带来的好处是:只要你能开一个浏览器,就能进入开发环境。
什么人适合用 Superpowers?我个人觉得三类人收获最大:
- 正在学编程的中学生、大学生,想用可视化的方式理解对象、行为、循环这些概念;
- 想快速做游戏原型、验证玩法创意的独立开发者,比传统引擎更灵活;
- 小团队在 Game Jam 或教学场景下,希望所有人围绕同一个工程协作,避免合代码的痛苦。
如果你已经熟悉了 Unity 的操作习惯,第一次打开 Superpowers 可能会觉得简陋。但反过来想,Unity 那种几百 MB 的编辑器、漫长的导入流程,对于一个小项目来说完全是大炮打蚊子。而 Superpowers 从克隆仓库到开始写第一个游戏逻辑,五分钟内就可以完成。这种“随时开始、随时扔掉”的轻松感,在实际开发里其实非常宝贵。
2. 安装前必须搞清楚的几个问题
2.1 它到底是什么形态的项目
很多新人第一次看到 Superpowers 会犯迷糊:它是一个网站吗?我需要注册账号吗?它是不是一个软件,装完之后像个普通 IDE 一样双击打开?
答案是:它是一个需要自己部署的服务端应用。
Superpowers 的官方仓库提供了完整的服务器代码。你将它下载到本地,安装 Node.js 依赖,启动之后,本机就会跑起一个 Web 服务。这个时候你在浏览器里访问localhost:8080,就能看到 Superpowers 的界面。它不依赖任何云端账号,也不强制你连接外网。所有数据默认保存在本地服务器的文件系统内。
所以这里先纠正一个认知:Superpowers 和“在线云平台”不一样。它的协作能力是建立在“你自己有一台服务器”的前提下的。“本地跑同一个服务,别人通过局域网或公网访问这台服务器”,这才是它的协作模式。用个人电脑当服务器当然也行,只要你能让同伴连到你这台电脑上。
正因为是这样一种“自托管”架构,安装方式其实和部署一个普通的 Node.js Web 应用基本相同。你不需要会 Docker,不需要懂 Linux 服务器运维,只要熟悉基本的命令行操作就能搞定。
2.2 对操作系统和网络环境的要求
Superpowers 官方支持三大主流桌面操作系统:Windows、macOS、Linux。它本质上是一个 Node.js 服务器加一个现代浏览器前端,所以在系统层面没有太多特殊依赖。需要留意下面几点:
- Windows 用户建议直接用官方 Node 安装包,不要依赖某些包管理器里的旧版本;
- macOS 用户如果遇到
node-gyp之类的编译报错,多半是缺少 Xcode Command Line Tools,执行xcode-select --install即可; - Linux 用户建议选择 Ubuntu/Debian 系发行版,依赖比较齐全;如果是最小化安装,记得补上
build-essential。
浏览器方面,Chrome 或 Edge 最稳妥,Firefox 也能跑,但某些 WebSocket 连接的容错处理会有细微差异。为了避免排查死角,我个人强烈建议你第一步就用 Chrome 做主力浏览器。
还有一点很容易被忽略:Superpowers 的服务默认绑定的是0.0.0.0,这意味着它会监听本机所有网络接口。如果你直接把服务启在一台有公网 IP 的云服务器上,没有设置任何访问控制的话,任何人拿到你的地址都能访问你的项目空间。首次运行会要求你创建一个本地管理员用户,但项目本身默认没有任何 SSL/认证层,所以公网部署前一定要想清楚。内网环境或者 localhost 自己玩,就不用担心这个问题。
2.3 版本选择:直接克隆最新源码还是下载稳定包
这里有一个比较现实的问题。Superpowers 作为开源项目,更新节奏和活跃度并不像商业引擎那样稳定,有些历史版本适配的是老版本的 Node.js。如果你直接用最新的 Node 20 去跑一个老早已停更的版本,很可能会遇到原生模块编译失败之类的坑。
从我的实操经验看,最高效的方式是:先去官方仓库看 README 推荐的 Node 版本和可用的 Release 包,而不是无脑git clone master。如果项目提供了一个打包好的 Release 版本,比如拉链包或安装包,优先用那个。因为 Release 包通常已经锁定依赖版本,减少了很多不确定性。如果只有源码,再走“克隆仓库 + 安装依赖 + 启动”这条路。
2.4 安装前快速自查清单
在执行安装之前,建议先花一分钟确认环境状态,避免装到一半才发现不对:
- Node.js 已安装,命令行执行
node -v能输出版本号; - 已安装 Git,并配置了本地用户信息;
- 终端可以正常访问网络,方便下载 npm 依赖;
- 计算机上没有占用
8080端口的其他服务。
确认完这四项,基本就能放心往下走了。
3. 完整安装流程与本地启动
3.1 获取 Superpowers 服务器源码
先说结论:整个安装过程不需要编译任何 C/C++ 代码,核心就是“把仓库下载下来,运行 npm install,然后启动”。
打开终端,找一个你希望存放项目的目录,执行:
git clone https://github.com/superpowers/superpowers.git cd superpowers如果你所在的环境访问 GitHub 比较慢,也可以直接下载仓库的 zip 包后解压。但使用 Git 的好处是后续可以随时拉取更新,并且方便切换分支。如果输入这条命令后发现仓库不存在,不要慌——去 GitHub 搜索 “superpowers game engine”,找到官方维护的那个仓库地址再克隆。开源项目偶尔改地址也是常有的事。
这里有一个细节值得解释一下:为什么我不建议用npm install -g superpowers这类全局安装方式?因为 Superpowers 本质上是“一套带数据目录的服务应用”,它需要在一个固定目录下运行、写入项目数据。全局安装会让数据存放位置变得难以追踪,排查问题时还会增加混乱。克隆到本地,明确它的家在哪,后续管理项目文件会舒服得多。
3.2 安装依赖与启动服务
进入仓库目录后,执行:
npm install这一步会拉取所有依赖包。依赖数量比较大,具体取决于当前版本的锁文件。耐心等待命令跑完,不要中途按 Ctrl+C。如果你用的 Node 版本较新,某些老依赖可能给出 deprecation 警告,这通常不影响运行,可以忽略。
依赖安装完成后,启动服务:
npm start正常情况下,你会看到类似这样的输出:
Superpowers server is listening on http://0.0.0.0:8080此时打开浏览器,访问http://localhost:8080:
- 第一次访问,系统会引导你创建本地账号;
- 创建成功后会进入 Superpowers 的主界面;
- 你可以看到项目列表为空,因为还没有创建任何项目。
如果你在启动过程中遇到“端口被占用”的错误,可以先找到占用进程并处理掉:
lsof -i :8080 # macOS / Linux netstat -ano | findstr :8080 # Windows或者直接换一个端口启动,通过环境变量指定端口。大多数版本的启动脚本都会读取PORT环境变量,所以我习惯这样运行:
PORT=9000 npm start然后在浏览器里访问http://localhost:9000。
3.3 安装过程的常见坑与解决
这个环节我踩过几次坑,花时间总结了几条最常见的报错原因,按出现频率排列:
第一个是 npm install 阶段报错。最典型的是node-gyp相关的编译失败。虽然理论上 Superpowers 不依赖原生模块,但部分传递依赖里可能包含一些需要预编译的包。Windows 用户最容易遇到这个问题,解决办法是装好 Visual Studio Build Tools,再以管理员身份打开终端执行npm install。macOS 用户则先检查 Xcode Command Line Tools 是否完整。
第二个是启动后浏览器白屏。这种一般不是服务端报错,而是8080端口被某个反向代理或安全软件拦截。在公司网络环境或者安装了安全卫士的 Windows 系统上比较常见。判断方式是直接看服务端日志有没有正常监听,再用无痕模式访问一次看看。
第三个是启动后刷新页面变成英文界面。这不是 bug,Superpowers 默认界面语言由浏览器语言决定。如果你代码里用了资源文件的英文名称,又不喜欢界面语言混着来,可以在用户设置里手动切换显示语言。中文界面通常能大大降低新手的上手门槛。
3.4 关于“想要安装 superpowers”的需求拆解
很多人搜索“想要安装 superpowers”,实际需要的可能不仅仅是“服务跑起来”,而是“我真的能用它做出一个游戏”。所以安装完成后,我建议你要做的不是立刻开始乱点按钮,而是按下面的节奏走一遍:
- 创建一个测试项目;
- 熟悉编辑器界面;
- 写一段最简单的移动逻辑;
- 跑通“改代码 → 保存 → 看效果”的循环。
只有完整跑通这个循环,安装才算真正结束。Superpowers 的优势恰恰在于:从你创建项目到在场景里看到方块移动起来,整个过程不超过几分钟。而这种即时反馈,是“终于装好了”最有力的证明。
4. 创建你的第一个 Superpowers 项目并跑起来
4.1 项目类型与编辑器界面
在 Superpowers 主界面,点击“新建项目”会看到几种模板:2D 游戏、2D 平台跳跃、空白项目等。如果你是第一次使用,建议选择“2D 游戏”模板,它自带一些基本场景和脚本示例,比空白项目少踩很多初始化代码的坑。
进入项目后,你会看到编辑器的核心布局:
- 左侧是资源管理器,你上传的图片、音频、脚本都会在这里分类显示;
- 中间是场景视图,你可以在里面拖拽对象、调整位置;
- 下方是属性面板,选中某个对象时,这里会显示它的组件和参数;
- 右上角有“运行”按钮,点击即可启动游戏预览。
Superpowers 的场景结构并不复杂。每个“Actor”(对象)可以挂若干组件,比如 SpriteRenderer 负责显示图片,BoxCollider 负责碰撞检测,Behavior 脚本则承载自定义逻辑。这种组件化设计如果有 Unity 或 Godot 经验,理解起来会非常快。没有引擎经验的读者,可以把“Actor”理解成一个空壳子,组件就是往壳子里塞的各种能力,脚本就是控制壳子的“大脑”。
4.2 场景、Actor 与组件的基础操作
现在尝试做一个最简单的演示:让一个方块在画面中左右移动。
第一步,在场景中创建对象。点击场景视图左上角的“创建对象”按钮,选择“Sprite”并指定任意一张内置图片。Superpowers 自带了一些像素占位图,随便选一个就能用。
第二步,给这个对象添加脚本组件。在属性面板点击“添加组件”,选择“Behavior”,然后新建一个 TypeScript 脚本,命名为Mover。双击脚本,编辑器会进入代码编辑页。
接下来就是写逻辑。Superpowers 的脚本基础结构长这样:
class Mover extends Sup.Behavior { speed: number = 0.1; update() { let move = new Sup.Math.Vector2(0, 0); if (Sup.Input.isKeyDown("LEFT")) move.x -= this.speed; if (Sup.Input.isKeyDown("RIGHT")) move.x += this.speed; this.actor.move(move); } }简单解释一下:
extends Sup.Behavior表示这个脚本是一个“行为组件”,可以附加到 Actor 上;update()会在每一帧被调用,适合写持续的输入检测和移动逻辑;Sup.Input.isKeyDown("LEFT")用于检测方向键是否按下;this.actor.move(move)让当前 Actor 按指定向量移动。
写完保存,回到编辑器,点击“运行”。这时候应该能用键盘的左右方向键控制方块移动了。第一次看到自己写的代码变成按键控制的对象,这种成就感是最直白的入门动力。
4.3 核心 API 的快速脉络
Superpowers 的 API 叫Sup,所有官方能力都挂在这个命名空间下面。入门阶段你只需要记住以下几个常用类别:
输入与交互。Sup.Input负责键盘、鼠标、触摸和游戏手柄输入。Sup.Input.isKeyDown("SPACE")判断是否按住空格键,Sup.Input.getMousePosition()返回鼠标位置。
对象与组件。this.actor是脚本关联的当前对象。this.actor.spriteRenderer可以拿到 SpriteRenderer 组件,然后在代码里动态改显示图片。this.actor.tileMapRenderer用于操作瓦片地图。
数学运算。Sup.Math提供了向量、矩阵、插值等基础工具。Sup.Math.Vector2在 2D 游戏里是最常用的类型。
时间机制。Sup.Time.time返回从游戏开始到当前的秒数,可以用来做计时器。Sup.Time.deltaTime在刚接触引擎时会有一点绕,简单说就是“上一帧到这帧之间实际过去了多久”,固定数值不适合做移动距离。
初学阶段不要去背 API,换一个思路:你只需要知道“我要做什么”,然后去Sup下面找对应的能力。比如你要播放音效,搜getAudioSource之类的即可。编辑器里自带文档查询功能,随时点开看。
4.4 实时预览与迭代调试
Superpowers 的“运行”按钮是在编辑器的场景里直接启动游戏逻辑,不需要额外的导出打包流程。你可以在游戏运行的同时切回编辑器,修改代码后按“重新运行”,几秒内就能看到新效果。这种即时迭代的体验,非常适合快速试错。
调试方面,最常用的手段是console.log。Superpowers 提供了一个内置控制台面板,可以把日志输出到这里。你不需要打开浏览器的开发者工具就能看到脚本里的打印信息。如果脚本某一行报错,编辑器和控制台会直接标明错误位置,点击错误信息会跳到对应代码行。
一个非常实用的经验:在写逻辑之前,先在 update 里加一行console.log(this.actor.getX())之类的日志,确认脚本能被触发。很多人脚本没生效时第一反应是找 API 文档,实际上很可能是场景里的 Behavior 组件没有正确绑定脚本,或者脚本类名与文件名不一致。日志会马上暴露问题所在。
5. 素材管理、多人协作与资源配置实战
5.1 上传与管理图片、音频资源
Superpowers 资源管理器支持从本地直接拖拽文件上传。图片推荐使用 PNG 格式,如果想要透明背景更要用 PNG。音频方面,WAV 作为无损格式兼容性最好,MP3 文件不大但导入后可能出现个别浏览器解码问题。一个常见的原因是文件大小:图片尽量控制在 1MB 以内,音频控制在 3MB 以内。别让资源体积拖垮整个项目的加载速度。
资源上传后,你可以右键设置资源属性。比如图片可以作为 Sprite 使用,也可以作为 UI 素材。在 Superpowers 里,把资源从资源管理器拖到场景中,通常就会自动生成一个包含对应渲染组件的 Actor,非常直观。
素材命名上我有一个习惯:全部使用小写字母加下划线。这不是 Superpowers 的强制要求,而是因为多人协作时,成员可能使用不同操作系统。macOS 文件系统默认大小写不敏感,而 Linux 服务器大小写敏感。如果资源路径在代码里大小写写错,在部分环境能跑、在部分环境直接报错。全小写能直接从源头避免这类问题。
5.2 多人协作是核心能力,但不是“云同步”
Superpowers 的协作方式,是把整个项目的数据保存在服务器端。当你把服务跑起来,同事用浏览器访问同一个地址,登录账号后就能看到同一份项目列表。打开同一个项目后,所有人编辑的是同一个实时工程,不需要合代码。
实操时要注意一点:多人同时编辑同一个场景时,如果两个人同时操作同一个对象,最后保存的一方覆盖掉对方是很正常的。Superpowers 会尽量实时同步,但本质上它不是一个冲突解决工具,而是一个“大家一起在同一张桌子上改图纸”的场景。分头工作才是正确打开方式:一个人负责场景搭建,一个人写脚本,一个人做美术素材。这样既能发挥协作优势,又不会互相干扰。
邀请成员加入时,可以给每个成员分配账号。不同成员看到的项目权限取决于账号角色,其中管理员拥有项目管理权限,普通成员可以编辑项目但通常不能删除项目。首次设置账号时建议先创建一个只用于日常工作的成员号,而不要把管理员号直接丢给所有人共用。
5.3 数据备份与项目迁移
Superpowers 的项目数据保存在服务器目录下,通常是一个storage或data文件夹。你复制这个文件夹就等于备份了整个项目。迁移服务器时,把文件夹拷过去、重新跑服务、然后重新创建原来的管理员账号,项目就能恢复。
备份绝对是一个好习惯。我见过太多人把项目只存在一台电脑上,等到硬盘出问题才追悔莫及。至少每周把storage目录做一次压缩备份。如果有版本控制的需求,也可以把这个目录纳入 Git 管理,但要注意存储目录下可能有临时锁文件,最好加进.gitignore。
5.4 导出与部署:让别人玩到你做的游戏
Superpowers 项目可以导出为可直接运行的 HTML5 页面。在编辑器里找到“导出”相关选项,打包后你会得到一个包含index.html和若干资源文件的文件夹。把这个文件夹放到任意一个静态 Web 服务器上,或者甚至直接用浏览器打开index.html,游戏都能跑起来。
简单部署方案有:
npx serve开启本地静态服务,适合快速分享;- 用 GitHub Pages 静态托管,适合展示作品;
- 自己服务器上挂 Nginx,适合正式发布。
导出后最容易出现的问题是资源路径失效。所有资源引用尽量使用相对路径,导出的文件结构不要随意改动,否则图片和音频会加载失败。另外,导出前一定要至少完整运行一遍游戏,确认没有“只在编辑器里正常、导出后异常”的情况。
我在实际项目里遇到过一次非常尴尬的情况:游戏在编辑器里一切正常,导出后点击按钮没有任何反应。排查了半天才发现是脚本里引用了本地文件路径,浏览器安全策略不允许访问。从那以后,我导出前都会专门把那些需要外部访问的功能测一遍。
6. 常见问题排查中心:从入门到放弃边缘的救命清单
6.1 服务端问题速查
用表格整理是最直观的,下面这份清单基本覆盖了服务器相关的绝大多数问题:
| 症状 | 可能原因 | 解决办法 |
|---|---|---|
启动后终端报EADDRINUSE | 端口被占用 | 杀掉占用进程,或通过PORT环境变量换端口 |
| 浏览器访问一片空白 | 服务没起来,或访问的端口不对 | 确认终端监听日志,检查是否访问了错误的端口 |
| 局域网内其他人访问不了 | 防火墙拦截,或服务绑定了127.0.0.1 | 确认监听地址为0.0.0.0;开放系统防火墙对应端口 |
| npm install 时报 node-gyp 错误 | 缺少编译工具链 | Windows 装 Build Tools;macOS 装 Xcode CLT;Linux 装build-essential |
| 服务运行一段时间后内存暴涨 | 可能是旧版本的内存泄漏问题 | 定期重启服务,或者尝试更换更新版本 |
6.2 编辑器与脚本问题速查
这一部分更贴近日常开发,很多新手反复卡在同一个地方:
脚本没生效。先确认脚本类名是否与文件名一致;再确认 Behavior 组件是否已经绑定到 Actor 上;最后在脚本顶部加一行日志,看是否有输出。如果完全没有输出,99% 是绑定或者类名的问题。
Sup.Input.isKeyDown监听不到键盘。检查游戏运行后是否先点击了游戏画面。浏览器只有在页面获得焦点时才会分发键盘事件。这是 HTML5 游戏与本地应用的典型差异,不是引擎的问题。解决办法是在运行后先用鼠标点一下游戏区域。
移动速度在不同电脑上不一样。这是新手最容易遇到的现象:一个游戏假设每帧移动0.1单位,帧率越高者移动越快。正确做法是基于时间而不是帧数移动。参考写法是:
this.speed = 3; // 每秒移动多少单位 update() { this.actor.move(new Sup.Math.Vector2(this.speed * Sup.Time.deltaTime, 0)); }图片显示不出来。先检查图片资源在资源管理器里是否能正常预览;能预览说明资源本身没问题,再检查 SpriteRenderer 组件是否引用了正确资源。图片路径中英文大小写也要一并排查。
运行后没有声音。浏览器自动播放策略会拦截非交互产生的音频。需要在用户点击事件之后再触发播放,而不能在游戏启动时立刻播放。
6.3 多人协作的典型尴尬场景
协作模式里最常见的现象是“互相覆盖”。解决方案不是寻找一个什么神奇开关,而是明确分工。团队小的话,可以约定:场景归某人管,脚本归某人管,素材上传归某人管。每次改完关键内容顺手保存。
我还有一个经验:改脚本之前,先看一眼右下角有没有人正在编辑同一个文件。Superpowers 会显示当前编辑者的状态,如果亮着“有人正在编辑”,那就等一会儿或者直接沟通一下,不要硬凑上去。多人同时改同一个文件,即使引擎能自动合并一部分,也会带来不可预期的逻辑冲突。
6.4 一个容易误会的“坑”:语言与字体
很多中文用户在导入中文字体素材时会发现,游戏里中文文字显示成了方框或者无法渲染。这通常不是引擎坏了,而是你没有在项目里配置包含中文的字体资源。Superpowers 默认使用的字体不一定覆盖汉字字符集。
解决方法是准备一个开源中文字体文件(如思源黑体),上传到项目资源中,然后在文字渲染组件里指定该字体。字体文件往往体积很大,建议子集化裁剪后再上传,只保留你实际用到的字符,加载速度会明显提升。
6.5 性能优化:别看它小巧,卡起来也照样卡
Superpowers 适合 2D 游戏,呈现大量小对象时也能应付一定的规模,但别拿它和重型引擎硬拼。以下几点优化建议,我实测下来效果不错:
- 对象数量多时,尽量合并静态 Sprite 为一张 Sprite Atlas,减少绘制调用;
- 不要在
update()里频繁创建新对象,比如每次生成新的Vector2,尽量复用临时变量; - 定时器逻辑尽量用
Sup.Time.time做比较,而不是用setInterval,避免帧率波动影响计时准确性。
做一个几十上百个对象的休闲小游戏完全没问题,但如果目标是上千个独立精灵同屏的大型演出,还是要考虑换引擎,或者把架构重新设计一下。
7. 从安装到上手的个人经验与小技巧
最后聊几个我实际使用下来觉得最有价值的体会。
第一,Superpowers 的最佳学习曲线是“按需查找”,不是先通读文档。我带着“复刻一个贪吃蛇”的目标去摸索,从新建项目到实现键盘控制,几乎只用了半小时。之后再遇到具体问题,再去看 API。
第二,创建模板项目这一步一定不要跳。我自己一开始图省事选了空白项目,结果连最基础的场景和相机怎么配置都要重新查模板来参考。模板项目里那些示例脚本本身就是最好的教学代码。
第三,把资源管理当成习惯,从一开始就不要往场景里乱拖文件。Superpowers 的编辑性再灵活,项目大了以后资源命名混乱也会让人崩溃。上线前的资源整理是不可避免的,早整理比晚整理轻松得多。
第四,多利用浏览器开发者工具。虽然是 Superpowers 自带的运行时,但本质上也是网页应用。脚本里出现的某些底层渲染异常,控制台日志往往比 Superpowers 自带的报错提示更详细。
第五,真的不用追求“一步到位部署公网”。我见过很多人一上来就想配域名、配 SSL、搞公网访问,最后全都消耗在环境配置上,游戏一个玩意儿没做出来。先从本地自己玩、局域网朋友玩开始,等游戏真的值得分享了,再考虑正式部署也不迟。
如果你也是那种“想拉上朋友一起快速做个游戏玩”的人,Superpowers 确实是个性价比极高的工具。它不像商业引擎那样给你完备的服务,也不像专业协作平台那样有完善的无冲突合并机制,但它的轻量、即时反馈、协作顺畅度,在小项目和教学场景里就是恰到好处。照着上面这些步骤走一遍,一个能跑的 Superpowers 环境绝对能顺利落地,而你从创建项目到做出第一个可交互场景,应该也用不了一顿饭的时间。