<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>GDScript on KnightLi的博客</title>
        <link>https://www.knightli.com/tags/gdscript/</link>
        <description>Recent content in GDScript on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Sun, 17 May 2026 12:37:30 +0800</lastBuildDate><atom:link href="https://www.knightli.com/tags/gdscript/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Godot 游戏开发入门：从节点、场景到第一个 2D 小游戏</title>
        <link>https://www.knightli.com/2026/05/17/godot-game-development-beginner-guide/</link>
        <pubDate>Sun, 17 May 2026 12:37:30 +0800</pubDate>
        
        <guid>https://www.knightli.com/2026/05/17/godot-game-development-beginner-guide/</guid>
        <description>&lt;p&gt;Godot 是一款开源游戏引擎，适合从 2D 小游戏、独立游戏原型，到中等规模的 3D 项目开发。&lt;/p&gt;
&lt;p&gt;它最大的特点是轻量、开源、启动快，节点和场景系统非常清晰。对新手来说，Godot 的门槛通常比 Unity 低；对独立开发者来说，它不绑定商业授权模式，也更容易做出可控的小项目。&lt;/p&gt;
&lt;p&gt;这篇文章用最少概念把 Godot 的入门路线讲清楚：你先理解节点和场景，再学 GDScript，最后用一个 2D 小游戏把输入、物理、碰撞、UI、音效和导出串起来。&lt;/p&gt;
&lt;h2 id=&#34;先说结论&#34;&gt;先说结论
&lt;/h2&gt;&lt;p&gt;Godot 入门不要一上来就学大而全的引擎功能。&lt;/p&gt;
&lt;p&gt;更合理的路线是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先做 2D，不急着做 3D。&lt;/li&gt;
&lt;li&gt;先理解节点和场景，不急着写复杂架构。&lt;/li&gt;
&lt;li&gt;先学 GDScript，不急着上 C#。&lt;/li&gt;
&lt;li&gt;先做一个能跑、能失败、能重开的小游戏。&lt;/li&gt;
&lt;li&gt;再逐步补动画、音效、UI、关卡和导出。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;只要做完一个完整小项目，你对 Godot 的理解会比刷十几个零散教程更稳。&lt;/p&gt;
&lt;h2 id=&#34;godot-适合什么人&#34;&gt;Godot 适合什么人
&lt;/h2&gt;&lt;p&gt;Godot 很适合这几类人：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;想从零开始学游戏开发。&lt;/li&gt;
&lt;li&gt;想做 2D 独立游戏。&lt;/li&gt;
&lt;li&gt;想快速做玩法原型。&lt;/li&gt;
&lt;li&gt;不想被复杂商业引擎工具链压住。&lt;/li&gt;
&lt;li&gt;想理解游戏引擎底层组织方式。&lt;/li&gt;
&lt;li&gt;有一点 Python / JavaScript 经验，想快速上手脚本。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你的目标是大型 3A 画面、复杂商业团队管线、现成资产商店生态，Unity 或 Unreal 可能仍然更成熟。但如果目标是学习和做自己的游戏，Godot 非常适合起步。&lt;/p&gt;
&lt;h2 id=&#34;安装和项目创建&#34;&gt;安装和项目创建
&lt;/h2&gt;&lt;p&gt;Godot 的安装很简单。&lt;/p&gt;
&lt;p&gt;到官网下载安装包，解压后直接运行即可。它不像很多大型引擎那样必须先装完整启动器，也不需要复杂账号流程。&lt;/p&gt;
&lt;p&gt;新建项目时，建议先选：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Renderer：默认即可。&lt;/li&gt;
&lt;li&gt;Project Name：用英文短横线或下划线。&lt;/li&gt;
&lt;li&gt;路径：不要放在中文或空格特别多的目录里。&lt;/li&gt;
&lt;li&gt;版本管理：建议从一开始就用 Git。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;第一个项目可以叫：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;first-godot-game
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;项目创建后，Godot 会进入编辑器。你需要先熟悉几个区域：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scene：当前场景的节点树。&lt;/li&gt;
&lt;li&gt;FileSystem：项目资源目录。&lt;/li&gt;
&lt;li&gt;Inspector：选中节点的属性面板。&lt;/li&gt;
&lt;li&gt;Script：脚本编辑区。&lt;/li&gt;
&lt;li&gt;2D / 3D 视图：编辑画面和对象位置。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;godot-的核心节点和场景&#34;&gt;Godot 的核心：节点和场景
&lt;/h2&gt;&lt;p&gt;Godot 最重要的概念只有两个：节点和场景。&lt;/p&gt;
&lt;p&gt;节点是功能单元。比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Node2D&lt;/code&gt;：2D 对象基础节点。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Sprite2D&lt;/code&gt;：显示图片。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CollisionShape2D&lt;/code&gt;：碰撞形状。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CharacterBody2D&lt;/code&gt;：可移动角色。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Camera2D&lt;/code&gt;：2D 摄像机。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AudioStreamPlayer&lt;/code&gt;：播放音频。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Label&lt;/code&gt;：显示文字。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;场景是一组节点的组合。一个角色可以是一个场景，一个敌人可以是一个场景，一个关卡也可以是一个场景。&lt;/p&gt;
&lt;p&gt;比如一个玩家角色场景可能长这样：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Player (CharacterBody2D)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── Sprite2D
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── CollisionShape2D
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── Camera2D
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这棵树的意思是：玩家本体负责移动，&lt;code&gt;Sprite2D&lt;/code&gt; 负责显示角色图片，&lt;code&gt;CollisionShape2D&lt;/code&gt; 负责碰撞，&lt;code&gt;Camera2D&lt;/code&gt; 跟随玩家。&lt;/p&gt;
&lt;p&gt;Godot 的思路就是：把游戏拆成很多可复用场景，再把场景组合成完整游戏。&lt;/p&gt;
&lt;h2 id=&#34;第一个-2d-项目做什么&#34;&gt;第一个 2D 项目做什么
&lt;/h2&gt;&lt;p&gt;新手第一个项目不要做 RPG、开放世界、联机游戏或复杂平台跳跃。&lt;/p&gt;
&lt;p&gt;建议做一个最小 2D 闪避游戏：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;玩家可以上下左右移动。&lt;/li&gt;
&lt;li&gt;敌人从屏幕边缘出现。&lt;/li&gt;
&lt;li&gt;玩家碰到敌人就失败。&lt;/li&gt;
&lt;li&gt;存活时间越长分数越高。&lt;/li&gt;
&lt;li&gt;有开始按钮、失败界面和重新开始。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个项目很小，但能覆盖 Godot 入门最重要的东西：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;角色移动。&lt;/li&gt;
&lt;li&gt;输入系统。&lt;/li&gt;
&lt;li&gt;碰撞检测。&lt;/li&gt;
&lt;li&gt;敌人生成。&lt;/li&gt;
&lt;li&gt;UI 显示。&lt;/li&gt;
&lt;li&gt;定时器。&lt;/li&gt;
&lt;li&gt;音效。&lt;/li&gt;
&lt;li&gt;场景切换。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;做完它，你就已经跨过了“只会看教程，不知道怎么组织项目”的第一道坎。&lt;/p&gt;
&lt;h2 id=&#34;玩家移动怎么写&#34;&gt;玩家移动怎么写
&lt;/h2&gt;&lt;p&gt;在 Godot 里，玩家角色通常用 &lt;code&gt;CharacterBody2D&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;给 &lt;code&gt;Player&lt;/code&gt; 节点挂一个脚本：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript&#34; data-lang=&#34;gdscript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;CharacterBody2D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@export&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;speed&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;300.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;_physics_process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;delta&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;direction&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Vector2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ZERO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;direction&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;get_axis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;move_left&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;move_right&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;direction&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;y&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;get_axis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;move_up&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;move_down&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;direction&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;direction&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;normalized&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;velocity&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;direction&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;speed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;move_and_slide&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这段代码做了几件事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;读取水平和垂直方向输入。&lt;/li&gt;
&lt;li&gt;把方向向量归一化，避免斜向移动更快。&lt;/li&gt;
&lt;li&gt;把方向乘以速度，得到 &lt;code&gt;velocity&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;move_and_slide()&lt;/code&gt; 让角色移动并处理碰撞。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;还需要在 Project Settings 里设置输入：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;move_left  -&amp;gt; A / Left
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;move_right -&amp;gt; D / Right
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;move_up    -&amp;gt; W / Up
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;move_down  -&amp;gt; S / Down
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Godot 的输入系统建议一开始就用 action，不要在代码里直接写死键盘按键。这样以后支持手柄、触屏或改键会方便很多。&lt;/p&gt;
&lt;h2 id=&#34;碰撞和物理怎么理解&#34;&gt;碰撞和物理怎么理解
&lt;/h2&gt;&lt;p&gt;Godot 的碰撞不是只靠图片大小判断，而是靠碰撞形状。&lt;/p&gt;
&lt;p&gt;常用节点有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CollisionShape2D&lt;/code&gt;：给角色或敌人定义碰撞范围。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Area2D&lt;/code&gt;：检测进入、离开、重叠，适合触发器。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CharacterBody2D&lt;/code&gt;：适合玩家和会移动的角色。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RigidBody2D&lt;/code&gt;：适合受物理力影响的物体。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;StaticBody2D&lt;/code&gt;：适合墙、地面、固定障碍。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;入门阶段记住一个原则：&lt;/p&gt;
&lt;p&gt;如果你要自己控制角色移动，用 &lt;code&gt;CharacterBody2D&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;如果你只想检测“玩家碰到敌人”，敌人可以用 &lt;code&gt;Area2D&lt;/code&gt;，再监听信号：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript&#34; data-lang=&#34;gdscript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;_on_body_entered&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Player&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nf&#34;&gt;get_tree&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;reload_current_scene&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;后面项目变复杂时，可以改成发送 &lt;code&gt;game_over&lt;/code&gt; 信号，而不是直接重载场景。新手阶段先跑通逻辑更重要。&lt;/p&gt;
&lt;h2 id=&#34;场景实例化让敌人不断出现&#34;&gt;场景实例化：让敌人不断出现
&lt;/h2&gt;&lt;p&gt;Godot 的场景可以当成“预制体”使用。&lt;/p&gt;
&lt;p&gt;假设你有一个 &lt;code&gt;Enemy.tscn&lt;/code&gt;，可以在主场景里用脚本生成它：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript&#34; data-lang=&#34;gdscript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@export&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;enemy_scene&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;PackedScene&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;spawn_enemy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;enemy&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;enemy_scene&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;instantiate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;enemy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;position&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Vector2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;800&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;randf_range&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;50&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;550&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;add_child&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;enemy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;再配合 &lt;code&gt;Timer&lt;/code&gt; 节点，每隔一段时间调用一次 &lt;code&gt;spawn_enemy()&lt;/code&gt;，敌人就会不断生成。&lt;/p&gt;
&lt;p&gt;这就是 Godot 项目常见组织方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个场景负责一种对象。&lt;/li&gt;
&lt;li&gt;主场景负责调度和组合。&lt;/li&gt;
&lt;li&gt;需要时动态实例化子场景。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;ui-和分数&#34;&gt;UI 和分数
&lt;/h2&gt;&lt;p&gt;Godot 的 UI 使用 &lt;code&gt;Control&lt;/code&gt; 系列节点。&lt;/p&gt;
&lt;p&gt;常用节点包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CanvasLayer&lt;/code&gt;：让 UI 固定在屏幕上，不跟随相机移动。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Label&lt;/code&gt;：显示文字。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Button&lt;/code&gt;：按钮。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Panel&lt;/code&gt;：面板背景。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;VBoxContainer&lt;/code&gt; / &lt;code&gt;HBoxContainer&lt;/code&gt;：自动排版。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;分数可以先用存活时间来做：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript&#34; data-lang=&#34;gdscript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;score&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;_process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;delta&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;score&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;delta&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;$CanvasLayer/ScoreLabel&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;score&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这样每秒增加 1 分。后面可以改成击败敌人、收集金币或完成关卡加分。&lt;/p&gt;
&lt;h2 id=&#34;音效和反馈&#34;&gt;音效和反馈
&lt;/h2&gt;&lt;p&gt;小游戏好不好玩，很大一部分来自反馈。&lt;/p&gt;
&lt;p&gt;即使画面很简单，也要加：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;移动或点击音效。&lt;/li&gt;
&lt;li&gt;碰撞音效。&lt;/li&gt;
&lt;li&gt;得分音效。&lt;/li&gt;
&lt;li&gt;失败音效。&lt;/li&gt;
&lt;li&gt;屏幕震动或闪烁。&lt;/li&gt;
&lt;li&gt;按钮 hover / pressed 状态。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Godot 里可以用 &lt;code&gt;AudioStreamPlayer&lt;/code&gt; 播放音效：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript&#34; data-lang=&#34;gdscript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;$HitSound&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;play&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;新手常犯的错误是只做功能，不做反馈。功能能跑只是第一步，玩家能不能感到“我做了一个动作，游戏回应了我”，才是游戏体验的开始。&lt;/p&gt;
&lt;h2 id=&#34;文件怎么组织&#34;&gt;文件怎么组织
&lt;/h2&gt;&lt;p&gt;项目一开始就建议整理目录：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;res://
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── scenes/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├── Main.tscn
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├── Player.tscn
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   └── Enemy.tscn
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── scripts/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├── player.gd
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   └── enemy.gd
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── assets/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├── sprites/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   └── audio/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── ui/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    └── GameOver.tscn
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;不要把所有资源都丢在根目录。小游戏阶段无所谓，项目稍微大一点就会混乱。&lt;/p&gt;
&lt;p&gt;一个简单原则是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;场景放 &lt;code&gt;scenes/&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;脚本放 &lt;code&gt;scripts/&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;图片和音频放 &lt;code&gt;assets/&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;UI 单独放 &lt;code&gt;ui/&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;godot-新手常见坑&#34;&gt;Godot 新手常见坑
&lt;/h2&gt;&lt;p&gt;第一个坑：节点选错。&lt;/p&gt;
&lt;p&gt;能自己控制移动的角色用 &lt;code&gt;CharacterBody2D&lt;/code&gt;，不是随便用 &lt;code&gt;Node2D&lt;/code&gt;。触发检测用 &lt;code&gt;Area2D&lt;/code&gt;，固定障碍用 &lt;code&gt;StaticBody2D&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;第二个坑：忘记碰撞形状。&lt;/p&gt;
&lt;p&gt;只有图片没有碰撞体，游戏不会知道它们撞上了。&lt;/p&gt;
&lt;p&gt;第三个坑：把按键写死。&lt;/p&gt;
&lt;p&gt;不要直接判断 &lt;code&gt;KEY_A&lt;/code&gt;，用输入 action。&lt;/p&gt;
&lt;p&gt;第四个坑：场景职责混乱。&lt;/p&gt;
&lt;p&gt;不要让一个脚本同时管玩家、敌人、UI、音效和关卡。新手可以简单，但不要所有东西都堆在 &lt;code&gt;Main.gd&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;第五个坑：一开始就做大项目。&lt;/p&gt;
&lt;p&gt;第一个项目越小越好。只要完整，有开始、有失败、有重新开始，就比半途而废的大项目更有价值。&lt;/p&gt;
&lt;h2 id=&#34;推荐学习路线&#34;&gt;推荐学习路线
&lt;/h2&gt;&lt;p&gt;可以按这个顺序学：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;编辑器基本操作。&lt;/li&gt;
&lt;li&gt;节点和场景。&lt;/li&gt;
&lt;li&gt;GDScript 基础。&lt;/li&gt;
&lt;li&gt;输入系统。&lt;/li&gt;
&lt;li&gt;2D 角色移动。&lt;/li&gt;
&lt;li&gt;碰撞和 Area2D。&lt;/li&gt;
&lt;li&gt;Timer 和动态生成。&lt;/li&gt;
&lt;li&gt;UI 和分数。&lt;/li&gt;
&lt;li&gt;音效和动画。&lt;/li&gt;
&lt;li&gt;导出桌面或 Web 版本。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;不要一开始就钻源码，也不要马上学渲染管线、Shader、多人联机、复杂 AI。先把一个小项目做完，很多概念自然会有位置。&lt;/p&gt;
&lt;h2 id=&#34;godot-和-unity-怎么选&#34;&gt;Godot 和 Unity 怎么选
&lt;/h2&gt;&lt;p&gt;如果你主要做 2D 独立游戏、教学项目、个人原型，Godot 非常舒服。&lt;/p&gt;
&lt;p&gt;如果你需要庞大的资产商店、成熟商业插件、移动广告和商业化 SDK、成熟团队经验，Unity 生态仍然更强。&lt;/p&gt;
&lt;p&gt;如果你要做高规格 3D、复杂渲染、影视级画面，Unreal 更适合。&lt;/p&gt;
&lt;p&gt;对新手来说，不要把选引擎变成拖延。Godot 足够你做出大量完整小游戏。你真正需要先学会的是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;游戏循环。&lt;/li&gt;
&lt;li&gt;输入响应。&lt;/li&gt;
&lt;li&gt;碰撞和反馈。&lt;/li&gt;
&lt;li&gt;场景组织。&lt;/li&gt;
&lt;li&gt;状态管理。&lt;/li&gt;
&lt;li&gt;资源和版本管理。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些能力换到其他引擎也能用。&lt;/p&gt;
&lt;h2 id=&#34;第一个项目的完成标准&#34;&gt;第一个项目的完成标准
&lt;/h2&gt;&lt;p&gt;你可以用这个清单判断自己是否真的入门：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;玩家能移动。&lt;/li&gt;
&lt;li&gt;有敌人或障碍。&lt;/li&gt;
&lt;li&gt;有碰撞失败。&lt;/li&gt;
&lt;li&gt;有分数或目标。&lt;/li&gt;
&lt;li&gt;有开始界面。&lt;/li&gt;
&lt;li&gt;有失败界面。&lt;/li&gt;
&lt;li&gt;能重新开始。&lt;/li&gt;
&lt;li&gt;有至少两个音效。&lt;/li&gt;
&lt;li&gt;有简单动画或视觉反馈。&lt;/li&gt;
&lt;li&gt;能导出一个可运行版本。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;做到这里，你就不是“打开过 Godot”，而是真的完成了一个游戏闭环。&lt;/p&gt;
&lt;h2 id=&#34;总结&#34;&gt;总结
&lt;/h2&gt;&lt;p&gt;Godot 入门的关键，不是把所有功能看一遍，而是先理解它的组织方式：节点组成场景，场景组成游戏，脚本驱动行为，信号连接事件，资源通过目录管理。&lt;/p&gt;
&lt;p&gt;第一个项目建议从 2D 小游戏开始。玩家移动、敌人生成、碰撞失败、UI 分数、音效反馈、重新开始，这几个环节跑通之后，再去学动画树、TileMap、存档、状态机、3D、Shader 和导出优化。&lt;/p&gt;
&lt;p&gt;游戏开发不是先学完引擎再开始做，而是在做小项目的过程中反复补概念。Godot 的优势正好在这里：它足够轻，能让你很快从“想做游戏”走到“真的跑起来”。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
