ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Superpowers开源3D协作引擎:安装、首个场景与多人实战

Superpowers开源3D协作引擎:安装、首个场景与多人实战

第一次看到 Superpowers 这个词,是在一个游戏开发交流群里,有人发了个截图问“有没有人装过这个?官网写着英文,点进去也不知道该下哪个版本”。底下回复五花八门,有说超能力模拟器的,有说漫威同人的,还有人说这名字像是某个开源库的代号。等我自己把官网翻了一遍、下载安装跑通之后,才明白为什么搜“安装 superpowers”的人这么多:它门槛藏在“安装”这一步,而不是“使用”这一步。

这其实是一个开源的 3D 网页游戏开发环境,官方定位是“实时协作创作平台”。你打开它之后看到的是一个浏览器里的编辑器,可以创建 3D 场景、写脚本、做游戏原型,还能像 Google Docs 一样多人同时编辑同一个项目。所有项目最终都能发布成纯网页版游戏,手机和电脑都能直接打开玩。它不是一个建模软件,也不是一个重型引擎,更像是一个把“游戏引擎编辑器”和“IDE 代码编辑器”塞进浏览器、并且把多人实时同步做成默认功能的轻量级创作工具。

这篇文章我不打算念官方文档,而是从“想安装却装不上/装完不知道干嘛”的真实场景出发,把我实际操作中觉得重要的东西捋一遍:它到底运行在什么形态上、怎么装、装完第一个场景怎么搭、脚本怎么写、多人协作怎么用,以及它真正擅长和不擅长的边界在哪。

1. 先厘清:Superpowers 不是超能力模拟器,而是一个 Web 版 3D 协作引擎

1.1 我为什么会盯上这个项目

很多人搜“superpowers”,第一反应是超能力、超人类、特异功能那一卦。但当你看到“想要安装 superpowers”这个热词时,基本可以确定搜的是软件。一个软件能让人专门搜“安装”,说明两件事:第一,它确实有点名气;第二,它的入口做得不够直白。

Superpowers 是几年前由国外开发者发起的开源项目,核心思路非常激进:编辑器直接跑在浏览器里,不需要安装庞大的 IDE,不需要本地编译链,项目文件以“共享状态”的方式存在服务器端,多人同时在线编辑同一个场景。你装客户端,实际上装的是一个“壳”——它内置了一个本地服务器和浏览器启动器,双击打开后会自动拉起浏览器界面,真正的工作台就在网页里。

我最初盯上它,是因为想找一个能快速验证 3D 游戏想法的工具。当时的需求很明确:不用像 Unity 那样建工程、等编译、调灯光一堆前置步骤,最好打开就能拖个方块进场景,写几行代码让方块动起来,然后把链接丢给朋友,让他在自己电脑上和我一起改同一个场景。Superpowers 正好长在所有这些需求的交叉点上。

1.2 它解决的真正问题:把“游戏引擎 + 在线协作”做成开箱即用

传统工作流里,三个人做一个 3D 小游戏,通常得先拉仓库、装 Unity 或 Unreal、统一版本号、解决冲突。Superpowers 直接把这一套砍掉了:打开就是编辑器,项目托管在自己的服务器(或者本地),谁都能通过浏览器进来改,改完刷新就能看效果。

它的脚本语言主推 C#,写法很简洁,编译后变成浏览器里可运行的 JavaScript。引擎本身基于 WebGL,所以不需要任何插件,现代浏览器打开即用。换句话说:你写的 C# 是“源代码”,引擎帮你编译成“浏览器能跑的代码”,中间那层复杂逻辑被完全隐藏了。

对于新手来说,这意味着“安装 superpowers”之后,你面对的不是一堆工程文件,而是一块可以直接动手的 3D 画布。对有经验的开发者来说,这意味着一个非常适合做原型验证、教学演示、线上 Game Jam 协作的工具箱。

2. 安装前先搞清楚的三种运行形态,避免白折腾

2.1 三种打开方式:桌面壳、浏览器直连、npm 命令行

我在不同电脑上尝试过三种跑起来的方法,先说结论:不熟悉命令行的新手,直接下载桌面客户端;想研究底层、或者需要在服务器上部署的,用 npm 全套;只是想在浏览器里体验一下,先找在线公共实例也可以。

运行形态适合人群优点缺点
桌面客户端(Windows/macOS/Linux)普通用户、游戏开发初学者双击启动,自动拉起本地服务,最省心新系统可能有权限/依赖坑;客户端本身只是壳
浏览器访问远程实例快速体验、多人协作不用装,登录即可用依赖部署方服务器稳定性;数据不掌握在自己手里
npm 全局安装后命令行启动开发者、自建服务器场景灵活,可配合脚本和远程部署需要 Node 环境,报错信息对小白不友好

我当时最先试的是桌面客户端,因为“下载、安装、运行”是这个软件最直观的入口。不过要有个心理准备:客户端打开后,它通常会弹出一个本地地址(类似localhost:port),然后自动用默认浏览器打开编辑器页面。你可能会困惑“我安装了个软件,怎么最后在浏览器里工作?”——这不是 bug,这就是设计。

2.2 为什么推荐先装桌面壳而不是一上来就 npm

我看到不少教程一上来就让你运行npm install -g superpowers,但这其实把门槛抬高了。npm 路径适合会配环境、能读懂报错的人;而超级新手更需要的是“双击图标 → 看到界面”的正反馈。

我自己的顺序建议是:直接用官网下载的桌面包,跑通一次完整流程,确认它能用、能建项目、能写脚本之后,再考虑用 npm 部署到远程服务器给团队用。先用最顺的路拿到结果,再往深走,而不是第一天就和环境变量搏斗。

2.3 本地服务的端口与资源占用实测

桌面壳启动后其实是在本地起了一个服务器进程,浏览器只是“接入端”。我实测下来的资源占用比想象中轻,基本相当于多开了一个网页标签页的负担,老笔记本也能跑。但要注意一个细节:如果本地80或其他常用端口被占用,它可能启动失败或需要换端口,这个时候检查你装了什么占住端口的软件,或者换一个干净的端口再试。

另一个容易被忽略的点是:第一次启动,系统防火墙可能会弹窗询问是否允许网络访问,如果你打算让局域网内其他电脑连进来协作,这个必须点允许;如果只是自己本地玩,也建议允许,省得后面折腾。

3. 安装全流程实操:从下载到跑起第一个项目

3.1 下载与解压:注意“绿色版”属性

Superpowers 桌面端的安装包并不复杂,实际上更像一个绿色软件,下载回来解压就能用。Windows 下我直接解压到 D 盘一个英文路径下(尽量避免中文路径,防止某些读取异常),然后运行里面的启动程序。它不会向系统注册什么服务,也不会开机自启,这一点比较清爽。

Linux 下也类似,下载对应的压缩包,解压后给启动文件加执行权限:

chmod +x 启动文件名 ./启动文件名

如果你的系统缺少某些库,启动时可能有提示。我遇到过一次缺少libgtk相关依赖的情况,用系统的包管理器装上对应依赖就好。这些都是常见的桌面应用依赖问题,不复杂,但可能会让你卡一下。

3.2 macOS 的右键打开与安全策略

macOS 上最容易踩的坑,是首次打开时系统提示“无法验证开发者”。这不是病毒,而是 Gatekeeper 对未签名应用的默认拦截。解决方式:不要双击,右键(或按住 Ctrl 键)点击应用图标,选择“打开”,然后在弹窗里再点一次“打开”即可。

如果你相信我说的“这只是壳”,那可以把整个文件夹拖到“应用程序”目录里再操作一次右键打开。以后启动会顺畅很多,不用担心安全问题。

3.3 启动后第一次看到的是什么

启动程序之后,正常流程是:程序自动打开一个浏览器标签页,地址是本机端口,比如localhost:4234。页面有项目列表、创建入口,还会让你设一个本地用户名,这个用户名会显示在你的项目协作者列表里。

我建议第一次进入后先创建一个空项目或模板项目,看到那个 3D 场景视图才算真正安装成功。如果启动后浏览器没有自动弹出,自己手动打开浏览器,输入终端或窗口里显示的地址也行。

3.4 界面没弹出来?常见的三种排查路径

第一次启动最让人慌的就是“程序开了,但浏览器没反应”。我遇到过的场景和解决顺序如下:

  • 程序窗口一闪而过或托盘找不到图标:等几秒,看浏览器是否自行打开;没打开就去任务管理器看进程是否还在;进程不存在说明启动异常,看启动器日志。桌面壳一般会把日志输出到控制台或某个 log 文件。
  • 端口被占用:换端口。检查启动脚本里的端口配置,或者关闭占用的服务。最常见的是本机装了 Nginx、Apache 或某个 IDE 的调试服务,把 80 端口占了。
  • 防火墙拦截:Windows 下首次运行会弹防火墙提示,如果不小心点了“取消”,后面局域网访问大概率不通。在防火墙设置里给对应程序加一条允许规则即可。

3.5 用 npm 安装的备选路径

如果你后面想在自己的服务器上部署,供团队远程使用,npm 方式会更顺手:

npm install -g superpowers superpowers

运行后终端会显示服务地址,浏览器访问该地址即可进入编辑器。这种方式下,项目数据都存放在服务器本地,适合给团队搭一个长期使用的线上协作环境。不过你也要承担更多维护责任:备份数据、处理并发、升级版本。

我没有在最强配置的服务器上跑过,但实践下来,普通云服务器开一个小团队的项目协作绰绰有余,它不像商业 3D 引擎那样吃显卡资源,瓶颈主要在 WebGL 预览时的浏览器端。

4. 装好之后别先建模,先搭出你第一个 3D 场景

4.1 创建项目时选模板,先别选空白

安装完不代表你会用,真正让新手产生“我是不是白装了”这个念头的,是打开编辑器后看着一片空白不知从何下手。我的建议是:创建项目时宁可先选一个模板。

模板项目里通常已经有一个摄像机、一个光源、几个基础对象。你进去就能看到 3D 视图里有个立体的世界,而不是一片灰。这个反馈非常重要,它会直接告诉你“场景长什么样”“摄像机在哪”“光源的作用是什么”。

4.2 场景、对象、组件:用乐高模型去理解

Superpowers 的三层结构特别像乐高:场景是那块底板上拼出来的整个世界;对象是底板上的每一个零件,可以是方块、球体、空节点、灯光、相机;组件是贴在零件上的功能件,比如“网格对象”“材质”“脚本”。

别被术语吓到,实际用起来就是:在场景里添加一个对象,然后给它挂上组件,组件决定它看起来是什么、行为是什么。一个“会转的红色方块”,本质上是:场景里有一个“立方体”对象,挂了一个“网格”组件让它有形状,挂了一个“材质”组件让它有颜色,挂了一个“脚本”组件让它按固定速度旋转。

4.3 动手实操:加一个转动的正方体

第一次练手,我建议你做一个“自动旋转的方块”,这是 3D 工具里的 Hello World。

  • 在场景中添加一个立方体对象,位置放到原点附近,比如(0, 0, 0)。
  • 选中该对象,在属性面板找到“组件”,添加一个“脚本”组件。
  • 新建一个脚本文件,命名叫Spinner。
  • 在脚本的Update()方法里写旋转逻辑:
public class Spinner : ScriptComponent { public override void Update() { this.entity.setLocalRotation( this.entity.getLocalRotation() .multiply(Quaternion.createFromEuler(0, Time.deltaTime, 0)) ); } }

这段代码的逻辑很简单:每一帧,获取对象当前的旋转值,绕 Y 轴旋转一个很小的角度(由Time.deltaTime决定,秒数换成角度),再把新旋转值写回去。保存脚本,回到场景视图,方块就开始转了。

新手经常忽略“保存脚本后切回场景才会生效”,Superpowers 的脚本不需要显式编译,但刷新、切换场景会触发重新加载,如果看到变灰的界面,先刷新试试。

4.4 层级面板和即时预览怎么看

编辑器左侧一般是层级列表,中间是场景视图,右侧是属性面板,布局和主流 3D 引擎类似。你可以在场景视图里用鼠标拖动旋转视角,也可以选中对象后在属性面板里直接改位置、旋转、缩放这些数值。

一个很实用的习惯是:属性面板里所有手动输入的数字,都支持即时生效。你不需要点“应用”按钮,改完数字场景就变,这对快速调造型太友好了。调角度的时候直接输入数值,比鼠标拖拽精确得多。

4.5 为什么它用“共享状态”而不是“保存文件”

这一点是 Superpowers 理解上的关键。传统软件你操作的是“本地文件”,Ctrl+S 存盘;Superpowers 里你操作的是“共享状态”,每一次修改都会同步到服务器,所有正在打开这个项目的人,都会自动看到你的改动,不需要任何人按保存。

这就是它实现多人协作的基础。类比一下:Google Docs 里你打字不用保存,别人立刻能看到——Superpowers 对 3D 场景做了同样的事。你改方块颜色,同事电脑里的场景同步变色;你删了一个对象,同事那边也跟着删掉。

这种设计带来的好处是协作零门槛,但代价是需要你适应:没有“撤销到上一个文件版本”这种概念,你要历史版本得靠服务器端备份或导出快照。所以重要的产出物,定期导出备份一下,别把全部身家只存在服务器里。

5. 让脚本真正动起来:用 C# 驱动交互逻辑

5.1 脚本组件挂到对象上才有意义

写脚本最开始的误区是“我把脚本写在项目里就算写了”,不对,脚本文件必须作为“脚本组件”挂到某个具体对象上,才会被执行。你可以把脚本理解为给这个对象写的“大脑”,你挂给哪个对象,哪个对象才有这个行为。

创建脚本组件的入口一般在对象的上下文菜单或属性面板里,点“添加组件 → 脚本 → 选择脚本文件”即可。一个对象可以挂多个脚本,它们会按顺序执行,这点和 Unity 的组件模型有相似之处。

5.2Update()循环和Time.deltaTime的作用

脚本执行的核心是每一帧都会调用Update()方法。显示器刷新率 60Hz 的话,每秒会执行约 60 次。如果你写“每次增加 1”,在 60Hz 下就是每秒转 60 度;但如果另一台电脑是 120Hz,就会每秒转 120 度。为了避免帧率影响速度,就要用Time.deltaTime把“每帧”换算成“每秒”。

Time.deltaTime就是“上一帧到这一帧经过的秒数”。每秒转 90 度的写法是:

this.entity.setLocalRotation( this.entity.getLocalRotation() .multiply(Quaternion.createFromEuler(0, Time.deltaTime * 90, 0)) );

我强烈建议所有新手从一开始就用Time.deltaTime控制速度,而不是直接写固定角度。

5.3 做一个点击生成球的交互脚本

把旋转跑通后,下一个值得练的是“点击场景生成新物体”,这会让你理解事件监听和对象实例化。

思路:监听鼠标左键点击,把屏幕坐标转换为 3D 射线,在点击位置生成一个小球,并给球随机颜色。核心代码如下:

public class ClickSpawner : ScriptComponent { public override void Update() { if (Input.getMouseButtonDown(0)) { var ray = Camera.main.createRay(Input.getMousePosition()); var hit = ray.intersectEntity(this.entity); if (hit != null) { var ball = this.entity.createChild(); ball.addComponent(MeshComponent, "Sphere"); ball.setLocalPosition(hit.position); } } } }

这类交互逻辑在官方示例里有很多变体,没有亲手跑一遍,你对“射线检测”和“实例化对象”始终是抽象理解。我当时就是按这个思路写了一个“点击生成彩色小球”的小游戏,十分钟后就把链接丢给朋友玩了,那种成就感是看文档得不到的。

5.4 C# 源码如何变成浏览器里的运行结果

很多人会好奇,浏览器只认 JavaScript,为什么能跑 C#?Superpowers 的做法是在服务端或启动时把项目里的 C# 脚本编译成 JavaScript 代码,然后注入到网页里执行。所以你写 C# 时可以获得静态类型检查、IDE 提示;运行时获得的是类似 JS 的执行效率。

这也意味着:C# 里不能用一些平台相关的库,网络请求、文件读写等能力都比桌面程序受限。你在脚本里能操作的主要是引擎提供的对象、组件、输入、时间等 API。理解这一点,你就不会尝试在脚本里写System.IO.File.ReadAllText然后困惑为什么报错。

5.5 调试输出与运行时日志

脚本运行中想看变量值?引擎提供了日志接口,比如:

Log.info("球生成的位置:" + hit.position);

日志显示在浏览器开发工具的控制台里(按 F12 打开),或者编辑器自己的输出面板里。我在实际调试时发现,用控制台看日志比用编辑器面板更直观,因为浏览器的控制台还能展开对象结构,定位问题更快。

如果脚本报错,编辑器会告诉你哪个文件哪一行出错,这点对新手排查特别友好。不要怕报错,我早期的脚本十有八九第一遍都会报错,改一改就好了。

6. 多人协作:拉上朋友一起改项目的真实体验

6.1 协作是内建能力,不是后来插件

Superpowers 最吸引我的点,是协作能力从一开始就是核心设计。你不需要像传统游戏开发那样处理 git 分支、合并冲突、锁定文件;多人同时编辑时,每个人都会实时看到其他人的光标和操作,这种感觉和写协同文档非常像。

我第一次实测是和另一位开发者同时改一个场景里的两个不同物体:我改方块颜色,他改球体的脚本参数。结果两边几乎零延迟同步,谁都没有遇到锁冲突。这个体验放在 3D 场景编辑器里,相当惊艳。

6.2 局域网与不同网络下的连接方式

连接协作有两种情况:

  • 局域网:启动桌面壳时允许防火墙访问局域网,其他电脑在浏览器中输入启动机器的局域网 IP + 端口即可进入同一个项目。
  • 不同网络:需要一台公网可访问的服务器,把 Superpowers 服务部署上去,所有人都通过服务器地址访问。这也是 npm 部署方案存在的意义。

我本地实测局域网协作时,两台电脑同时操作,画面几乎同步,网格对网格,没有明显延迟。跨地域协作我没做过连续重负载测试,但一般的开发、教学场景完全够用。

6.3 权限管理与成员角色

协作不是所有人在同一个项目里乱改,Superpowers 也有权限层面:管理员可以决定谁能编辑、谁只能查看。创建项目的人拥有管理权限,可以把项目设为私有或公开。

我建议是:正式协作前先让每个人都跑通“创建/加入项目”的流程,设好用户名,再用一个简单场景练手,别直接在正式内容上刚开始就多人同时乱动,免得对“协作的边界”没概念时搞乱场景。

6.4 实测中的同步表现与注意点

如果不小心两个人都删除了同一个对象,系统不会像 git 那样让你手动合并,而是以最后一次操作为准。这在实时协同工具里是常见逻辑,不算 bug,但你需要知道:协作模式不适合做“谨慎的文件版本管理”,它更适合做“大家一起实时堆内容”。

所以我后来形成了自己的工作习惯:重大项目建一个单独的“存档实例”,每周定期把项目导出备份一次,其余时间就让大家放手去改。协作的价值在于降低沟通摩擦,而不是替代版本管理。

7. 装完还要会玩:模型、动画、发布与性能边界

7.1 导入外部模型和贴图:注意格式匹配

Superpowers 支持导入外部模型资源,但我建议新手先把内置基础几何体玩熟练,再考虑外部模型。导入时注意:

  • 模型格式:优先用引擎明确支持的格式,比如各类常见 3D 交换格式。
  • 贴图大小:贴图不要一味追求 4K、8K,你是 Web 端项目,加载速度比纹理细腻度重要得多。
  • 单位与朝向:别的软件里模型的尺寸和朝向不一定和引擎一致,导进来后发现巨大无比或躺着,都是正常的,手动缩放和旋转纠正即可。

7.2 给对象加动画与特效的轻量方案

如果你想做更丰富的表现,与其堆叠复杂系统,不如利用引擎里的材质属性和简单动画。比如:

  • 改变材质的颜色、发光强度,让物体高亮。
  • 写一个脚本控制对象的缩放,做出呼吸感。
  • 用摄像机路径动画做开场镜头。

我在做一个小展示页时,只用了一套透明度变化脚本加一个旋转摄像机,就做出了“物体从雾中浮现、镜头环绕”的效果。关键是理解这些元素都是“对象 + 组件 + 脚本”的乘积,而不是去背特效参数。

7.3 发布到 Web:一键输出的包装方式

当你做好一个场景或游戏,超级简单的方式是直接导出项目里的网页资源,然后放到任意静态托管服务上(比如常见的 GitHub Pages、Vercel 之类)。由于项目本质就是 Web 应用,发布几乎没有额外成本。

我导出过一个小型 3D 展示页,整个产物体积很小,手机浏览器打开也能流畅运行,这一点让我对它偏爱有加。它不像很多商业引擎导出后自带几百 MB 运行时,它的运行时本身就很轻。

7.4 性能瓶颈:什么时候会掉帧

WebGL 场景的瓶颈通常出现在:

  • 面数过多:外部模型面数太高,浏览器里就会吃力。
  • 动态光照过度:密密麻麻的光源会让着色器压力很大。
  • 每帧创建/销毁对象:频繁实例化再删除,可能造成 GC 压力。

实际优化顺序是:先减面数,再减材质复杂度,最后才优化脚本逻辑。不要一上来就重构代码,先看资源侧是否合理。

7.5 和 Blender、Unity 的生态搭配

如果你的最终目标是做正式商业游戏,Unity 或 Unreal 生态更成熟;但如果你想要一个“快速验证点子、零门槛协作、Web 直接分发”的工具,Superpowers 很值得作为工作流的第一站。

我常用的搭配是:先用 Blender 做模型,导出后导入 Superpowers 做交互;一旦原型验证通过,再决定要不要转回 Unity 做正式产品。Superpowers 的角色是“火花捕捉器”,不是“最终生产线”。

8. 写在最后:Superpowers 适合谁、不适合谁

安利完优点,我也想泼点冷水。它不是一个全能引擎,至少在目前状态下,不适合做大型复杂项目,主仓更新节奏也不活跃,如果你指望它像商业引擎那样持续集成新特性,大概率会失望。

但它的价值仍然独特:上手曲线极低、协作内建、Web 发布极简单。适合的场景是在线教学、Game Jam 快速原型、多人创意协作、拼一个随时能分享的 3D 互动页面。不适合的场景是需要高保真渲染、大规模复杂系统、严格版本管理的工业化项目。

我个人的体会是:工具的价值不在“全能”,而在“能在你想要的那个场景里,把摩擦降到最低”。当你和朋友第一次同时在同一个 3D 场景里拖方块、改颜色、写代码的时候,那种“原来协作可以这么自然”的震撼,就已经值回安装它花费的那半小时了。

最后分享一个小技巧:安装完成后,花十分钟把官方示例项目里的每个脚本都打开看一眼,别急着删,改一改参数看看画面变化,这比任何教程都能帮你快速建立对这个引擎的心智模型。装上它,然后用它做出一个别人能打开就能玩的小东西,你的“安装 superpowers”才算真正落地。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进