<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>游戏开发 on KnightLi的博客</title>
        <link>https://knightli.com/tags/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/</link>
        <description>Recent content in 游戏开发 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://knightli.com/tags/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Godot 游戏开发入门：从节点、场景到第一个 2D 小游戏</title>
        <link>https://knightli.com/2026/05/17/godot-game-development-beginner-guide/</link>
        <pubDate>Sun, 17 May 2026 12:37:30 +0800</pubDate>
        
        <guid>https://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>
        <item>
        <title>DeepSeek V4 Flash 做 Godot 游戏 Demo：几毛钱能跑通到什么程度？</title>
        <link>https://knightli.com/2026/05/06/deepseek-v4-flash-godot-game-demo/</link>
        <pubDate>Wed, 06 May 2026 09:22:18 +0800</pubDate>
        
        <guid>https://knightli.com/2026/05/06/deepseek-v4-flash-godot-game-demo/</guid>
        <description>&lt;p&gt;&lt;code&gt;DeepSeek V4 Flash&lt;/code&gt; 用来开发 Godot 游戏 Demo，到底能不能打？&lt;/p&gt;
&lt;p&gt;重点很直接：它能不能做出一个可运行、可观察、带物理效果的 Godot 小 Demo。&lt;/p&gt;
&lt;p&gt;结论先说：可以跑通，效果不算商业级，但已经足够作为玩法原型和物理交互 Demo 使用。更重要的是，成本非常低，适合快速验证想法。&lt;/p&gt;
&lt;h2 id=&#34;demo-表现&#34;&gt;Demo 表现
&lt;/h2&gt;&lt;p&gt;这个 Demo 的重点是物理交互。&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;/ul&gt;
&lt;p&gt;从呈现效果看，它已经不是“只生成几段 Godot 脚本”那么简单，而是一个能运行、能观察物理表现的小型原型。&lt;/p&gt;
&lt;h2 id=&#34;可用程度&#34;&gt;可用程度
&lt;/h2&gt;&lt;p&gt;这个 Demo 的价值在于“能跑、能看、能改”。它不是完整游戏，也不是可以直接商业化的工程，但已经能说明几个问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DeepSeek V4 Flash&lt;/code&gt; 能理解 Godot Demo 的基本目标。&lt;/li&gt;
&lt;li&gt;AI Agent 可以把需求转成可运行工程。&lt;/li&gt;
&lt;li&gt;Godot 物理交互这种非网页类任务，已经可以进入低成本原型阶段。&lt;/li&gt;
&lt;li&gt;对个人开发者来说，它能把“想法”快速变成“能看的东西”。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果目标是做一个正式游戏，它当然还不够；但如果目标是验证“这个玩法有没有意思”“物理效果大概能不能做出来”，这个 Demo 已经可用。&lt;/p&gt;
&lt;h2 id=&#34;成本意义&#34;&gt;成本意义
&lt;/h2&gt;&lt;p&gt;最值得关注的不是画面有多精致，而是成本。&lt;/p&gt;
&lt;p&gt;如果一个 Godot 物理 Demo 只需要几毛钱级别的模型成本，就能得到一个可运行版本，那么它的意义就不是替代专业游戏开发，而是大幅降低原型试错成本。&lt;/p&gt;
&lt;p&gt;以前想验证一个小游戏想法，至少需要自己熟悉 Godot、写脚本、调场景、调物理参数。现在可以先让 AI Agent 生成一个可运行版本，再由人判断方向对不对。&lt;/p&gt;
&lt;p&gt;对独立开发者来说，这类低成本试错很有用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;快速验证玩法概念。&lt;/li&gt;
&lt;li&gt;生成临时 Demo 给别人看。&lt;/li&gt;
&lt;li&gt;探索 Godot API 和物理系统。&lt;/li&gt;
&lt;li&gt;把想法转成能跑的初版工程。&lt;/li&gt;
&lt;li&gt;在不确定方向前减少手写代码成本。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;deepseek-v4-flash-的表现&#34;&gt;DeepSeek V4 Flash 的表现
&lt;/h2&gt;&lt;p&gt;比较值得注意的是，使用的是 &lt;code&gt;DeepSeek V4 Flash&lt;/code&gt;，而不是更贵、更重的旗舰模型。&lt;/p&gt;
&lt;p&gt;它在“低成本原型”这个定位上表现不错。它不是最强、最稳、最适合交付生产工程的模型，但在预算敏感、想快速试一下方向的场景里，很有吸引力。&lt;/p&gt;
&lt;h2 id=&#34;适合什么场景&#34;&gt;适合什么场景
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;DeepSeek V4 Flash + Agent + Godot&lt;/code&gt; 更适合下面这些任务：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;小型玩法原型。&lt;/li&gt;
&lt;li&gt;物理效果 Demo。&lt;/li&gt;
&lt;li&gt;UI 或交互概念验证。&lt;/li&gt;
&lt;li&gt;教学示例。&lt;/li&gt;
&lt;li&gt;辅助理解 Godot 项目结构。&lt;/li&gt;
&lt;li&gt;生成第一版可运行工程。&lt;/li&gt;
&lt;/ul&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;/ul&gt;
&lt;p&gt;换句话说，它适合做“第一稿”和“试验场”，不适合当生产工程负责人。&lt;/p&gt;
&lt;h2 id=&#34;这说明了什么&#34;&gt;这说明了什么
&lt;/h2&gt;&lt;p&gt;这说明，AI 编程正在从网页、脚本、后端接口，继续向游戏开发和交互原型扩展。&lt;/p&gt;
&lt;p&gt;过去游戏开发的门槛很高，尤其是引擎、脚本、资源管理和物理系统混在一起时，新手很容易卡住。现在模型加 Agent 工具，可以先把工程搭起来，让开发者把注意力放在玩法判断和效果调优上。&lt;/p&gt;
&lt;p&gt;它带来的变化可能有三点：&lt;/p&gt;
&lt;p&gt;第一，游戏原型会更便宜。很多想法不用等到完整开发阶段才验证，可以先得到可运行 Demo。&lt;/p&gt;
&lt;p&gt;第二，独立开发者会更敢尝试。不会 Godot 的人，也可以借助 AI 先摸到项目结构和基本流程。&lt;/p&gt;
&lt;p&gt;第三，模型稳定性会变得更重要。游戏开发不是只要代码能跑，还要效果合理、手感正常、参数可控。未来谁能更好地结合实际画面和运行状态，谁就更适合做这类任务。&lt;/p&gt;
&lt;h2 id=&#34;小结&#34;&gt;小结
&lt;/h2&gt;&lt;p&gt;DeepSeek V4 Flash 做 Godot Demo，可以概括成一句话：&lt;strong&gt;效果不完美，但足够便宜、足够快，也足够适合做原型。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;它离商业游戏还很远，但如果目标是用极低成本验证一个小游戏想法，它已经很有价值。&lt;/p&gt;
&lt;p&gt;对个人开发者来说，最现实的用法不是把游戏全交给 AI，而是让 AI 先给出能跑的工程，再由人负责判断、取舍和打磨。这样用，DeepSeek V4 Flash 这类低成本模型反而会很香。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
