
Superpowers 这名字很有意思有段时间在开发者圈子里经常被提起。打开 GitHub 想找个能直接在浏览器里开搞的 3D 创作平台你会撞见它去搜 VS Code 扩展也会看到一个同名状态管理工具。很多人第一次搜“想要安装superpowers”是想追这个热度以为某个新工具横空出世其实它是个老牌开源项目了。这篇我聊的是那个基于 TypeScript、内置 Three.js、主打多人协作的浏览器内 3D 创作平台 Superpowers以及我把它跑起来、实际做完一个小项目的完整过程。如果你也想装一个玩玩或者想搞清楚它跟 Unity、Blender 这些传统工具到底差在哪这篇应该能帮到你。我最早接触它是被“多人实时协作做 3D 场景”这个点吸引的。传统游戏开发里两个人同时编辑同一个场景基本要靠同一台机器或者小心翼翼地分工。Superpowers 的思路完全不同服务端统一管理数据浏览器只是客户端大家看到同一份场景数据谁改了什么立即同步。这个设计在 2016 年前后相当超前即便是现在拿出来很多所谓“协作功能”也没它做得干净。下文我会从定位、安装、实操到踩坑一步步把整个流程完整拆给你看。1. 项目定位与核心思路拆解1.1 Superpowers 到底是什么它不是游戏引擎而是一个“创作平台”市面上你听到的“引擎”通常有明确边界Unity 有编辑器、有运行时、有构建管线Unreal 更不用说C 编译、蓝图、光照烘焙一套下来劝退新手。Superpowers 不一样它给自己的定位是“实时协作的 3D 开发环境”和“创作平台”更像一个自带边界和脚手架的在浏览器里跑的 IDE。你用它的方式不是下载一个大而全的编辑器而是让本机起一个服务然后用浏览器打开编辑器页面在页面里建项目、搭场景、写脚本、跑预览。我当时第一次进到工作区第一反应是“这玩意儿也太朴素了”。没有密密麻麻的面板没有一堆窗口。左边是资源列表中间是 3D 视图右边是对象属性底部是脚本控制台。干净归干净但它把开发里的核心闭环做全了创建项目、添加实体、挂组件、写逻辑、启动预览、多人同时在线改。这就够了。它的另一层身份是“学习工具”。因为脚本语言直接用 TypeScript场景里的对象模型不复杂你不需要先学几百页文档再动手。进入项目后随便拖一个立方体进去双击脚本就能看到标准的组件生命周期方法在update()里写一行旋转代码预览马上有效果。这种即时反馈对新手相当友好。1.2 为什么选择“浏览器 服务端”这套架构协作与即时启动的取舍Superpowers 的技术架构核心是一个本机或局域网内的服务端进程负责项目文件存储、WebSocket 连接管理和权威数据同步客户端或编辑端统一走浏览器用 Three.js 做渲染用 TypeScript 编逻辑。这个取舍背后是它对“协作”二字的极致追求。传统单人编辑器的问题是“单机即一切”。你所有的操作都落在本地文件里别人想看你的场景要么发工程包要么录视频。Superpowers 的做法是效果优先可及性优先。服务端起来之后局域网里任何一台设备都能打开浏览器访问同一条地址。这意味着同事不用装任何东西输个 IP 就能看到你刚改的场景。对这种场景敏感性极高的需求浏览器是最轻的客户端没有之一。当然这个选择也有代价。浏览器的性能上限摆在那儿大规模场景、复杂物理模拟、重度后处理都不是它的强项运行起来的数据先走 WebSocket 再同步到编辑器实时预览天然会有一定延迟。但它的目标从来不是跟重型引擎拼渲染极限而是让人能快速产出想法并且让这个产出过程能被所有人同步看到。常常有团队成员说“预览比想象中流畅”是因为它把场景里的对象做了合理的实例化而不是每个对象都推全套数据。这类轻量级协作体验重型引擎反而不一定能给到。1.3 技术栈一览TypeScript、Three.js、Node.js、WebSocketSuperpowers 的整个体系是强 TypeScript 信仰者的样本。服务端用 Node.js 跑编辑器是 TypeScript 应用自定义脚本的宿主语言也是 TypeScript。这带来一个直接好处你在写 Cube 的旋转逻辑时代码提示、类型检查、编译期报错都是齐全的。写错了不能运行而不是运行时才给你一个红色异常。渲染方面它直接集成 Three.js。场景里的网格、灯光、相机、粒子这些都是 Three.js 的对象你在脚本里能直接访问this.actor拿到所在实体操作actor.threeObject等底层对象。它帮你封装好了实体、组件、行为这些概念但没挡住你直达 Three.js。这种“表面有框架底层可捅破”的设计长期用下来会觉得很顺手。网络同步用的是 WebSocket下层是 JSON 消息协议覆盖实体增删改、组件属性变更、脚本执行状态等。不是全部数据都全量推送它只同步有效的变更集。多人同时拖拽同一个物体的位置A 改了位置B 那边实体坐标会即时刷新。这套机制我会在第 4 部分进一步讲但先记住一个结论协作不是附加功能而是架构的核心出发点。2. 安装前的准备与版本选择2.1 从 GitHub Releases 下载还是用源码跑两种方式我如何权衡安装 Superpowers 有两个主流路径。第一直接到 GitHub Releases 页面下载对应系统的压缩包第二git clone源码后自己npm install再启动。实测下来绝大多数人直接走第一条路就对了省时间也省事。发布包会把 Node.js 运行时、服务端代码、前端静态资源都打包好你解压、启动、访问浏览器三步完事。源码方式适合什么人想改平台本身逻辑、想研究内部实现、或者你需要构建一个自定义定制的桌面端。我自己第二次折腾时走的源码路线当时想法是“既然要写博客那就扒得深一点”。跑起来之后确实能看到完整的服务端目录结构、插件机制、编辑器和服务器代码分层对理解它内部怎么工作有很大帮助但代价是安装过程比用发布包多花了大概二十分钟。需要留意的是版本选择。Superpowers 在发布过程中有几次大的架构变化老版本用 Electron 做桌面外壳浏览器只是个渲染窗口后来的版本逐步去桌面化强调纯浏览器访问。不同版本界面和配置方式有区别如果你看的是老教程命令或者目录结构对不上是正常的。建议认准最新稳定 Release不要拿老版本的安装记忆往新版本上套会吃亏。2.2 不同操作系统的差异与依赖检查它设计上就挺跨平台的。Windows、macOS、Linux 三系都有对应发布包。Windows 上你拿到的是一个 zip 压缩包解压后双击或命令行运行启动脚本macOS 和 Linux 类似不过要注意权限问题Linux 下得先给启动脚本加执行权限我用chmod x处理过几次。有个容易被忽略的点虽然发布包自带运行时但你的系统最好还是有个稳定的 Node.js 环境。不是运行时需要依赖它而是你后面可能要在项目里装工具链、跑额外脚本。我自己习惯先把 Node.js LTS 装好再把 Superpowers 跑起来这样以后写辅助脚本不会卡壳。Linux 用户还要确认下系统里有wget或curl下载和后续二进制操作都用得到。浏览器方面Superpowers 对现代 Chromium 系浏览器优化最好Chrome、Edge 我都实测过Firefox 也能跑但个别渲染小问题偶尔出现。WebGL 是必须的如果你的工作机显卡太老或者驱动有问题预览画面会白屏。建议动手前先开一个 WebGL 测试页验一下比如浏览器直接访问webglreport.com能看到当前 WebGL 状态。2.3 安装目录与数据目录的规划这个项目解压就能用但如果你只是把它当成一个临时工具过段时间再回来找项目文件会非常痛苦。我的习惯是在某个固定的盘符或目录下建一个DevTools文件区域把 Superpowers 统一放进去不让它散落在一堆下载文件夹里。项目数据路径也要提前想好因为 Superpowers 会把工程数据默认存在服务器的数据目录下我遇到过一次系统盘空间紧张这才意识到全局搜索数据目录的重要性。你新建项目之后场景文件、脚本文件、纹理资源这些都会存储在服务端的数据目录里。多人开发时这个目录就是你们的“中央仓库”务必放在一个稳定、易备份的位置。再强调一次和传统引擎的“工程目录即项目实体”不同Superpowers 的工程文件更多沉淀在服务端数据区换机器、换目录带来的影响比想象中大提前规划能省很多事。3. 实操一次跑通 Superpowers 的完整流程3.1 各平台启动步骤与验证方法Windows 下我通常是解压发布包打开命令行切到解压目录执行启动脚本。等命令行出现一行类似 “Server listening on port …” 的日志信息就说明服务已经起来了。macOS 和 Linux 的命令基本一致区别在启动脚本可能要加./前缀。注意启动窗口不要随手关掉Superpowers 的服务器是前台进程关掉窗口等于干掉服务。启动成功后别急着往界面钻先做一次连通性验证。浏览器访问http://localhost:4237默认端口是 4237如果你的端口冲突或自定义过以启动日志为准。能打开一个登录/注册页面说明服务和前端资源都正常。如果你在局域网环境开发还要确认下服务的监听 IP。默认配置下同一局域网的人能不能访问取决于服务器绑定的地址如果只绑定localhost那本机之外的人是进不来的这一点在团队协作时很容易中招。我是这样验证多机访问的先在服务端机器上确认本机能访问再在另一台机器浏览器输入http://服务器IP:4237能弹登录页就说明网络链路通了。如果在这卡住优先查防火墙Windows 下常见的问题是防火墙把 Node 进程拦了得在入站规则里放行所用端口。3.2 首次访问创建账号与工作区进入登录页之后第一次使用要先注册一个本地账号。这个账号跟任何外部平台无关纯粹是 Superpowers 服务器内部的身份体系它用来区分“谁创建了项目、谁在协作”。我当时很快就随手注册了一个后来发现这个账号还会关联到项目权限和编辑记录所以别用太随便的密码局域网里别人的浏览器只要能访问这个服务就有机会看得到项目列表。登录后你会看到一个工作区列表界面。可以新建一个工作区命名方式类似建群比如“我的第一个3D实验室”。每个工作区下面再挂项目。工作区是多人共享的空间同事加入的时候只需要输入工作区名称或从列表进入。首次打开的工作区是空的接着就可以开始新建项目。这里有个小经验工作区名称最好用英文或拼音避免某些系统环境对中文路径或字符集处理不好。虽然现代系统大多没问题但我在 Windows 和部分 Linux 组合下遇到过显示异常后来就全程英文命名了。3.3 新建项目从空白工程到第一个可见场景点击新建项目后会让你选项目模板。Superpowers 提供空模板和基础示例模板想快速感受效果我建议先选带示例的里面通常有基础场景、几个实体和脚本。空模板更适合那种想完全掌控的工具党。我给初学者的建议是先跑一下示例确认整条链路没毛病再回过头建空项目一点点从零搭东西。进入编辑器后你会看到我前面说的四块区域界面。右键在层级面板里可以新建实体比如点击创建长方体、球体、光源、相机。第一次创建完它未必处于视野中心如果你看不见物体多半是相机角度问题。右上角有聚焦按钮点一下会自动把视角拉到选中物体上。这个操作看起来基础但很多新手第一次开场景发现一片黑就是没做聚焦。我实操时的流程是这样的新建一个球体再新建一个平行光然后用聚焦按钮把视角切到球体上场景里立刻能看到明暗变化。接着我在光源属性里调整亮度球体的受光面实时变化。这个反馈速度让我很确定渲染和资源加载都没问题环境已经可用了。等第一个场景亮起来安装这件事就算真正办成了。4. 核心玩法与脚本编写要点4.1 可视化编辑器里的对象模型实体、组件、行为Superpowers 的场景对象模型走的是“实体-组件”路线类似 Unity 的玩法。实体Actor是场景里所有物体的根组件Components负责给实体附加能力比如网格渲染、光源、摄像机、粒子行为Behaviors本质上也是特殊组件但它挂载的是用户写的 TypeScript 脚本。实际使用中你不会直接写一个“整个物体该怎么动”的巨无霸逻辑而是把单个能力拆成小组件再挂到一个实体上。比如一个会旋转的发光球体球体网格组件负责外形点光源组件负责发光行为组件挂一个旋转脚本负责转起来。组合式思维比传统面向对象里的“继承”要灵活得多改东西不用动底层拆下来换个组件就行。这个设计对初学者尤其友好。你不需要理解一堆基类和虚函数只需要问自己一个问题这个物体需要什么能力然后逐个添加上去。它逼着你想清楚“职责边界”等回头维护项目的时候会特别庆幸当初做了拆分。4.2 用 TypeScript 写行为的实际体验新建行为脚本之后你可以看到自动生成的模板里面有onStart()和update()两个默认方法。onStart()在实体激活时执行一次适合初始化变量、获取其它组件引用update()每帧调用适合持续改变位置、旋转、缩放。这两个是基础生命周期后面你慢慢会发现还有onEnable、onDisable、onDestroy等但核心用的最多还是它们。下面是一段真实可跑的最小旋转脚本我拿一个立方体测过import { Actor, Behavior, Vector3 } from silverpony; export class SpinBehavior extends Behavior { public speed: number 1; onStart() { // 每帧旋转的速度角度单位是弧度 } update() { const delta this.actor.transform.localRotation; this.actor.transform.setLocalRotation( delta.multiply(new Vector3(0, this.speed * 0.01, 0)) ); } }重点说下this.actor。它指向当前绑定的实体通过它你可以访问所有组件和 Transform。Superpowers 把脚本里能用到的接口已经封装成很干净的类型定义写代码时智能提示会告诉你哪些属性可改、哪些方法可用。我在实际操作中最大的感受是类型安全所带来的确定性。改属性名、改变量类型编译器立刻帮你圈出错误不会出现运行到一半才报错的尴尬。关于旋转逻辑有一个容易踩的坑直接对localRotation赋值容易产生万向锁这类问题尤其当你同时绕多个轴旋转时。更稳的方式是使用rotateBy之类的方法或者基于 Quaternion 插值。上面代码我是演示用实战里如果要可持续旋转我推荐用增量方式处理逻辑更清晰。4.3 多人协作实时同步与编辑冲突的处理真正让我觉得惊喜的是多人协作。拉上同事的浏览器同时进入同一个项目我移动场景里的一个物体同事那边几乎无延迟地看到物体在动。这不只是“最后的保存结果”而是每帧状态的同步。你在预览运行时服务端会广播场景的变更消息订阅者实时应用变化。编辑器界面里你也能看到一个个光标代表到底谁在哪里编辑。但这里有个很重要的认知同步的是“项目数据和运行时状态”不等于把整个编辑器界面都镜像过去。比如你拖着窗口换个布局对方那边是不变的你添加资源对方资源面板会刷出来但你对着摄像机视角调到一个欣赏角度这种事对方并不会感同身受。协作重点在内容本身不在视图。多人同时改同一个组件属性时它的同步策略是后写覆盖先写。这种策略简单可靠但要求团队成员之间有基本沟通。我自己就经历过A 改物体位置的同时 B 改了旋转最后位置和旋转用的不是同一个人预期的结果。建议是协作时按模块分工明确“这几分钟谁动这个物体”别同时操作同一个实体。还有一个细节脚本的保存也会同步但是项目里某个人正在调试时你保存脚本可能会触发对方那边的热更新。团队协作时我建议先把“自动重启预览”这种设置摸清楚有些版本默认行为会中断正在玩的预览。这一块最好团队统一约定谁改脚本谁负责观察影响别闷头改。5. 常见问题与排查技巧实录5.1 浏览器打不开、端口被占用怎么处理最常见的场景命令行显示服务已经起来但浏览器访问localhost:4237就是打不开。先别怀疑安装大概率是端口被占了。排查方式Windows 下用netstat -ano | findstr 4237Linux/macOS 用lsof -i:4237看这个端口被哪个进程占用。如果是你自己起的另一个服务占了关掉它或者给 Superpowers 换个端口重新启动。换端口的具体做法取决于启动脚本和版本一般是加一个环境变量或命令行参数。我不建议用默认的 4237 之外太奇葩的端口因为局域网协作时越常见的端口越容易被别的服务抢占。另外我还遇到过机器上有多个浏览器插件拦截本地请求的情况逐个禁用扩展排查后定位到是一个安全插件拦截了 WebSocket 连接这类显眼的“打不开”问题其实是浏览器插件惹的祸。5.2 Node 版本与依赖安装失败走源码方式时很容易碰到npm install失败。老项目的依赖链比较敏感新版本 Node 可能导致原生模块编译不通过。如果你只是想用工具本身遇到这种情况就别挣扎了直接下载发布包。如果你是开发者想二次开发建议nvm装一个老一点的 Node LTS再进源码目录装依赖。我第一次用最新 Node 装直接编译报错换成 LTS 之后就一路顺了这说明这个项目对激进版本的支持并不及时。还有个小技巧npm install的过程可以多观察有没有警告特别是node-gyp相关的错误。真遇到时检查系统有没有装 Python、C 编译工具链Windows 下相当于 Visual Studio Build Tools。虽然发布包绕过了这个问题但二次开发就绕不过了。5.3 3D 渲染白屏、画面卡顿白屏问题通常和 WebGL 有关。浏览器里访问 WebGL 测试页确认自己机器确实支持并启用了硬件加速。如果显示禁用或软件渲染先去浏览器设置里打开“硬件加速”开关然后重启浏览器。有些老旧笔记本的核显性能很差跑稍微复杂一点场景就卡这时候可以把预览画质调低或者直接把复杂场景里的粒子系统临时停掉。画面卡顿也不一定全是渲染问题。有个隐藏坑是脚本里每帧都在创建新对象比如我的早期版本在update()里不断new Vector3看着没问题但 GC 被频繁触发后帧率就掉下来了。这个问题的解法是复用临时变量或者在onStart()里创建只读的对象。Superpowers 底层的 Three.js 场景本身足够快你卡住先怀疑自己脚本再怀疑显卡。5.4 数据丢失、误删除与备份建议因为项目数据存在服务器端浏览器清缓存不影响但如果服务器目录被误删或者硬盘坏了项目就真没了。我强烈建议定期把整个数据目录打包备份因为这里和代码仓库不同Superpowers 没内置版本管理也没有“历史记录”面板可以回滚误操作。误删除实体后如果你没保存可以试试刷新页面前有没有自动快照机制但保存后基本就回不去了。我自己的做法是在工作区开一个“临时草稿”项目所有高风险操作先复制一份再折腾。另外多人项目里谁删了什么很难追溯最好约定一个“删除前先发消息”的团队规矩。这不是技术问题但实践里它比任何回滚机制都管用。还有一点源码方式启动时如果自己改坏了服务端代码项目数据可能起不来。这种时候别慌把代码改回去再启动数据文件一般不会因此损坏。真遇到数据文件损坏就看有没有备份了。趁着项目还不大养成备份习惯成本最低。结尾一点个人经验如果你只是想围观 Superpowers下载发布包启动注册个账号拖个立方体进去五分钟内就能感受到跟传统工具非常不一样的协作体验。真拿它做个人作品或小团队原型我建议从示例模板入手先模仿它的脚本写法和项目组织方式再逐步替换成自己的内容。多人协作时把“谁动什么物体”这种口头规矩定好比任何高级工具都管用。我实际折腾下来的最大感受是Superpowers 更像一个能跑的交互式“想法草稿本”而不是一个完整的商业引擎。它最适合的场景是快速验证 3D 构思、教学演示、团队头脑风暴——大家一起在三维空间里“捏”点子那种即时反馈是传统流程给不了的。别指望它替代 Unity 去搞大项目也别因为它看起来朴素就否定它。装上它建个场景拉两个同事进浏览器你会立刻明白这种轻量协作带来的价值在哪。