GDevelop 开源游戏引擎全解析:无代码 2D/3D/多人游戏开发、技术架构与源码级原理
2026/9/11 15:25:01 网站建设 项目流程

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.jsCoreGDJSExtensions绑定到 JavaScript(含 WebAssembly),供 IDE 使用
newIDE游戏编辑器(JavaScript 编写),基于 React、Electron、PixiJS 与 Three.js
Extensions游戏引擎内置扩展,提供对象、行为与新特性,例如基于 WebAssembly 的物理引擎(2D 的 Box2D、3D 的 Jolt Physics)

3.1 先厘清两个概念:IDE 与 Runtime

在深入代码前,需要区分两个贯穿全仓库的概念(详见架构概览文档):

  • IDE:即"集成开发环境",也就是 GDevelop 编辑器本体。CoreGDJS子目录中名为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主要包含两类内容:

  1. 游戏结构描述:使用 C++ 类描述Project(游戏项目)的完整结构——事件、场景、对象、行为等,集中在 Core/GDCore/Project 目录。从该目录的文件清单(如Behavior.cppCustomObjectConfiguration.cppEventsBasedBehavior.cppEffectsContainer.cpp等)可以看出,对象属性、行为配置、效果容器、事件函数等都以结构化的 C++ 类承载,这也是项目文件能够精确序列化/反序列化的基础;
  2. 结构操作工具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.cppglue.js
  • 构建时由 CMake 决定编译哪些 C++ 源文件(见 GDevelop.js/CMakeLists.txt),依赖的 C++ 头文件统一在Bindings/Wrapper.cpp中导入。
3.4.1 从源码构建 GDevelop.js(需要修改 C++ 时)

一般情况下,编辑器的npm start会自动下载预编译的 libGD.js,无需手动构建 GDevelop.js。仅当你修改了 C++ 扩展或核心类时才需要走以下流程。

  1. 安装前置工具:CMake 3.17+(Linux/macOS 下 3.5+ 即可)、Node.js、Python;
  2. 安装并激活 Emscripten3.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
  1. 每次构建前重新加载 emsdk 环境:Linux/macOS 执行source ./emsdk_env.sh;Windows PowerShell 执行./emsdk_env.ps1
  2. 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 start
3.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):

  1. 声明文件JsExtension.js:面向 IDE 的扩展声明(扩展信息、动作/条件/表达式/对象/行为/属性/依赖等);
  2. 实现文件(Runtime 侧,TypeScript):如extensionnametools.ts(通用函数)、objectnameruntimeobject.ts(对象)、objectnameruntimebehavior.ts(行为)。可参考官方示例扩展 Extensions/ExampleJsExtension 下的dummyruntimeobject.tsdummyruntimebehavior.tsexamplejsextensiontools.ts

5.1 扩展开发的关键 API 速览

  • 声明扩展信息:extension.setExtensionInformation(...)
  • 声明动作/条件/表达式:addActionaddConditionaddExpressionaddStrExpression,用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 从零开始一个新扩展

  1. Extensions目录下以唯一且有描述性的名字创建文件夹;
  2. 在其中创建JsExtension.js,复制一个现有扩展的声明文件作为起点;
  3. 修改setExtensionInformation(第一个参数为扩展内部名,建议与文件夹同名);
  4. 创建yourextensionnametools.ts等运行时文件,声明动作/条件/表达式时用setIncludeFile指定该文件(注意路径从仓库根目录写起,扩展名用 .ts),例如:
.setIncludeFile("Extensions/FacebookInstantGames/facebookinstantgamestools.ts")
  1. 运行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 许可的游戏引擎(见CoreGDJS目录),因此你导出的游戏可以自由分发、出售或做任何事,且没有义务开源你的游戏

这也是该引擎"面向所有人"理念在商业层面的落地:创作者产出归自己所有,引擎与编辑器则保持开源共建。

结语

从仓库根 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询