项目介绍
Dora SSR 是一款跨平台的游戏引擎,提供前沿或是具有探索性的游戏开发功能。它内置了Web IDE,提供了可以轻轻松松通过浏览器访问的快捷游戏开发环境,特别适合于在新兴市场如国产游戏掌机和其它移动电子设备上直接进行游戏开发和编程学习。
项目详情
多萝珍奇引擎(Dora SSR)
Web IDE · Coding Agent
真机开发游戏引擎
English | 中文
Dora SSR 是一款跨平台游戏引擎,直接运行在游戏的目标设备上——手机、掌机或桌面电脑。通过同一网络内任意浏览器打开内置的 Web IDE,即可针对真实运行时编写、检查与迭代代码,而不是脱离设备的预览;引擎还内置了 AI 编程智能体。支持原生运行于 Android、iOS、Windows、macOS、Linux 与 鸿蒙。
浏览器中的 Web IDE,实时编辑运行在设备上的代码。
为什么选择 Dora SSR
- 针对真实运行时开发。 引擎运行在目标设备上,浏览器只是一扇窗。所改即所运行——没有模拟器、没有导出步骤、也没有脱离设备的预览。
- 浏览器里的完整工具链。 Web IDE 提供项目文件、类型化编辑、补全、诊断与定义跳转,并内置动画、粒子、物理、剧本、Git 等常用编辑器。
- 内置 AI 编程智能体。 编程智能体 将 LLM 辅助开发带入 Web IDE——支持项目技能、持久记忆、API 查询、安全编辑、构建检查、运行时验证与子智能体派发。
引擎在设备上,开发随时随地。
内置编程智能体
你可以让它分析项目、查询 API、安全地修改代码并验证运行结果。智能体在引擎内部工作,具备持久记忆、项目技能与子智能体派发能力。
内置编辑器
常见的游戏制作任务都在 Web IDE 内完成:
动画编辑器 —— 骨骼动画时间线
粒子编辑器 —— 实时预览特效
物理编辑器 —— 编辑碰撞体
Yarn 编辑器 —— 剧本与节点图
可视化脚本编辑器 —— 用节点搭建逻辑
Spine 预览 —— 检查骨骼动画数据
Git 客户端 —— 提交历史与变更
性能分析器 —— 运行时调试与剖析
此外还内置:TIC-80 编辑器、瓦片地图支持、Excel 到数据库的工作流,以及 Scratch 风格的 Blockly 可视化编程。
运行时能力
- 场景与 3D —— 树形 2D / 3D 场景、易用的 ECS 模块、相机、材质、光照、模型、动画与 3D 物理。
- 2D 制作 —— Spine2D、DragonBones、内置骨骼动画、PlayRho 物理、瓦片地图、粒子与复古 TIC-80 内容。
- 图形与媒体 —— 异步资源加载、Ogg/Theora 视频、多格式空间音效、运行时 shader 编译、Effekseer、NanoVG、ImGui 与 TrueType 字体渲染。
- UI 与叙事 —— CSS Flex 布局、响应式 TSX 界面与 Yarn Spinner 故事系统。
- 数据 —— 异步访问 SQLite,并提供 Excel 到数据库的工作流。
- 游戏模式 —— 2D 平台游戏的可复用逻辑与 AI 框架,以及机器学习玩法框架。
开发语言
用团队熟悉的语言编写游戏代码——它们调用的是同一套引擎 API:








更习惯积木块而不是代码?Blockly 提供 Scratch 风格的可视化编程,适合教学与原型开发。
TSX 尝鲜——使用 React 风格 API 声明式地搭建场景,由 TSTL 编译:
import { React, toNode } from 'DoraX';
import { Ease } from 'Dora';
toNode(
)?.slot("Count", (_, param) => print(param));TSX 代码与其渲染出的响应式界面,实时运行在原生运行时中。
全部支持语言的 Hello World
Lua
local _ENV = Dora
local sprite = Sprite("Image/logo.png")
sprite:once(function()
for i = 3, 1, -1 do
print(i)
sleep(1)
end
print("Hello World")
sprite:perform(Sequence(
Scale(0.1, 1, 0.5),
Scale(0.5, 0.5, 1, Ease.OutBack)
))
end)Teal
local sleep = require("sleep")
local Ease = require("Ease")
local Scale = require("Scale")
local Sequence = require("Sequence")
local Sprite = require("Sprite")
local sprite = Sprite("Image/logo.png")
if not sprite is nil then
sprite:once(function()
for i = 3, 1, -1 do
print(i)
sleep(1)
end
print("Hello World")
sprite:perform(Sequence(
Scale(0.1, 1, 0.5),
Scale(0.5, 0.5, 1, Ease.OutBack)
))
end)
endYueScript —— 有关 Dora SSR 所支持的这门小众语言的故事在这里。
_ENV = Dora
with Sprite "Image/logo.png"
\once ->
for i = 3, 1, -1
print i
sleep 1
print "Hello World!"
\perform Sequence(
Scale 0.1, 1, 0.5
Scale 0.5, 0.5, 1, Ease.OutBack
)TypeScript
import { Sprite, Ease, Scale, Sequence, sleep } from 'Dora';
const sprite = Sprite("Image/logo.png");
if (sprite) {
sprite.once(() => {
for (let i of $range(3, 1, -1)) {
print(i);
sleep(1);
}
print("Hello World");
sprite.perform(Sequence(
Scale(0.1, 1, 0.5),
Scale(0.5, 0.5, 1, Ease.OutBack)
))
});
}TSX 响应式风格 —— toNode() 适合一次性的静态场景构建;需要根据数据变化更新 TSX 树时,可以使用 createRoot() 配合 signal() 进行 diff 渲染。新手教程参见这里。
import { React, createRoot, signal } from 'DoraX';
import { Director } from 'Dora';
const count = signal(0);
const root = createRoot(Director.entry);
root.render(() => (
Count: {count.value}
));
count.value += 1;Wa —— 作为脚本语言运行在 Dora SSR 内置的 WASM 运行时上,并获得热重载的开发体验。
import "dora"
func init {
sprite := dora.NewSpriteWithFile("Image/logo.png")
sprite.RunActionDef(
dora.ActionDefSequence(&[]dora.ActionDef{
dora.ActionDefEvent("Count", "3"),
dora.ActionDefDelay(1),
dora.ActionDefEvent("Count", "2"),
dora.ActionDefDelay(1),
dora.ActionDefEvent("Count", "1"),
dora.ActionDefDelay(1),
dora.ActionDefScale(0.1, 1, 0.5, dora.EaseLinear),
dora.ActionDefScale(0.5, 0.5, 1, dora.EaseOutBack),
}),
false,
)
sprite.Slot("Count", func(stack: dora.CallStack) {
stack.Pop()
param, _ := stack.PopStr()
dora.Println(param)
})
}Rust —— 编写 Rust 代码并构建为名为 init.wasm 的 WASM 文件,上传到引擎中加载运行。详情见这里。
use dora_ssr::*;
fn main () {
let mut sprite = match Sprite::with_file("Image/logo.png") {
Some(sprite) => sprite,
None => return,
};
let mut sprite_clone = sprite.clone();
sprite.schedule(once(move |mut co| async move {
for i in (1..=3).rev() {
p!("{}", i);
sleep!(co, 1.0);
}
p!("Hello World");
sprite_clone.perform_def(ActionDef::sequence(&vec![
ActionDef::scale(0.1, 1.0, 0.5, EaseType::Linear),
ActionDef::scale(0.5, 0.5, 1.0, EaseType::OutBack),
]));
}));
}使用 Dora SSR 制作的游戏
Loli War
Zombie Escape
Dismantlism
Luv Sense Digital
- 参考 Dora-Example 了解各项 API 与引擎能力的最小用法。
- 参考 Dora-Demo 了解完整项目如何组织资源、脚本与游戏逻辑。
安装
Android
- 在目标设备上下载并安装 APK。
- 启动软件,它会显示一个地址,供同一网络内其他设备的浏览器访问。
- 在浏览器中打开该地址,即可进入 Web IDE。
Windows
[!IMPORTANT]
请先安装 Visual Studio 2022 的 X86 Visual C++ 可再发行组件包。
下载并解压软件,启动后通过浏览器访问显示的地址。
macOS
brew install --cask ippclub/tap/dora-ssr启动软件,并通过浏览器访问显示的地址。
Linux
Ubuntu Jammy
sudo add-apt-repository ppa:ippclub/dora-ssr
sudo apt update
sudo apt install dora-ssrDebian Bookworm
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 9C7705BF
sudo add-apt-repository -S "deb https://ppa.launchpadcontent.net/ippclub/dora-ssr/ubuntu jammy main"
sudo apt update
sudo apt install dora-ssr启动软件,并通过浏览器访问显示的地址。
编译构建引擎
详见官方文档。





从安装到第一个游戏
- 在 Web IDE 左侧的
工作空间上打开右键菜单,新建一个文件夹作为项目。 - 在项目下新建入口文件,命名为
init,可选 Lua、YueScript、Teal、TypeScript 或 TSX(见「开发语言」)。 - 按下
Ctrl + R,或点击编辑器右下角🎮图标并选择运行,游戏即在设备上运行。 - 右键项目文件夹并选择
下载,导出打包后的项目文件。
[!TIP]
快速上手教程有更详细的图文说明。
文档与社区
- 学习 —— 快速上手 · API 参考 · DeepWiki 问答
- 社区 —— Discord · QQ 群 512620381
- 示例 —— Dora-Example · Dora-Demo
Dora SSR 由 I++ 俱乐部开发维护,欢迎加入我们!
参与贡献
欢迎参与 Dora SSR 的开发和维护!提交 Issue 和 Pull Request 前,请先阅读贡献指南。
开放原子开源基金会
Dora SSR 现为开放原子开源基金会的捐赠与孵化期项目。我们将继续致力于建设一个更开放、更协作的游戏开发环境。
许可证
Dora SSR 使用 MIT 许可证。
[!NOTE]
请注意,Dora SSR 集成了 Spine 运行时库,这是一个商业软件。在你的项目中使用 Spine 运行时需要获取 Esoteric Software 提供的有效商业许可证。有关获取许可证的更多详细信息,请访问 Spine 官方网站。
请确保遵守所有许可要求,再在项目中使用 Spine 运行时。或者可以使用同样集成的开源 DragonBones 系统作为动画系统的替代方案。如果你只需要创建比较简单的动画,也可以使用 Dora SSR 提供的 Model 动画模块看是否能满足需要。




