
1. 认识 superpowers它不是魔法是你自己的协作创意工坊我第一次听到 superpowers 这个名字是在一个做独立游戏的朋友那里。他跟我说自己搭了一个服务团队四个人窝在三个城市浏览器一开就能在同一块 3D 场景里拖模型、写代码、调灯光鼠标光标都能看到彼此的移动轨迹。我当时第一反应是这八成又是什么重量级商业协作平台一打听才发现这是个开源项目可以自己部署。superpowers 说白了是一个以浏览器为操作界面的协作式 2D/3D 开发平台。它和传统“装一个厚重编辑器、然后各自开发再合并”的流程完全不同整个编辑器和运行环境都跑在服务端客户端只需要一个现代浏览器。打开页面你能直接开始创建场景、放置物体、编写 TypeScript 脚本队友只要拿到同一个服务地址就能实时进入同一个工作区。这种模式放在今天看来多少有点像是给“创意协作”这件事准备了一个专属的、可以自托管的在线工作台。这篇文章的目的是把“安装 superpowers”这件事从头到尾讲明白。我会从部署前的选型思路、实际安装过程、第一次操作界面的核心概念到用 TypeScript 给一个 3D 场景里的角色加上移动逻辑再到常见的故障排查按我自己的实操顺序写下来。适合的人群很明确想自己搭一个协作式可视化开发环境的人带学生做 3D 入门项目的人以及独立游戏或小团队想低成本共用一个创作环境的人。如果你只是想找个“在线游戏制作工具”玩玩那可以直接用公共在线版不必折腾自托管如果你想让它成为团队内部稳定可用的基础设施那这篇文章应该能帮上忙。我自己踩坑最多的地方往往不在功能本身而在“环境怎么搭”和“多人同时编辑时怎么不互相踩脚”这类实际问题上。这些经验常规教程里很少写我会在后面专门整理。2. 安装 superpowers部署前的思路与选型2.1 先想清楚你要源码运行还是要容器化部署安装一个服务之前最忌讳的就是脑子一热直接敲命令。superpowers 的部署方式可以根据团队的使用情况分成三种我可以直接说结论第一种是本地开发机运行。适合你自己一个人体验或者临时拉个团队试用打开命令行跑起来用完就关没有任何负担。代价是机器不能随便关别人要访问时你得把服务绑到局域网 IP 上。第二种是服务器正式部署。把自己的一台云主机或者家里的迷你主机当作长期服务端保持 7×24 小时运行团队随时能连。这种方式的好处是稳定坏处是你需要对 Linux 环境、进程守护、数据备份稍微有点概念。第三种是 Docker 容器运行。用容器把服务端、数据目录、网络端口一次性封装好升级和迁移都方便非常适合正式环境。如果你所在团队已经习惯用 Docker Compose 管理服务我强烈推荐这种。我当时选的是第三种。原因很直接我不想在一台服务器上留下一堆散落的依赖而且以后想换机器直接搬容器配置文件就行不用重新装环境。很多自托管项目都提供了官方镜像superpowers 的官方仓库里资料虽然不算丰富但用容器方式部署是完全可行的。2.2 服务器环境怎么准备心里要有数不管用什么方式装一台能跑 Node.js 环境的机器是刚需。superpowers 服务端的核心是一个 Node.js 进程客户端的构建产物也是通过它来提供的所以你要是连 Node 都没装那后面什么都起不来。就我个人测试的经验来说1 核 2G 内存的入门云主机跑一个小团队使用的 superpowers 实例已经够用了。你可能会觉得奇怪一个听着像“游戏引擎”的东西怎么需求这么低。因为真正的渲染是放在浏览器里做的服务端主要负责场景数据同步、脚本逻辑运行和静态资源分发压力并没有想象中那么大。当然如果你的场景极其复杂或者同时在线十几个人做协作建议至少 2 核 4G硬盘留出 20G 以上因为模型、纹理这些资源会慢慢累积。这里有必要提一个容易被忽略的点端口规划。superpowers 服务端默认会监听一个端口浏览器访问时就是http://你的服务器IP:端口。如果你打算长期用最好在系统防火墙和安全组里把这个端口放行。我遇到过很多“安装成功但打不开”的案例排查到最后都是云控制台的安全组规则没配好纯属低级失误。Node.js 版本方面不要装太老的建议用当前主流 LTS 版本。版本过低会导致某些依赖编译失败版本过高又可能出现兼容性提示所以先用 LTS后面基本省心。2.3 源码部署实录从下载到启动如果你选的是源码方式操作路径大概是这样的。先从项目官方渠道获取最新的源码包这里我以常见的 Git 方式为例git clone https://github.com/superpowers/superpowers.git cd superpowers接下来是安装依赖。superpowers 这类项目依赖列表通常很长我用的是 yarn因为它在处理这种大型依赖树的时候比 npm 更容易保持版本一致性。如果项目根目录有yarn.lock那就说明官方推荐 yarnyarn install依赖装完以后先别急着启动。你得确认项目里有没有配置文件或者环境变量说明比如服务端监听端口、数据库地址、静态资源路径。superpowers 的常见配置并不复杂如果没有特殊需求默认配置也能跑起来。然后启动服务端npm start或者某些版本会用yarn start具体以你拿到的项目说明为准。启动成功后命令行会显示一行访问地址。我通常会把服务绑定到0.0.0.0这样局域网内的其他设备也能访问如果只绑定了127.0.0.1那就只有服务器本机能打开其他同事都会一脸懵地跑来问你要地址。浏览器打开地址看到一个项目列表页面就说明服务端基本活了。后面我会专门讲第一次进入后需要做哪些事情。2.4 Docker 部署更省心的备份与升级方案源码部署最大的痛点是升级麻烦。拉新代码、装依赖、重启三步缺一不可遇到依赖冲突时更头疼。Docker 方式则可以把这个过程收敛成一个镜像重建操作。一个比较通用的思路是自己写一个 Dockerfile把整个项目打进去。我那次实际用的 Dockerfile 模板大概是这样的FROM node:16-buster-slim WORKDIR /app COPY package.json yarn.lock ./ RUN yarn install COPY . . EXPOSE 4237 CMD [npm, start]里面端口号是按我当时项目监听端口来的如果你的版本不同就改成实际端口。构建镜像docker build -t my-superpowers .然后运行容器docker run -d --name superpowers \ -p 4237:4237 \ -v superpowers-data:/app/data \ my-superpowers我特意挂载了一个数据卷因为项目数据如果全放在容器内部一旦容器删了你辛苦搭的几周场景资源就全没了。用-v挂载出来以后升级只需要重新 build 一个新镜像再把旧容器替换掉数据还在团队的损失可以降到最低。如果你习惯 Docker Compose也可以用类似下面这种配置管理version: 3 services: superpowers: build: . ports: - 4237:4237 volumes: - superpowers-data:/app/data volumes: superpowers-data:这些配置不是官方标准模板而是从实践中总结的通用部署结构具体文件路径和端口参数要以你拿到手的那份源码为准。但思路是通用的对外只暴露一个端口内部数据沉淀到一个持久化目录。3. 第一次打开 superpowers界面与核心概念3.1 从主页进入工作区三步搞定服务启动后我习惯先把自己机器上的浏览器打开输入http://localhost:4237。第一次看到的界面通常是一个项目列表里面要么是空的要么有几套示例项目。我当时是先选了个示例项目打开因为我更习惯从“能跑的东西”反推它的底層逻辑。进入项目之后你会看到一个大工作区。左侧一般是资源面板中间是场景视图右侧是属性面板顶部可能还有运行按钮、停止按钮和项目设置。如果你用过 Unity 或 Godot对这个布局不会太陌生如果没有可以把它想象成“可视化编辑器 代码编辑器 播放器”三种东西的合体。打开示例项目后我建议哪都别乱改先点一下“运行”按钮看看它在浏览器里的实际效果。菜单、按钮、运行时提示信息这些都是让你熟悉这套工作流程的引路人。运行不起来也没关系大概率是浏览器问题换 Chrome 或 Edge 试试基本能解决。3.2 理解场景、资源与Actor的关系上手 superpowers 之前有几个高频概念必须先弄清楚否则后面操作会像无头苍蝇一样。第一个是“场景”。场景就是游戏或应用里的一块独立空间一个项目里可以有多个场景不同场景之间可以通过脚本来切换。我习惯把它理解成“一套房子的各个房间”客厅、卧室、厨房都是独立空间但共享水电网络。第二个是“资源”。模型、贴图、声音、脚本文件统统属于资源。资源面板就像仓库你可以把做好的 fbx 动画、png 纹理、音频素材都丢进去然后在场景里引用它们。第三个是“Actor”。Actor 是场景中所有实体的统称。你可以把 Actor 理解为“一个有名字的空盒子”刚开始它什么都没有。你需要往这个空盒子上挂“组件”比如网格渲染组件让它显示形状光源组件让它发光脚本组件让它有行为逻辑。很多科班教程一上来就讲组件系统容易把人绕晕。我的理解方式是场景是舞台Actor 是舞台上的演员组件是演员身上的装备和台词脚本则是演员的行动逻辑。这样的比喻可能不精确但足以帮你快速建立心智模型。3.3 别急着手写代码先试着拖一个方块出来我第一次上手做了个很无聊的事在场景里创建了一个方块然后到处拖拽观察坐标是怎么变的。这个过程看着很小白但非常值得。点场景里的空白处创建一个新的 Actor然后在属性面板找到它的变换组件Transform设置它的位置、旋转和缩放。位置就是它在空间里离原点多远旋转决定它朝向哪边缩放决定它是大是小。把这三个值拖一下场景视图里物体会立刻跟着变化这种即时反馈能让你迅速建立“属性改变 → 结果改变”的直觉。接着在这个 Actor 上添加网格渲染组件你会看到方块变成一个有颜色的实体。再添加一个点光源调整颜色和强度你会发现方块表面开始有了明暗变化。这时候你基本已经理解 superpowers 的“组件是功能的载体”这一设计逻辑了。如果你在这一步什么都没做出来先检查是不是把组件加错了。比如你想在 3D 场景里显示物体却用了 2D 场景的组件那当然不行。创建项目的时候分清楚“3D 项目”和“2D 项目”后面操作就会少很多低级问题。3.4 多人协作是它的灵魂单独一个人用 superpowers它只是一个不错的网页版编辑器。但真正的得分点在于“多人实时协作”。当你的服务端部署好之后只要把服务地址发给队友他们打开浏览器就能进入同一个项目。你会看到他们的光标、视角、选中对象都是实时共享的。这背后其实是服务端维护了一个共享模型每个人在编辑器里的操作都会广播给其他人再通过状态同步保证各方看到的内容一致。这种机制对团队来说非常舒服。以前我们做原型改一版传给另一个人看中间还有“导出、截图、传网盘”这些环节。现在只要大家都在编辑器里你拖一下模型他那边马上就能看到沟通成本直接砍掉了一大截。不过协作也有要注意的地方别同时改同一个脚本文件。虽然编辑器做了同步但多人在同一文件里互相覆盖修改还是会产生混乱。我后来形成的工作习惯是场景搭建阶段大家随意动写代码阶段一人负责一个文件碰事前先语音说一句避免撞车。4. 用 superpowers 做一个可以跑的 3D 小场景4.1 搭场景从灯光到地面先让画面有手势折腾完基础概念我想让你跟着我做一个能跑起来的小场景。目的不是做一个完整的游戏而是把“创建、编写、运行”这条完整链路走一遍之后你想扩展成什么方向都会顺手很多。新建一个 3D 项目然后先做三件事开灯、铺地、放一个主角。开灯的理由很朴素没有光场景里全是黑的什么都看不见。创建一个点光源或方向光把方向和强度调一下让场景亮起来。铺地则是为了避免视觉上没有参考系可以创建一个巨型薄长方体或者用平面组件也行重点是有个东西让你知道“地面在哪”。然后创建一个立方体 Actor把它当作主角。名字我一般会改成一个有意义的比如“Player”而不是留着默认名字。这一步看似不重要其实后面脚本要用它名字一乱逻辑就不好找了。把场景保存好点运行你至少应该能看到一个被光照亮、站在地上的方块。到这一步编辑器层面的操作就没问题了。4.2 用 TypeScript 给 Actor 添加行为superpowers 的脚本组件支持 TypeScript。你不用被这个名词吓到它本质上就是带类型提示的 JavaScript写法和普通前端脚本几乎一致。创建一个脚本资源把它挂到 Player 这个 Actor 上。脚本启动后你可以先从最简单的逻辑开始让方块按键盘方向键移动。我当时写的核心逻辑是这样的伪代码思路在update事件里检测键盘输入根据方向改变 Actor 的位置判断边界别让方块掉出地面范围。放到实际代码语境里你需要拿到当前 Actor 的位置加上一个“位移量”然后赋值回去。位移量 速度 × 时间增量。时间增量这个概念老手都会强调因为它能保证游戏在不同帧率下移动速度一致不会出现性能好的机器上飞一样、性能差的机器上爬一样的情况。写完脚本后回到编辑器点“运行”你的方块就应该能跟着键盘动起来了。如果没反应优先检查脚本是不是挂错 Actor 了以及事件名是否拼写正确。这类问题占新手调试里的七成。4.3 让角色动起来之后再想想视角怎么跟着走角色能移动之后马上就会遇到一个新需求镜头要跟着角色跑。如果不跟按一下按键角色瞬间跑出屏幕你都不知道它去哪了。在 superpowers 里处理镜头跟随的常规做法是让镜头 Actor 和角色建立关系或者挂一个专门控制镜头的脚本。最简单的一种方式是每帧把镜头的位置设置为角色位置加上一个固定偏移。这样镜头永远固定在角色斜后方移动起来很像第三人称视角。这个过程中你会接触到另一个核心概念坐标系的变换。角色移动是世界坐标下的移动“世界坐标系”指整个场景的全局坐标镜头偏移则是相对角色的偏移。理解这两者的区别后不管是做第一人称还是第三人称你的思路都会清晰得多。我当时在这个环节卡了很久原因是角色的移动方向没考虑旋转。角色转到左边按“前进键”却还是沿着世界坐标的 Z 轴移动看起来就像角色在横着走。后来把移动方向改成基于角色自身朝向的局部坐标系问题才解决。这个坑我记得很清楚后面专门写进排查部分。4.4 把做好的场景分享出去导出和部署思路自己本地能跑和能让别人也打开这是两回事。superpowers 的项目最终可以构建成可发布的网页应用构建产物是一堆静态文件。你可以把这些文件放到任何支持静态托管的服务上也可以直接让服务端继续提供预览地址。我一般会在项目完成到稳定可演示的程度后先给同事发一个服务端链接让他们在浏览器里直接打开。这种实时预览的方式效率很高因为不需要他们装任何东西。如果你想进一步把作品变成一个独立的在线页面比如挂到自己的个人网站里那就要了解项目构建命令。具体命令取决于官方文档不同版本会有差异我通常的做法是到项目源码目录下的构建脚本或说明文件里找很少凭记忆硬敲。构建产物生成后整个目录就是一个可用的网页应用复制到任意服务器就能跑。这里有个经验值得分享发布前一定要清掉调试信息和未使用资源。我见过有人把几百 MB 的原始素材全塞进发布包结果页面加载慢到让人失去耐心。精简之后加载速度完全不是一个档次。5. 实际运行中的高频问题与排查建议5.1 浏览器打不开服务页面先查端口和安全组“服务端明明启动了但浏览器访问不到”这是安装类的自托管工具里最常见的求助内容superpowers 也不例外。先把问题拆成几个环节服务端是否真的在监听端口我们可以在服务器上直接访问本地地址。如果本机curl http://127.0.0.1:4237能返回内容说明服务端本身是好的如果本机都访问不了那就检查启动日志看是不是报错后进程已经退出了。本机访问正常但局域网或公网访问不了那问题大概率在防火墙和云安全组。很多云主机默认只放行了 80 和 443 端口自定义端口一律不通。安全组规则里增加一条放行 TCP 端口4237改成你的实际端口即可。还有一种隐蔽情况服务绑定的地址不是0.0.0.0而是127.0.0.1。这就等于服务只对服务器自己开放外部网络自然进不来。启动配置里把监听地址改成0.0.0.0重启后再试通常都能解决。5.2 场景一复杂就卡顿先分清是服务端还是浏览器的问题有人一碰到卡顿就怀疑是服务器性能不行其实多数时候压力都在浏览器端。superpowers 的渲染是在浏览器本地执行的一个复杂场景里如果有大量高模、动态光照、实时阴影再怎么堆服务器配置也救不了浏览器端的渲染压力。排查思路是这样先看运行状态里的 CPU 占用。如果你在场景里拖动物体都很流畅但点“运行”之后特别卡那瓶颈通常在渲染逻辑比如模型面数太高、光源数量太多、角色脚本里有高频运算。优先精简资源把不需要实时光照的地方改成烘焙贴图把距离镜头很远的物体降低显示精度。如果连编辑器操作都卡那才需要考虑服务端性能或网络延迟。服务端卡多表现在操作响应延迟而不是渲染帧率低。这两者容易混淆我建议出现卡顿不要急着加钱升级配置先定位卡在哪一端。5.3 依赖安装失败常见问题和处理路径源码部署时yarn install跑一半报错这种问题几乎每个人都遇到过。依赖安装失败的常见原因就那么几类网络不稳定、Node 版本不兼容、某些原生模块需要编译却缺少构建工具。网络不稳定这个好理解项目依赖来自不同渠道下载中途断流就会失败。可重跑一次安装命令或者配置镜像源能解决大半问题。Node 版本不兼容则需要看你拿到的是哪个版本的项目有的项目要求特定大版本装个版本管理工具切换到对应版本就好了。原生模块编译失败一般会在日志里提示缺python或make之类装上对应系统工具包再重试即可。这里我给一个建议不要一报错就跑去问“怎么解决某一条具体报错”先把完整日志读一遍。很多时候报错原因在日志中上部就写明了只是被一长串堆栈信息盖住你不往前翻就看不到。5.4 多人协作不同步先看服务器连接和文件冲突多人协作时最常见的场景是“一个人动另一个人看不到变化”。这种情况通常不是编辑器本身坏了而是双方其实没连到同一个服务端。有人可能连的是localhost有人连的是局域网 IP虽然界面看起来一样但不是同一个世界。确认方法很简单让所有人都看一眼同一个物体改一下它的位置看其他人那边有没有跟着变。如果全都不变多半是连错了服务地址如果部分能变、部分不能变那就是个别成员的浏览器缓存或连接出了问题刷新页面重新进入即可。另一个问题是多人同时编辑同一个脚本文件导致互相覆盖。我在项目里会提前约定好脚本文件的所有者谁负责哪个逻辑谁就有该文件的编辑权。不要图方便大家都挤在一个文件里改救急一时后面 merge 起来想哭。可以做个简单的问题速查表现象优先排查项处理建议页面打不开端口监听地址改为 0.0.0.0 并放行安全组编辑器整体卡服务端连接质量检查带宽、ping 延迟、CPU 占用运行后卡场景资源复杂度减少高模、动态光和阴影依赖安装失败Node 版本和网络切换 LTS 版本、重试或补构建工具协作不同步服务地址与缓存统一服务入口、刷新重进、避免同文件并发编辑6. 写在最后真实使用后的几点体会如果你也准备安装 superpowers我个人最想强调的一句话是别把它默认成“游戏引擎”它是一个“协作环境”。它的价值不在于渲染效果能跟商业引擎比肩而在于“一群人围着同一个场景实时修改”的磁场效应。我们团队用它做完过一个小型 3D 展示页面技术复杂度不算高但约定速成的协作体验让人印象深刻。第二点体会是部署这事本身不难难的是把使用规则定下来。安装方式千篇一律但项目命名规范、场景资源分类、脚本文件归属这些都得提前约好。我那时候没有强调结果几个人一天生产了一堆叫untitled-1、untitled-2的资源后期整理到崩溃。最后再分享一个从实践中悟到的小技巧尽量让团队成员都从“新建一个最小项目”开始熟悉而不是一上来就打开复杂的示例项目。复杂示例会让你迷失在细节里反而没法建立一套自己的思路。从一个有灯、有地面、有一个能移动的方块开始跑通整个流程再一步步往里面加东西。你会发现所谓的“超级能力”其实都是一个个小循环串联起来的熟能生巧。