
1. 项目背景与核心目标为什么选 Godot 4 作为 2D 入门引擎做游戏开发的都应该感觉到了这几年游戏引擎的格局变化不小。商业引擎授权模式频繁调整让独立开发者和刚入行的人开始认真思考工具的长期成本问题。Godot 在这个节点上跑出来确实不是偶然——它开源、免费、轻量而且 4.x 版本在 2D 渲染、光照系统和脚本语言上做了大量重构明显是冲着 2D 游戏开发的实际需求去的。先说结论我用 Godot 4 做过几个小项目包括平台跳跃、俯视角射击和模拟经营类的原型整体感受是它在 2D 领域的完成度已经相当高。GDScript 写起来很像 Python逻辑表达直接场景Scene和节点Node的树状结构非常直观对于从零开始学游戏开发的朋友来说学习曲线比 Unity 或 Unreal 平滑得多。这篇文章定位是系列教程的第一篇目标很明确把 Godot 4 从下载安装到成功运行一个可以交互的 2D 场景整个流程完整走一遍。内容包括安装与汉化、2D 场景的搭建、玩家的移动控制、碰撞检测、动画播放以及最后的导出打包。你会在这一篇里获得一条完整的起跑线后续的系列文章再在此基础上逐步深入。抛开技术细节我先说说我对 Godot 4 整体设计风格的理解——这是它区别于其他引擎的核心价值。Godot 的场景体系Scene把“场景”这个概念做到了极致任何东西都可以是一个场景一个角色、一扇门、一个 UI 面板它们之间通过实例化Instantiate来嵌套组合。这和传统引擎里“关卡场景”的概念完全不同更像是一种天然的组件化架构。这种设计对 2D 游戏的开发节奏特别友好你可以单独开发角色的场景测试好了再放进关卡中完全不干扰其他部分。另外一个关键点是节点Node的树状结构。你创建一个角色它就是一个 Node2D 类型的节点下面挂一个 Sprite2D 节点显示图像挂一个 CollisionShape2D 节点做碰撞检测挂一个脚本节点控制行为。这种“一切皆节点”的设计让整个游戏逻辑变成了一棵可视化的树你可以在编辑器里直接看到对象的层级关系调试时也能很直观地定位问题。对新手来说这种设计极大降低了“我的代码到底跑在哪里”的困惑感。2. 安装准备下载渠道选择与版本确认2.1 下载渠道到底怎么选这一步是很多新手第一道坎因为搜索引擎一搜“Godot 下载”出来的链接可能五花八门有的还是旧版本的广告页或者第三方打包站。我必须强调请认准官网下载。Godot 官网的域名是 godotengine.org下载页面在 /download 路径下其他地方下载的版本可能存在安全风险或功能缺失。进入下载页面后你会看到两个版本选项Standard 标准版和 .NET 版本。这里有一个非常常见的误解很多人以为标准版不能写代码其实不是这样。标准版自带 GDScript 和 C# 之外的所有功能而且 GDScript 是 Godot 的一等语言性能和写代码的体验都很好。.NET 版本是给那些想用 C# 开发的人准备的需要额外安装 .NET SDK 才能完整运行。我的建议很明确如果是第一次接触 Godot直接下载标准版。原因有几个。第一GDScript 是 Godot 的原生语言与引擎内部贴合度最高很多新特性会优先在 GDScript 上支持。第二标准版的编辑器启动更快占用的磁盘空间更小对电脑配置的要求也更低。第三网上绝大多数 Godot 4 教程用的都是 GDScript你跟着学不会遇到语法版本不一致的问题。还有一点需要提醒下载页会提供不同操作系统的安装包Windows 用户直接选 Windows 对应的 ZIP 包或者安装器版本。ZIP 包的好处是绿色免安装解压就能用我建议把它解压到一个路径中没有中文字符的目录比如D:\dev_tools\Godot避免后续项目加载或导出时出现路径编码问题。2.2 安装过程与首次启动配置细节ZIP 包下载完成后解压出来的文件夹里只有一个可执行文件Windows 下是Godot_v4.x-stable_win64.exe这个文件就是整个引擎。首次双击运行时它会弹出一个项目管理器窗口默认语言是英文。启动后你先不要急着点“New Project”建议先做两个配置操作。第一步在项目管理器左上角找到“Editor Settings”按钮如果已经在编辑器中通过菜单 Editor Editor Settings 进入第二步在左侧列表找到“Interface Editor Language”这里就是界面语言设置的位置。在这里我想补充一个新手容易忽略的小细节Godot 4 的项目管理器Project Manager是独立于编辑器的一个程序但它们是同一个可执行文件在不同模式下运行的结果。这意味着在你没有打开任何项目时窗口是项目管理器打开或新建项目后才会进入完整的编辑器界面。理解了这一点你就不会在 Project Manager 界面里到处找“设置”按钮时发懵了——你需要在左边的顶部菜单区通过 Editor 菜单进入编辑器设置。另外一个值得关注的细节是 Godot 4 编辑器默认的渲染模式。Godot 4 默认使用 Forward 渲染器这是为桌面平台和独立显卡设计的高阶渲染器。如果你的电脑配置比较低或者使用的是核显可能需要在项目管理器的右侧选择“Vulkan 兼容模式Compatibility”来获得更好的兼容性。这个选项在你首次创建项目时就能看到在创建新项目的界面中有一个“Renderer”下拉框选择“Forward”或“Compatibility”。我的建议是如果电脑配置中等偏下8GB 内存、没有独立显卡直接选 Compatibility 模式它对 2D 游戏的渲染完全够用并且更稳定。3. 汉化配置两分钟完成界面中文化3.1 编辑器界面汉化的正确姿势说实话Godot 4 的英文界面用久了之后其实很顺手英文术语在技术文档里出现的频率很高看习惯了反而能减少理解偏差。但如果你完全零基础英文界面确实会带来不必要的挫败感所以汉化是很有必要的。汉化的操作路径非常短点击菜单栏的Editor-Editor Settings在弹出的设置窗口左侧搜索框输入“language”然后在右侧找到Interface Editor Language点开下拉框选择“简体中文Simplified Chinese / 中文简体”最后点击右下角的“Save Restart”按钮编辑器会重启界面就变成中文了。这里要插一句我的经验改语言之后编辑器内的节点名称、文件属性等仍然以内部标识符为准并不会完整体现中文翻译。比如你在节点面板中看到节点类型“Node2D”它翻译成“节点2D”之后你在代码中引用的类名仍然是Node2D。因此就算你汉化了编辑器我也建议在需要写代码时仍然使用英文类名、英文属性名保证代码风格统一。3.2 关于界面字体显示和过小字号的调优汉化完成后小概率会遇到中文显示成方块的情况。这通常发生在 Linux 系统或者某些精简版 Windows 上原因是系统缺少中文字体。解决办法是安装系统级中文字体比如微软雅黑、思源黑体等或者调大编辑器字体让中文渲染更清晰。调整编辑器字体的路径是编辑器设置 - 界面 - 编辑器 - 字体里面可以设置字号大小默认 12 或 13。我个人建议在 1080P 分辨率下把字号调到 14 或 15长时间盯代码眼睛会舒服很多。这个设置在脚本编辑区域和节点面板中都会生效算是一劳永逸的优化。这里我补充一个很多人容易忽略的调优点如果你在 4K 或高分屏上使用 Godot 4界面元素可能会显得非常小这同样可以在编辑器设置里解决。路径是界面 - 编辑器 - 缩放比例选择“自动Automatic”或手动调整到 150% 甚至 200%UI 就会变得清晰可读。但要注意缩放比例修改后需要重启编辑器才能完全生效。4. 创建并理解第一个 2D 项目4.1 项目参数选择渲染器与像素图校准现在进入正题。回到项目管理器点击“新建项目”填写项目名称建议用英文比如hello_godot_2d选择项目存储路径这个时候你会看到“渲染器”下拉框。如果你在安装准备阶段已经决定用 Compatibility 模式这里就直接选它如果没有特殊需求也可以先保持“Forward”后面随时可以在项目设置中切换。项目创建完成后编辑器会自动打开。这里有一个重点概念需要搞清楚Godot 4 中的 2D 和 3D 工作区是独立的。编辑器顶部有一个 2D、3D、脚本、资源库等标签的切换栏做 2D 游戏的时候需要点击“2D”标签进入 2D 视图工作区。很多新手进入编辑器后面对默认的 3D 视角感到一脸懵——其实只是因为默认停在了 3D 工作区而已切到 2D 就会看到一个熟悉的横纵网格坐标平面。2D 视图中的网格坐标轴中水平向右是 X 轴正方向垂直向下是 Y 轴正方向。这一点和我们在数学课上学过的坐标系很不一样数学坐标系 Y 轴是向上的但几乎所有游戏引擎的屏幕坐标系都是这样设计的越往下 Y 值越大。理解这个坐标系之后很多逻辑推理就顺了比如“让角色向下移动”就是把 Y 坐标增加。说到 2D 游戏就不得不聊一下 2D 视觉像素校准这个概念。Godot 4 在处理 2D 素材时有一个核心设置项就是“纹理过滤模式”。默认情况下纹理过滤是“线性过滤”它对图像进行抗锯齿处理适合照片风格或大尺寸素材。但对于像素风游戏这种过滤会在像素图放大时出现模糊也就是常说的“糊成一团”现象。要让像素图保持锐利清晰的方格感需要在项目设置中把“纹理过滤默认值”改成“最近Nearest最近邻”这样每个像素就会以硬边缘放大观感上更符合 2D 像素风格游戏的需求。这就是所谓的“像素校准”。像素校准在实际开发中有一个关键参数——每单位像素数。Godot 的 2D 世界里默认单位是像素但同一个视觉尺寸在不同分辨率设备上呈现的物理大小不同。我的实操经验是在设计 2D 游戏素材时先定下一个基础分辨率比如 320x180、640x360再通过“视口缩放”的方式保持游戏画面在不同窗口大小下的统一。这样你画的每一帧像素素材都是准确的“原位像素”不需要为不同屏幕单独制作多套尺寸。4.2 创建根节点与场景文件的理解在 2D 工作区中左侧有一个“场景”面板默认会有一个空的根节点。这个根节点的类型决定了场景的性质。双击根节点的名称可以重命名我们把它改成Main。现在关键一步在场景面板顶端的“”加号按钮上点击会弹出一个“创建节点”窗口。输入“Node2D”选择它并点击创建就会在根节点下新建一个 Node2D。注意如果你希望在创建时直接指定根节点的类型可以先选中根节点右键选择“将类型更改为Change Type”然后选择 Node2D。这样整个场景的根节点就从默认节点变成了 Node2D。很多新手不理解 Node2D 和普通 Node 有什么区别这里有明确的解释Node 是最基础的节点类型没有位置、旋转、缩放等任何空间属性而 Node2D 作为 Node 的子类增加了位置、旋转、缩放、可见性Visibility等 2D 变换属性是 2D 游戏中所有图形、物体节点的基类。换句话说如果你的节点要出现在 2D 场景中并拥有坐标那么它的基类必须是 CanvasItem更具体地说通常是 Node2D 或 ControlUI 节点。场景文件.tscn本质上是一个文本文件里面记录了整个场景树的结构信息。你可以用任何文本编辑器打开 .tscn 文件看它的内部格式理解一下也无妨不过日常开发中我们不需要直接编辑它Godot 的可视化编辑器会帮你处理一切。5. 运行第一个 2D 游戏场景5.1 最小可运行场景一个带视觉反馈的节点这一节是实现“运行第一个 2D 游戏场景”的成果环节。为了让这个场景值得“运行”我们给它加一点看得见的东西。在“场景”面板中选中Main节点根节点点击左上角的“”添加节点按钮添加一个Sprite2D节点。Sprite2D 是 2D 游戏中最常用的显示节点它的作用是显示一张 2D 图片。默认情况下Sprite2D 没有关联任何纹理所以它在视图中显示为一个简单的矩形轮廓。为了让这个矩形可见我们可以给它添加一个纹理。你可以找一张简单的 PNG 图片拖拽到 Sprite2D 的“纹理”属性槽中也可以使用编辑器自带的图标。Godot 会自动生成一些内置图标和纹理资源最简单的办法是在“文件系统”面板下方底部展开GUIDE或内置资源目录找到icon.svg文件Godot 项目自带引擎图标把它拖到 Sprite2D 的 Texture 属性上。这样Sprite2D 就会显示出一个椭圆形的 Godot 图标了。此时按 F6 键或者点击场景视图右上角的“运行当前场景”按钮一个播放图标旁边有节点名称就会弹出运行窗口。你会看到一个带引擎标志的图标出现在窗口中央。恭喜你已经成功运行了一个 Godot 4 的 2D 场景。5.2 给场景加上最基础的键盘交互运行窗口能弹出来只是第一步作为游戏开发入门我们还需要让它“动”起来。这里引入 Godot 4 最核心的编程概念脚本。选中Main节点或者只包含 Sprite2D 的那个整体点击右键 -“添加脚本”。在弹出的创建脚本对话框中保持默认的语言GDScript、路径和模板即可点击创建。Godot 会自动生成一个脚本文件main.gd并在脚本编辑器的代码区打开。我们会写一点非常基础的代码让这个场景响应键盘方向键的输入实现上下左右移动。以下是完整的脚本内容extends Node2D export var speed: float 300.0 func _ready() - void: print(场景已就绪Hello, Godot 4!) func _process(delta: float) - void: var direction : Vector2.ZERO if Input.is_action_pressed(ui_right): direction.x 1.0 if Input.is_action_pressed(ui_left): direction.x - 1.0 if Input.is_action_pressed(ui_down): direction.y 1.0 if Input.is_action_pressed(ui_up): direction.y - 1.0 if direction ! Vector2.ZERO: # 对方向向量做归一化处理避免斜向移动速度过快 direction direction.normalized() global_position direction * speed * delta我逐行解释一下这个脚本的思路。extends Node2D表示这个脚本是挂在 Node2D 类型节点上的。export是一个关键字它把speed变量暴露到编辑器的“检查器”面板中这样你可以在不修改代码的情况下调整这个速度值。这种做法后续会频繁使用它让你的参数调整变得非常直观——记住这条原则可配置的都尽量用 export 暴露出来。_ready()是生命周期函数当节点第一次进入场景树时会被调用一次适合做初始化操作。_process(delta)则是每帧都会调用的回调函数delta是距离上一帧的时间差单位秒。你用delta乘以速度就能保证无论游戏帧率是多少角色的实际移动速度都是一致的。这是游戏开发中非常基础也非常重要的概念帧率无关运动。Input.is_action_pressed用于检测某个“输入动作”是否被按下。Godot 预先定义了一些内置的输入动作ui_right、ui_left、ui_up、ui_down分别对应方向键的右、左、上、下。这里的ui_前缀表示这是引擎自带的热键动作在很多 UI 导航和默认输入方案中都能用到。最后一行global_position direction * speed * delta实现了位置更新。global_position是节点在世界坐标系中的位置direction.normalized()把方向向量归一化长度为1这样玩家斜着移动同时按上和右时速度不会变大即不是约 1.414 倍速。很多人刚开始做移动时忽略这个细节斜向速度异常快其实就是没做向量归一化。点击“运行当前场景”按钮运行窗口弹出后按键盘方向键引擎图标就能在窗口中移动了。到此第一个可交互的 Godot 4 2D 场景就算真正“跑通”了。为了让大家更好地理解 2D 组态图这个概念——在很多工控、IoT 可视化领域大家用 2D 组态图来表现物体状态与位置其实 Godot 这类游戏引擎中用节点绘制场景、用脚本控制节点属性和位置的方式本质上也承担着“可视化组态”的功能。只不过游戏引擎多了物理、渲染、动画等能力表现力更强。这种“场景即组态、节点即设备、状态即属性”的思路也是你能把 Godot 技能迁移到非游戏领域比如数字孪生 2D 图可视化、交互式大屏等的桥梁。5.3 加入碰撞检测让移动不至于穿透一切能自由移动之后你很快就会意识到一个问题如果这是横版跳跃或者俯视角迷宫类游戏角色不能穿墙。这就牵涉到 2D 物理体系中最基础的内容碰撞检测。Godot 4 中碰撞检测的基本模式是节点挂上 CollisionShape2D 或 CollisionPolygon2D 作为碰撞体积由物理引擎在每一帧检查两个碰撞体积是否重叠。为了让这个机制跑起来场景中至少需要两类节点一个负责提供物理属性另一个负责提供形状信息。我们还是以Main场景为例给根节点 Main 添加一个子节点StaticBody2D静态刚体然后在它下面添加一个CollisionShape2D选中 CollisionShape2D 后在“检查器”面板的“形状”属性中选“新建 RectangleShape2D”一个绿色矩形框就会出现适配你想要的墙壁位置。再用同样的方式给角色节点Sprite2D添加一个CharacterBody2D或RigidBody2D。如果你想用代码直接控制角色移动最常用的做法是CharacterBody2D它提供move_and_slide()方法能非常方便地处理移动碰撞和斜坡地板。下面是一段基于 CharacterBody2D 的移动脚本片段你可以替换掉之前基于 Node2D 的版本extends CharacterBody2D export var speed: float 200.0 func _physics_process(delta: float) - void: var input_dir : Input.get_vector(ui_left, ui_right, ui_up, ui_down) velocity input_dir * speed move_and_slide()_physics_process是物理帧回调它的目标以固定时间间隔被调用默认每秒60次所以很适合做物理相关逻辑。Input.get_vector会把四个方向的输入打包成一个二维向量这就是它比is_action_pressed更简洁的地方。move_and_slide()是 CharacterBody2D 的核心方法它会根据velocity移动角色并且在碰到静态障碍物时自动停止并沿障碍物表面滑动。给角色挂上 CollisionShape2D并把形状设为 CapsuleShape2D 或 CircleShape2D常见的人形或圆形碰撞体然后运行场景按下方向键你会发现角色在碰到 StaticBody2D 时会被挡住无法继续前进。从“自由移动”到“物理受限移动”游戏感一下子就出来了。5.4 关于 2D 游戏要做 8 向动画帧吗移动和碰撞都实现之后很多人接下来想到的就是要不要做 8 向动画帧所谓 8 向动画帧是指角色在不同朝向上、下、左、右、左上、右上、左下、右下各有一套单独的动画帧集合。这在很多像素风 RPG、俯视角射击游戏中非常常见是最顶效果但也最费美术资源的方案之一。我给出的实操判断标准是先确认你的游戏交互范式再决定动画帧方案。如果你的角色是俯视角 3/4 视角比如《塞尔达传说》初代、《星露谷物语》而且角色移动覆盖 8 个方向那你需要 8 向动画帧且每个方向至少包含 3-4 帧行走动画。总共可能达到 32 帧起步。如果你的角色是横版平台跳跃比如《蔚蓝》《超级马里奥》角色只有左、右两个朝向那 2 向动画帧左朝向和右朝向各一套就足够跳跃、下落、站立再各自加一组动画即可。如果角色采用“八方向运动但动作帧可复用”的折中方案很多游戏会把上下方向的行走帧做一套再水平镜像成左右帧对角线直接使用上下的一组帧或者干脆走“滑步”效果。这种方案省美术资源但动作流畅度会差一点。我的初始建议入门阶段先不要追求 8 向动画帧。先把 4 方向的基础移动动画比如上下左右各 2 帧循环做出来跑通“动画状态机”和“帧切换”这个逻辑回路再慢慢扩充到 8 向。游戏开发的核心是先让玩法成立动画帧的数量可以后期增长替换。