GDevelop 开源游戏引擎全解析:无代码 2D/3D/多人游戏开发、技术架构与源码级原理
【免费下载链接】GDevelop🎮 Open-source, cross-platform 2D/3D/multiplayer game engine designed for everyone.项目地址: https://gitcode.com/GitHub_Trending/gd/GDevelop
GDevelop 是一款全功能、无代码、开源的游戏开发软件,可同时面向 iOS、Android、桌面端与 Web 构建 2D、3D 及多人游戏,其核心是易学却强大的事件系统与模块化的行为(Behavior)体系,并支持 AI 辅助创作。本文以仓库根目录 README.md 为主体,结合 Core/GDevelop-Architecture-Overview.md 与各子模块源码,系统讲解 GDevelop 的项目定位、快速入门路径、五层技术架构(Core / GDJS / GDevelop.js / newIDE / Extensions)、事件到代码的生成原理,以及本地开发、构建与扩展开发的完整实战方案。
GDevelop 编辑器编辑 3D 游戏关卡界面
一、项目定位:为每个人设计的跨平台游戏引擎
根据仓库根 README.md 的描述,GDevelop 的定位可归纳为四个关键词:
- 全功能(full-featured):对象、行为、事件、物理、特效、多人联机等能力一应俱全;
- 无代码(no-code):以易理解的事件系统替代传统编程,普通创作者也能构建完整游戏;
- 开源(open-source):编辑器、游戏引擎与全部内置扩展均以 MIT 许可开放;
- 跨平台(cross-platform):一次创作,可导出到移动端(iOS/Android)、桌面端与 Web,并支持 2D、3D 与多人游戏。
GDevelop 编辑器编辑 2D 游戏关卡界面
值得一提的是,项目在开发与运行时都引入了AI 辅助能力("Create with AI that assists or builds alongside you"),既可作为创作助手,也可与创作者并行完成构建任务。
提示:仓库顶部还展示了用 GDevelop 制作的游戏合集图(newIDE/GDevelop games.png),这些游戏可在 gd.games 游戏平台以及 Steam、App Store、Google Play、Itch.io、Newgrounds、CrazyGames、Poki 等渠道看到,用于了解该引擎的实际产出形态。
二、快速入门:按角色选择行动路径
README 用一张"我想做什么"的对照表给出了不同角色的入口:
| 目标 | 行动 |
|---|---|
| 🎮 用 GDevelop 做游戏 | 访问 GDevelop 官网下载应用 |
| ⚙️ 创建/改进扩展 | 阅读扩展创建文档,支持无代码或写代码两种方式 |
| 🧑💻 为编辑器或游戏引擎做贡献 | 跟随 newIDE/README.md |
| 👾 创建或出售游戏模板 | 向 Asset Store 提交免费示例或付费模板 |
| 🎨 分享或出售资源包 | 向 Asset Store 提交免费或付费资源包 |
| 🌐 帮助翻译 GDevelop | 加入 Crowdin 翻译项目,或翻译应用内教程 |
| 👥 获取在线游戏服务或商业支持 | 查看面向专业人士、团队或个人创作者的服务方案 |
对于第一次参与贡献的开发者,README 建议从以下入口入手:
- good first issues列表:标注了适合新手的 GitHub issue;
- good first contributions讨论区;
- 路线图(Roadmap)上标注为"🏐 not too hard"的卡片。
三、技术架构:五大目录的分工与协作
README 明确写道,GDevelop 由编辑器(editor)、游戏引擎(game engine)、扩展生态(ecosystem of extensions)以及在线服务与商业支持组成。源码层面,仓库被划分为五个核心目录,这一结构在 Core/GDevelop-Architecture-Overview.md 中有更完整的阐述:
| 目录 | 说明 |
|---|---|
Core | 核心类库(C++),描述游戏结构,并提供实现 IDE 与操作 GDevelop 游戏所需的工具 |
GDJS | 游戏引擎(TypeScript 编写),基于 PixiJS 与 Three.js 实现 2D/3D 渲染(WebGL),驱动所有 GDevelop 游戏 |
GDevelop.js | 将Core、GDJS、Extensions绑定到 JavaScript(含 WebAssembly),供 IDE 使用 |
newIDE | 游戏编辑器(JavaScript 编写),基于 React、Electron、PixiJS 与 Three.js |
Extensions | 游戏引擎内置扩展,提供对象、行为与新特性,例如基于 WebAssembly 的物理引擎(2D 的 Box2D、3D 的 Jolt Physics) |
3.1 先厘清两个概念:IDE 与 Runtime
在深入代码前,需要区分两个贯穿全仓库的概念(详见架构概览文档):
- IDE:即"集成开发环境",也就是 GDevelop 编辑器本体。
Core与GDJS子目录中名为IDE的文件夹,存放的类与工具仅对编辑器有用,并非描述游戏结构所必需; - Runtime:指游戏运行时使用的类、工具与源码,即"引擎"本身。
GDJS/Runtime目录就是 GDevelop 的游戏引擎。
以变量系统为例可以更直观地看到二者的差异:
- 编辑器侧的
gd::Variable(C++ 类,位于 Core/GDCore/Project 体系下)负责描述游戏结构,在编辑器中展示、随项目文件持久化保存; - 引擎侧的
gdjs.Variable(TypeScript 类,位于 GDJS/Runtime)是游戏运行期间实际使用的对象。
架构文档特别指出:编辑器侧的gd::Variable完全不知道引擎侧gdjs.Variable的存在;反之引擎侧也几乎不了解编辑器侧(仅了解其 JSON 序列化格式以加载游戏默认变量)。这种"双向解耦"是整个架构分层的关键设计。
3.2 Core:描述游戏结构的 C++ 核心库
Core/GDCore主要包含两类内容:
- 游戏结构描述:使用 C++ 类描述
Project(游戏项目)的完整结构——事件、场景、对象、行为等,集中在 Core/GDCore/Project 目录。从该目录的文件清单(如Behavior.cpp、CustomObjectConfiguration.cpp、EventsBasedBehavior.cpp、EffectsContainer.cpp等)可以看出,对象属性、行为配置、效果容器、事件函数等都以结构化的 C++ 类承载,这也是项目文件能够精确序列化/反序列化的基础; - 结构操作工具:
Core/GDCore/IDE目录提供对游戏结构进行批量操作的能力。例如 WholeProjectRefactorer.cpp 是功能强大的重构工具,可用于重命名游戏中的所有对象、在对象被删除后更新事件引用、执行跨项目(Project-wide)重构;该目录还包含项目资源操作工具与事件内搜索工具。
3.3 GDJS:TypeScript 游戏引擎 + C++ 平台层
README 将GDJS描述为"用 TypeScript 编写、使用 PixiJS 与 Three.js 渲染(WebGL)的游戏引擎"。结合 GDJS/README.md 可以看到它实际由两部分构成:
- GDJS Runtime(游戏引擎):位于
GDJS/Runtime目录,全部用 TypeScript 编写,是游戏中真正执行的部分。从 runtimegame.ts 的源码可以看到引擎的顶层设计:gdjs.RuntimeGame负责管理项目数据、全局资源与压缩方式探测(如CompressionStream的 gzip/deflate 支持检测),并持有热重载所需的脚本文件哈希信息; - GDJS Platform(平台层):位于
GDJS/GDJS目录,是 C++ 编写的"IDE 侧"代码,负责向编辑器描述导出流程(GDJS/GDJS/IDE)、内置扩展(GDJS/GDJS/Extensions/Builtin)以及从事件生成 JS 代码(GDJS/GDJS/Events/CodeGeneration)等能力。
3.3.1 构建 GDJS Runtime 的命令与选项
根据 GDJS/README.md,构建游戏引擎的命令如下(在GDJS目录下执行npm install安装依赖后运行):
# 标准生产构建(默认,启用压缩/混淆) npm run build # 调试构建(不压缩,便于调试) npm run build -- --debug # 调试构建 + 自定义输出目录 npm run build -- --debug --out=./debug-build类型检查与测试:
npm install && npm run check-types # TypeScript 类型检查 cd GDJS/tests && npm install && npm test # 运行引擎测试(Karma)3.4 GDevelop.js:把 C++ 核心桥接到 JavaScript
GDevelop.js的价值在于让 C++ 编写的 Core 与平台层能在浏览器或 Node.js 中运行——这正是编辑器可以"完全用 JavaScript 编写并跑在浏览器里"的原因(详见 GDevelop.js/README.md)。
- 编译工具链使用Emscripten:它不是生成原生二进制,而是生成能在浏览器中运行的文件(即 JavaScript + WebAssembly);
- 最关键的文件是 GDevelop.js/Bindings/Bindings.idl,它声明了所有需要暴露给 JavaScript 的 C++ 类。约 90% 的场景下,读写某个类只需修改这个 IDL 文件,再由 Emscripten WebIDL Binder 自动生成
glue.cpp与glue.js; - 构建时由 CMake 决定编译哪些 C++ 源文件(见 GDevelop.js/CMakeLists.txt),依赖的 C++ 头文件统一在
Bindings/Wrapper.cpp中导入。
3.4.1 从源码构建 GDevelop.js(需要修改 C++ 时)
一般情况下,编辑器的
npm start会自动下载预编译的 libGD.js,无需手动构建 GDevelop.js。仅当你修改了 C++ 扩展或核心类时才需要走以下流程。
- 安装前置工具:CMake 3.17+(Linux/macOS 下 3.5+ 即可)、Node.js、Python;
- 安装并激活 Emscripten
3.1.21:
git clone https://github.com/emscripten-core/emsdk/ cd emsdk && git pull ./emsdk install 3.1.21 ./emsdk activate 3.1.21 # Windows 下还需:pip install setuptools- 每次构建前重新加载 emsdk 环境:Linux/macOS 执行
source ./emsdk_env.sh;Windows PowerShell 执行./emsdk_env.ps1; - 在
GDevelop.js目录构建:
npm install # 仅首次 npm run build # 每次 C++ 变更后调试变体(便于排查栈与内存问题):
npm run build -- --variant=debug # 带调试信息 npm run build -- --variant=debug-assertions # 断言 + SAFE_HEAP=1,定位内存 bug npm run build -- --variant=debug-sanitizers # 内存消毒器,运行极慢3.5 newIDE:基于 React + Electron 的编辑器
newIDE是 GDevelop 5 编辑器本体,技术栈为React、Material-UI、Pixi.js、Three.js 与 Electron(桌面壳)。从 newIDE/app/package.json 的依赖清单可以验证:包含@material-ui/core(界面组件库)、react-scripts(构建脚手架)、@storybook/*(UI 组件开发环境)、flow-bin(类型检查)以及typescript等,覆盖了从界面开发到类型安全再到组件测试的完整工程化链路。
3.5.1 本地安装与启动
git clone https://github.com/4ian/GDevelop.git cd GDevelop/newIDE/app npm install # 或 yarn npm start # 或 yarn start,在浏览器打开编辑器npm start会复制图片资源、GDJS Runtime 与扩展到资源目录,并自动下载 libGD.js;若想使用自己构建的 GDevelop.js(例如修改了原生扩展),可按上文方式自行构建后启动。
Linux 常见问题:若报错
Error: watch GD/newIDE/app/some/file ENOSPC,说明文件监听句柄耗尽,按系统 inotify 上限调整方案处理即可。
3.5.2 桌面端(Electron)开发
开发桌面应用时,必须先在app目录保持npm start运行(开发模式下即便是桌面应用也由本地服务器提供页面),再另开终端启动 Electron 壳:
cd newIDE/app && npm start # 终端一,保持运行 cd newIDE/electron-app # 终端二 npm install # 或 yarn npm run start # 或 yarn start3.5.3 质量保障命令与组件开发
cd newIDE/app npm run test # 单元测试 npm run flow # Flow 类型检查 npm run format # 代码自动格式化 npm run storybook # Storybook 组件游乐场,便于 UI 组件快速开发与测试3.5.4 可移植构建与 CLI 无头导出(CI 场景)
newIDE/README.md还提供了一种构建"便携包"的方式:生成无需安装、无签名、可自解压的 zip,供 CI 或无头环境执行命令行导出:
cd newIDE/electron-app npm install # Linux / macOS GD_PORTABLE_BUILD=true npm run build -- --publish never # Windows (PowerShell) $Env:GD_PORTABLE_BUILD='true'; npm run build -- --publish never解压后即可用 CLI 无头执行导出命令:
# Linux(需安装依赖:sudo apt install -y libnss3 libasound2t64) ./gdevelop --no-sandbox --disable-update-check \ --run-command EXPORT_HTML5_EXTERNAL /path/to/game.json # 导入一个或多个扩展并保存项目(--cmd-args 可重复) ./gdevelop --no-sandbox --disable-update-check \ --run-command IMPORT_EXTENSION_AND_SAVE /path/to/game.json \ --cmd-args /path/to/FirstExtension.json --cmd-args /path/to/SecondExtension.json额外的可用参数包括:--keep-open(命令执行后不退出)、--dev-tools(打开开发者工具)、--block-on-diagnostic-errors/--no-block-on-diagnostic-errors(项目存在诊断错误时是否让导出失败)。若同一项目已在运行的编辑器中打开,命令会在该窗口执行(fire-and-forget 方式,CLI 不等待真实结果);否则在无头模式下执行并以真实退出码结束(适合 CI)。Windows 下使用 NSIS 安装器时安装目录会自动加入用户PATH,可直接运行GDevelop --run-command ...。
四、事件系统与代码生成原理
架构概览文档对"事件"给出了精确定义:
- 默认的事件(
gd::BaseEvent)基本是"空"的,在传统编程语言中可类比为一个作用域或代码块(如{ some code here }); - 内置事件类型定义于 Core/GDCore/Events/Builtin,其中
StandardEvent包含条件(conditions)与动作(actions),二者都是一组gd::Instruction; - 一条
gd::Instruction本质上是"一个类型(动作/条件的名字)+ 若干参数",可以理解为编程语言中的一次函数调用;而条件是一种特殊函数——返回 true/false,并可能用于对后续条件与动作所拾取(picked)的对象集合做过滤。
为什么游戏中看不到"运行时事件"?架构文档给出了明确答案:它们在导出时被翻译(transpile/生成)为真正的编程语言代码,这个过程称为 Code Generation(代码生成),对应 TypeScript 引擎的实现位于 GDJS/GDJS/Events/CodeGeneration。也就是说,你在编辑器中编排的事件,最终会被编译成游戏引擎中实际执行的 JS/TS 代码——这也是"无代码创作"背后的工程实现核心。
五、扩展(Extensions):引擎的"插件化"体系
GDevelop 的架构哲学是:让引擎保持精简,几乎所有对象、行为、特效、动作、条件与表达式都来自扩展。README 将扩展分为三处(架构文档中有详细解释):
| 位置 | 作用 |
|---|---|
Core/GDCore/Extensions | 内置(builtin)扩展的声明,任何游戏都必然包含,相当于"标准库" |
GDJS/GDJS/Extensions | 复用上述声明并追加自身声明,主要指定每个动作/条件/表达式要调用的函数名(TypeScript 或 C++) |
Extensions | 非必需的"模组/插件",独立工作,不属于 GDCore 核心 |
每个扩展通常由两部分组成(详见 newIDE/README-extensions.md):
- 声明文件
JsExtension.js:面向 IDE 的扩展声明(扩展信息、动作/条件/表达式/对象/行为/属性/依赖等); - 实现文件(Runtime 侧,TypeScript):如
extensionnametools.ts(通用函数)、objectnameruntimeobject.ts(对象)、objectnameruntimebehavior.ts(行为)。可参考官方示例扩展 Extensions/ExampleJsExtension 下的dummyruntimeobject.ts、dummyruntimebehavior.ts与examplejsextensiontools.ts。
5.1 扩展开发的关键 API 速览
- 声明扩展信息:
extension.setExtensionInformation(...); - 声明动作/条件/表达式:
addAction、addCondition、addExpression、addStrExpression,用addParameter(...)链式声明参数,再用getCodeExtraInformation()配合setFunctionName/setIncludeFile指定要调用的函数与包含文件;异步动作使用setAsyncFunctionName,可返回gdjs.PromiseTask(yourPromise); - 声明对象:
extension.addObject(...),配合gd.ObjectJsImplementation()实现属性读写;声明行为:extension.addBehavior(...),配合gd.BehaviorJsImplementation(),需要共享数据时实现gd.BehaviorSharedDataJsImplementation(); - 声明扩展属性(全局配置值):
registerProperty(...),运行时通过runtimeGame.getExtensionProperty("ExtensionName", "PropertyName")读取(属性不存在时返回 null); - 声明外部依赖:
addDependency()支持 npm 包与 Cordova 插件,可附加插件变量(如 AdMob 的ADMOB_APP_ID); - 声明 PixiJS 渲染器:实现
registerInstanceRenderers,让对象实例在场景编辑器中正确渲染。
5.2 从零开始一个新扩展
- 在
Extensions目录下以唯一且有描述性的名字创建文件夹; - 在其中创建
JsExtension.js,复制一个现有扩展的声明文件作为起点; - 修改
setExtensionInformation(第一个参数为扩展内部名,建议与文件夹同名); - 创建
yourextensionnametools.ts等运行时文件,声明动作/条件/表达式时用setIncludeFile指定该文件(注意路径从仓库根目录写起,扩展名用 .ts),例如:
.setIncludeFile("Extensions/FacebookInstantGames/facebookinstantgamestools.ts")- 运行
node import-GDJS-Runtime.js导入声明与运行时,然后按需重载编辑器(Ctrl+R / Cmd+R)验证;修改运行时文件后重新启动游戏预览并检查开发者控制台。控制台出现Loaded x JS extensions.说明扩展已加载,GDJS Runtime update说明改动已自动导入。
部分扩展仍以 C++ 声明(
JsExtension.cpp/Extension.cpp),这通常是为了兼容 GDevelop 4,修改它们需要安装并构建 GDevelop.js(见上文 3.4.1)。
六、仓库配套资产与贡献指南
- 架构总览:想深入理解目录分层、事件模型与 GDevelop.js 桥接,推荐精读 Core/GDevelop-Architecture-Overview.md,本文第三节的大部分概念均出自该文档;
- IDE 开发与贡献:完整的安装、启动、测试、主题(newIDE/README-themes.md)、扩展(newIDE/README-extensions.md)说明见 newIDE/README.md;
- 引擎与平台层:见 GDJS/README.md 与 Core/README.md;
- 快速克隆与构建脚本:仓库提供 gitCloneAndBuildGD.bat 一键克隆、构建并运行 IDE 的脚本;
- 翻译协作:通过 Crowdin 上的 GDevelop 项目贡献翻译;
- 路线图与讨论:功能建议请前往路线图(Trello)与 GitHub Discussions;技术问题与 bug 反馈走 GitHub Issues;首次贡献建议从 good first issues 开始。
七、许可证与导出版权说明
README 的 License 一节给出了明确的许可边界:
- MIT 许可:
Core(核心库)、GDJS(原生与 HTML5 游戏引擎)、newIDE(编辑器)以及Extensions(全部扩展)均采用 MIT 许可; - 专有资产:GDevelop 名称与 logo 为 Florian Rival 的专有财产;
- 导出游戏的自由度:GDevelop 导出的游戏基于 MIT 许可的游戏引擎(见
Core与GDJS目录),因此你导出的游戏可以自由分发、出售或做任何事,且没有义务开源你的游戏。
这也是该引擎"面向所有人"理念在商业层面的落地:创作者产出归自己所有,引擎与编辑器则保持开源共建。
结语
从仓库根 README.md 出发可以看到,GDevelop 不是单一体量的"一个大编辑器",而是一套精心分层、C++ 与 TypeScript 协同、通过 WebAssembly 桥接、以扩展为插件化边界的完整生态:Core描述游戏结构,GDJS提供运行引擎与导出平台,GDevelop.js打通浏览器与原生之间的鸿沟,newIDE承载 React 编辑器体验,Extensions让能力无限延伸。无论你是想用它直接创作游戏、为引擎贡献代码、还是开发自己的扩展,理解这套架构都能让你的上手与协作事半功倍。
【免费下载链接】GDevelop🎮 Open-source, cross-platform 2D/3D/multiplayer game engine designed for everyone.项目地址: https://gitcode.com/GitHub_Trending/gd/GDevelop
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考