
说实话我见过太多号称无代码做游戏的工具了大部分要么是把你锁死在固定模板里要么就是把配置项做得比写代码还抽象劝退效果一流。所以当我在 GitHub 上刷到 GDevelop 的时候第一反应是又一个玩具。但仔细翻了它的仓库和数据之后我意识到这个项目不太一样从 2008 年开始做的老牌开源引擎接近 17 年持续迭代26k starMIT 协议开放源码官方口径的月活跃创作者到了 40 万而且最新版本里已经集成了 AI 辅助能力允许你直接输入一句自然语言来生成游戏逻辑骨架。这篇文章我就从它凭什么能活 17 年讲起把无代码引擎的内核逻辑、AI 能力的真实边界、以及我自己上手做一个小游戏的完整过程都拆开聊一聊。1. 一个 17 年的老项目凭什么还能有 40 万月活1.1 从 C 桌面工具到 Web 化编辑器GDevelop 的技术沿革很多人对 GDevelop 的第一印象是网页游戏生成器但它的起点其实是个地地道道的原生桌面软件。项目发起人 Florian Rival 从 2008 年开始做这个引擎早期版本是 C 写的只跑在 Windows 上。后来随着 Web 技术体系的成熟开发团队做了一个很重要的决定把编辑器部分用 Web 技术重写做成了基于 Electron / PWA 的跨端编辑器同时把游戏运行时保留在 C 上保证发布到各平台后的执行性能。这个编辑器跨端、运行时原生的架构非常关键。编辑器用 Web 技术意味着网页版可以直接打开桌面版也有一致的界面用户不需要安装复杂的依赖就可以开始做游戏。而运行时用 C保证了最终发布的游戏在浏览器和手机上的帧率表现。跟一些用 JavaScript 写整套引擎的项目相比GDevelop 在跑满屏粒子或大量对象时性能余量明显更大。另一个值得注意的点是17 年下来它的核心概念没有反复推倒重来。今天你在 GDevelop 里学的场景、对象、事件、行为和当年几个大版本是一脉相承的。工具类的开源项目最怕作者一言不合重写心智模型用户积累的经验一夜作废。这一点上GDevelop 做得相当克制。1.2 MIT 许可证能做什么不能做什么开源协议这块很多做游戏的人其实是看不懂的。GDevelop 用的是 MIT 协议这是开源协议里约束最少的一类。翻译成人话就是你可以自由使用、修改、复制、再发布甚至闭源商用唯一的要求是在分发的时候保留原始的版权声明。对独立游戏开发者和创业团队来说这就非常友好了。你拿 GDevelop 做了一款游戏上架 Steam、Google Play 或 App Store不需要向引擎作者支付任何授权费也不需要开源你的游戏代码。相比之下部分开源协议带有传染性五条 GPL 代码混进你的项目可能整个项目都要跟着开源还有一些商业引擎虽然个人免费但公司收入达到门槛之后会产生额外费用条款也一直在变。不过有一点要分清楚MIT 协议管的是引擎源码不代表你可以随便使用 GDevelop 的商标、Logo 和官方素材。如果你是把它当引擎用而不是直接打包发行引擎本身这个限制通常不会造成困扰。另外GDevelop 的官方资源中心里有大量社区上传的免费素材它们各自有单独的授权协议下载之前要留意素材页面的说明不能默认全是 CC0 公共领域。1.3 学会用数据判断开源工具的活性26k star 在 GitHub 上是什么水平如果单看 star 数它不算超级顶流但 star 只能说明有多少人点了收藏不能说明有多少人真的在用。真正让我觉得这个项目靠谱的是 40 万月活跃创作者这个数据。对外行来说月活比 star 难伪造得多。一个工具类产品如果有几十万人每个月都在用说明它已经跨过了尝鲜阶段到达了有人愿意长期留存的实用阶段。再加上 GitHub 仓库的 commit 频率、Release 发布节奏、issue 回复速度、官方 Discord 的活跃程度综合下来可以判断这是一个有稳定的维护团队、有真实用户反馈闭环、还在持续演进的活项目。看开源项目的时候我建议大家不要只看 star 数至少还要看三样东西最近半年有没有新版本发布issue 区是不是有人维护和回复社区里第三方教程和模板多不多。这三样都满足项目大概率不会你用了一半就弃坑。2. 一句话做游戏的实现机制不是魔法是事件树翻译2.1 无代码引擎里游戏逻辑长什么样要理解 GDevelop 的 AI 能力得先理解它的逻辑表达方式。GDevelop 不用传统编程语言它用的是事件表。事件表由两条最基本的构成条件是如果动作是就。一行事件写出来长这样如果玩家对象与金币对象重叠就删除金币对象并把分数变量加 1。这套体系跟 Scratch 有点像但比 Scratch 更接近游戏引擎的底层思维。它没有循环这个显式概念因为在游戏运行过程中每一帧都会从头到尾把事件表执行一遍。也就是说事件天然就是一个每帧都在跑的循环。你不需要写while也不需要写for只需要声明持续有效的规则引擎每帧自动帮你检查。所以 GDevelop 里的游戏逻辑本质上是一棵条件-动作组成的树。AI 辅助生成做的事情并不是什么黑魔法而是把一段自然语言转换成这棵树。你输入玩家碰到金币时金币消失、分数加一AI 负责理解这句话里的对象、条件和结果然后生成对应的事件条目。2.2 AI 在生成链路中的角色与边界弄清楚底层逻辑之后你就能明白 GDevelop 里 AI 的边界在哪里。它不会替代你完成游戏设计也不会凭空创造一套你想象不到的系统。它擅长的是把你脑子里已经清楚的规则快速翻译成引擎能识别的事件结构。打个比方这一步类似用自然语言写伪代码然后让 AI 把伪代码翻译成最终代码。程序员会觉得这不过是把打字速度提升了但对非程序员来说最大的门槛恰恰是不知道该在哪个菜单里点哪个条件。AI 帮你跨过了工具层面的专业壁垒把注意力留在规则设计和玩法构思上。我实测下来的体验是AI 生成的事件骨架可以直接运行但大概率不是最优解。比如它可能生成的是逐个对象碰撞检测而不是使用对象组的批处理也可能生成的事件名称、变量名称不够规范后面手动维护时有点难受。所以正确的使用方式是把 AI 当成一个快速生成初稿的搭档而不是当成全自动外包。生成之后一定要进入事件表里把每条条件、每个动作读一遍确认它确实是你想要的行为。2.3 写提示词的正确姿势越具体的约束越有效既然 AI 是翻译器那输入的提示词质量就直接决定输出结果。我在试的时候发现模糊的提示词会得到非常泛化的结果。比如只说做一个射击游戏AI 大概率会生成一套最标准的竖直射击模板但它不知道你的视角是横版还是竖版不知道玩家怎么移动不知道敌人怎么生成不知道失败条件是什么。出来的东西会觉得哪里不对但又说不上来。正确的做法是给 AI 足够具体的约束。我常用的一个提示词结构是游戏视角 玩家控制方式 核心循环 胜负条件 难度变化。举个例子2D 竖屏射击游戏玩家在屏幕底部左右移动点击或按空格发射子弹敌人从屏幕上方随机位置出现并向下移动子弹击中敌人时敌人消失并增加分数敌人碰到玩家时玩家减少一点生命并消失生命为零时游戏结束敌人出现频率随游戏时间逐渐加快。这个提示词里每一个分句都对应一个可以被翻译成事件结构的规则。实际生成出来的东西往往已经包含了玩家对象、子弹对象、敌人生成定时器、碰撞检测、计分变量和游戏结束条件。你要做的就是在美术资源和数值平衡上继续打磨。还有一点值得提醒不同语言版本对对象名的生成可能有差异。如果 AI 生成的对象名是英文通常是这样你后面改起来反而省事因为事件引用和表达式里不用频繁切换输入法。3. 无代码的核心基本功对象、事件、行为3.1 场景、对象与实例先分清舞台上的角色不管 AI 能不能帮你写事件你都需要理解 GDevelop 的世界模型。第一个要分清的是场景、对象、实例这三个层级。场景就是游戏的一个关卡或一个界面比如主菜单、游戏关卡、结算页面每个场景有自己的对象列表和事件表。对象可以理解为演员的角色设定相当于面向对象编程里的类。实例则是场景里真实存在的某一个具体对象同一个对象可以在场景里放很多份比如怪物这个对象在场景里有 10 个实例它们共享对象属性但各自的位置和当前状态可以互不相同。很多新手一开始会搞混对象和实例导致事件里操作对象时所有对象都被一起操作了。比如你想让编号为 3 的怪物流血如果条件里选中的是整个怪物对象而不是某个实例那可能所有怪物都在流血。在 GDevelop 的事件编辑器里条件会为你挑选符合条件的一组实例后续动作只作用于被挑选出来的对象。理解了这个机制你就会慢慢理解为什么有些动作只对部分对象生效。3.2 事件表每帧都在执行的如果就事件表的执行机制是整个 GDevelop 最核心的心智模型。前面提到每一帧事件表都会从头到尾跑一遍。帧率如果是 60 帧每秒那就意味着每个事件每秒要评估 60 次。这个机制带来两个推论。第一你不需要考虑什么时候去检查碰撞因为每帧都在检查。第二事件的顺序通常有讲究。如果在某个事件里你让对象 A 生成对象 B然后又有一个事件条件是对象 B 与对象 C 重叠而这个事件排在生成事件之前那这一帧里 B 可能还没生成碰撞就不会被检测到。很多为什么我条件明明对但就是不触发的 bug最后排查出来都是事件顺序问题。事件编辑器还支持子事件。你可以把一组事件嵌套在另一个事件下面这样只有当外层条件满足时内层事件才有机会被评估。用子事件来表达当玩家按攻击键时如果角色面向右则向右攻击否则向左攻击比把条件全部平铺在顶层清晰得多。3.3 变量、函数和行为复杂逻辑的三种表达方式事件表只负责如果就数据存储要靠变量。GDevelop 里有好几类变量场景变量只在当前场景有效适合放关卡内的临时状态全局变量在整个游戏运行期间都能访问适合放金币总数、解锁进度、玩家设置对象变量挂在每个实例身上适合放单个角色的血量、速度、朝向等属性。变量类型上有数字、字符串、布尔值还有结构体。GDevelop 对类型的要求不算严格很多地方会自动转换但这种宽松也会带来坑。比如一个对象变量的初始值是文本0你在动作里让它加 1结果可能不是你想的那样。这个我在后面避坑部分会详细说。行为Behavior是 GDevelop 特别重要的一个能力。一个对象可以挂多个行为比如平台角色控制器帮你处理重力、跳跃、左右移动自动旋转让对象绕中心转路径寻找让对象绕障碍走向目标。这些行为相当于别人写好的可复用逻辑包你勾选上就能用不用自己从零实现。函数和扩展则帮你把一组事件封装成可调用的模块。一旦一个逻辑块被封装成函数你就能在多个事件里复用传不同的参数进去。做到这一步你已经用事件表写出了类似于函数的抽象能力只是不用真的碰编程语言。4. 从空项目到可玩小游戏一个下午的实操记录4.1 安装与新建项目网页版和桌面版怎么选GDevelop 提供了网页版和桌面版两种主力使用方式。网页版的优点是完全不需要安装打开浏览器就能建项目适合临时验证想法或给别人演示。桌面版基于 Electron支持离线使用打开大项目、加载大量素材的时候明显更流畅而且导出桌面端和移动端打包的时候依赖也更完整。我的建议是正式做项目时用桌面版临时看案例用网页版。官网首页就能下载 Windows、macOS、Linux 的安装包安装过程没有额外的环境依赖下载下来直接跑。新建项目时它会提供一堆官方模板新手强烈建议先从一个模板改起比如平台游戏解谜游戏射击游戏模板直接运行看效果再逐层拆开事件表比从零开始建项目更容易建立信心。4.2 搭建接礼物核心循环的事件链路为了演示我给自己定了一个下午的小目标做一个移动篮子接住下落的礼物的小游戏。具体规则是篮子跟随鼠标左右移动礼物从顶部随机位置掉下来接到礼物得一分礼物落到屏幕底部则损失一条命生命归零游戏结束。在 GDevelop 里我新建了一个空场景场景里放了一个用作篮子的矩形对象和一个用作礼物的圆形对象。玩家控制这块只需要一条事件鼠标移动时让篮子对象的 X 坐标等于鼠标的 X 坐标。如果你想要键盘控制也可以改成检测左右方向键然后让篮子的 X 坐标加或减一个速度值乘以TimeDelta()——这个东西表示每帧经过的时间乘上它之后移动速度在不同帧率下保持一致。礼物生成的部分用一个定时器事件实现每隔 1 到 2 秒在场景顶部的随机 X 位置创建一个礼物对象实例。GDevelop 里可以直接读取随机数表达式也可以顺便给新生成的礼物设置一个随机水平速度让它下落时不是直线坠落游戏会更有趣。接着是最关键的碰撞事件如果篮子对象与礼物对象重叠则删除礼物对象并把全局变量score加 1。同时在场景顶部的文本对象上把文本内容设置为Score: ToString(score)。这个事件不需要额外写每帧更新文本因为每帧都会评估。礼物落到底部的事件也类似如果礼物对象的 Y 坐标大于屏幕高度就删除这个礼物实例并把全局变量life减 1。再补一条如果life小于等于 0切换到游戏结束场景或者显示一个重新开始的遮罩。4.3 数据收尾、游戏结束与重新开始游戏循环跑通之后别忘了处理重新开始的数据重置。我见过很多新手游戏做着做着发现第一次玩挂了点重开分数却还是上次的。原因很简单你在游戏结束场景里没有把score和life重置成初始值。解决方式是在游戏场景开始的事件里显式给相关变量赋初值比如设置score等于 0、life等于 3。不要指望它们在每次场景加载时自动归零场景变量虽然每次进入场景会重新创建但全局变量不会它会一直留在游戏进程里直到整个游戏退出。如果你用了场景切换来实现重开那就必须在切回主场景的事件里重置所有全局变量。或者干脆不切场景用停止游戏和重新开始两个按钮直接重新加载当前场景然后在场景开始事件里完成初始化。哪种方式都行关键是记住初始化的时机要放在每次游戏重新开始时必然经过的地方。4.4 导出到 Web 和桌面的配置要点游戏做完之后GDevelop 的导出功能非常简单选择目标平台填上游戏名称、图标、分辨率等基本信息它会自动完成打包。我实测下来导出 HTML5 版本最省事导出的文件夹里是一个完整的静态站点你可以扔到任意静态托管服务上手机浏览器直接访问就能玩。桌面版导出 Windows 包时需要把图标和平台信息填完整导出的目录里会有一个可执行文件。这里有一个小坑如果你在游戏里使用了本地文件读取类的扩展导出到浏览器时可能会因为浏览器的沙箱限制而失效桌面端则不受影响。反过来如果你的目标是手机端尽量提前用小屏分辨率预览因为小屏幕上的触摸控制和大屏幕鼠标控制完全是两套交互逻辑防误触区域、UI 缩放都要单独调。5. 我在使用中踩过的坑五个典型问题与排查思路5.1 碰撞不生效先检查事件顺序和条件范围做游戏最先遇到的大概率是碰撞检测的问题。我遇到过一种典型的错误礼物的创建事件写在碰撞事件后面结果碰撞永远检测不到。原因前面说过事件表每帧从头执行某一帧里对象在碰撞事件之前还没被创建自然就不可能被检测到。把生成事件挪到碰撞事件前面或者让碰撞事件去检测场景中与该对象重叠的实例问题就解决了。还有一种情况是条件范围过宽导致的误触发。比如场景里既有敌人子弹也有主角子弹你的碰撞事件写的是任意子弹与玩家碰撞结果敌人子弹和主角子弹碰到一起也触发了。排查的时候要看清楚条件面板里对象的选择范围必要时用对象组把不同类型的子弹区分开或者加一个子弹属于敌人的标签。5.2 变量报错数字与字符串的隐性转换GDevelop 的变量系统对类型比较宽容但这种宽容是有代价的。我在一次计分功能里遇到的问题是分数到了 10 之后突然变成了字符串拼接的1011而不是继续累加。排查下来发现初始分数变量我习惯性地填了空字符串这导致引擎把变量当成了字符串类型后面加 1 变成了拼接。现在的版本里这类问题已经有了很多改进但习惯上我建议你创建变量时就想清楚它应该是数字还是文本初始值直接写0而不是留空。涉及拼接显示文本的时候用ToString()把数字转成字符串避免引擎自动做隐式转换。5.3 场景切换后数据丢失全局与场景变量的差异一个看起来有点诡异的 bug在关卡场景里设置的变量切到结算场景再切回来的时候某些值不见了。原因多半是你用了场景变量而不是全局变量。场景变量只在当前场景存活一旦切场景它的值就没了。如果你希望数据跨场景保留必须用全局变量或者在进入新场景时通过参数把值传递过去。这也不意味着全局变量越多越好。全局变量太多会让项目后期变得难以维护因为你不知道哪里改了这个变量、会影响哪些场景。我的做法是只把跨场景需要的核心状态放进全局变量比如玩家总金钱、关卡编号、当前生命其余临时状态用场景变量做好隔离。5.4 手机端卡顿对象池和可见性没有做做 PC 网页版的时候创建和销毁对象很随意很少感觉卡顿。但一放到手机上问题立刻暴露。礼物对象每隔一两秒生成一个碰到篮子或落到底部就删除看起来也没几个对象但手机端的帧率就是上不去。原因之一是创建和销毁对象本身是有开销的频繁创建析构会造成内存抖动原因之二是屏幕外不可见的对象仍然参与每帧渲染。GDevelop 提供了对象池扩展你可以预创建一批礼物对象隐藏起来备用需要用的时候激活用完再隐藏避免重复创建销毁的开销。同时给对象加上离开可视区域后自动隐藏的行为能明显降低渲染压力。5.5 版本差异带来的困惑扩展插件的管理GDevelop 的扩展系统非常丰富官方和社区都提供了大量现成的扩展比如内购、广告、多人联机、粒子特效、路径寻找等。但不同版本之间的扩展兼容性有时会出现问题尤其当你打开一个别人分享的项目时它可能依赖某个旧版本专用的扩展而你的编辑器版本已经把这个扩展升级或替换掉了。遇到这种情况第一反应不要觉得是项目坏了而是去项目设置里看扩展依赖检查哪些扩展缺失、哪些不一致。在分享项目给别人的时候也建议写清楚 GDevelop 版本号和需要安装的扩展列表能省去很多沟通成本。6. 生态与建议把 GDevelop 用在正确的项目上6.1 官方社区、模板市场和扩展系统一个工具能走多远很大程度取决于生态。GDevelop 有官方 Wiki 文档、示例游戏库、资源中心还有一个相当活跃的社区论坛和 Discord。资源中心里可以找到大量免费的图形、音频、粒子效果很多独立游戏制作者会在上面分享自己的素材。社区还经常举办游戏创作挑战赛题目通常很轻量比如一周内做一个关于海洋的游戏这种活动对新手来说是最好的练习机会。模板市场是最值得利用的一块。新手打开模板不要只是点运行看效果我建议做三件事第一把每个对象的行为配置挨个点开看一遍第二把事件表里的每一条事件从上到下读一遍尝试解释它为什么存在第三故意改坏一个条件运行看游戏发生了什么再改回来。这个拆解-理解-破坏-修复的循环比看十篇教程都管用。6.2 适合与不适合的项目类型关于 GDevelop 的能力边界我的判断基于实际项目需求它非常适合做 2D 休闲游戏、平台跳跃、俯视角射击、解谜、叙事互动类作品以及各类游戏玩法原型验证。如果你要做的是一款玩法清晰、单机或轻量联机的 2D 小游戏GDevelop 完全能够胜任而且开发效率很高。不太适合的场景也有复杂 3D 游戏、需要重度实时同步的多人竞技、对渲染管线有深度定制需求的项目。GDevelop 不是做这些事的工具硬要用只会越做越痛苦。这个定位很清晰不是每个引擎都要向着通用平台的方向卷。6.3 给零基础与程序员的各自路线建议如果你是零基础第一次接触游戏开发我的建议是先别急着做我梦想中的 3A 大作。给自己定一个两周内能完成的小目标比如做一个有开始菜单、核心玩法、结束画面的接篮子游戏。照着模板改遇到不懂的事件就点开文档看这个过程中你会慢慢积累起对对象、事件、变量的直觉。如果你是有编程背景的开发者GDevelop 可以作为快速原型工具进入你的工具箱。你不需要学习它的完整底层只需要理解事件表达式的逻辑就能把脑海里的玩法快速验证出来。我个人的用法是用 GDevelop 验证游戏手感手感通过了再考虑用更重的引擎做正式版。这个流程能省掉很多早期方向上的浪费。最后分享一个我自己实际的体会用 GDevelop 做游戏最大的障碍从来不是工具本身而是思路还没转过来。只要理解了每帧都在跑的事件表这条核心逻辑后续所有功能学习都会变得非常顺畅。把 AI 生成的事件当成初稿把对象池、变量初始化和跨场景数据隔离当成默认习惯你会发现一个能玩的游戏在几个小时内做出来并不是什么夸张的说法。