Godot Playground

示例

133 个可以直接在编辑器里打开的项目。每个都是纯 GDScript,自己构建场景,因此没有任何需要导入的资源。

133 个示例中的 133 个
运动12
2D

弹跳的球

一个球横穿屏幕并在边缘反弹。这是最小的循环:读取 delta,移动,取反速度。

Polygon2DColorRect
2D

跟随鼠标

两个形状追同一个目标,一个用 lerp,一个用 move_toward。两者之间的滞后差别就是全部要点。

Node2DPolygon2DInputEventMouseMotion
2D

公转与自转

三层嵌套的 Node2D 和两次旋转。子节点因为父节点在转而公转,孙节点又绕着子节点转。

Node2DLine2DPolygon2D
2D

追逐与逃离

逃跑者躲开鼠标,追逐者跟着逃跑者。两边都用 direction_to,只有符号不同。

Node2DLine2DVector2
2D

屏幕环绕

一艘 Asteroids 风格的飞船和八块石头,从一边出去就从另一边回来。两次 wrapf 调用就够了。

Node2DPolygon2DInput
2D

鼠标拖尾

一个 Line2D 在指针处添加新点,满了就丢掉最旧的。宽度曲线和渐变负责淡出。

Line2DGradientCurve
2D

用鼠标绘画

按住左键绘制。每一笔都是一个新的 Line2D,右键清空画布。

Line2DInputEventMouseButtonInputEventMouseMotion
2D

沿曲线移动

逐点构建的 Curve2D,用 tessellate 绘制,由三个 PathFollow2D 沿着走。唯一变化的只有进度值。

Path2DPathFollow2DCurve2D
2D

阻尼弹簧

临界阻尼弹簧和 lerp 跟随器追踪同一个移动目标。弹簧跟得上,lerp 总是落后。

Polygon2DLine2DLabel
2D

网格吸附

一个循环移动的自由位置,以及同一个位置经过 snapped 之后的结果。蓝色方块只会停在网格点上。

Polygon2DLine2DVector2
2D

上下浮动

九个形状共用同一条正弦波,每个都比前一个提前一个相位。不用 Tween,也不用 AnimationPlayer。

Node2DLine2DTime
2D

帧数与 delta

同一个速度常量分别在有和没有 delta 的情况下使用,每行都显示走过的距离。第二行的快慢完全取决于帧率。

Polygon2DLabelEngine
物理15
2D

平台跳跃

用 CharacterBody2D 实现重力、跳跃和地面检测,平台由代码生成。

CharacterBody2DStaticBody2DCollisionShape2D
2D

箱子堆

十六个箱子落在两堵墙之间。想看物理求解器干活时,第一个该试的例子。

RigidBody2DCollisionShape2DRectangleShape2D
2D

关节链

十二个互相铰接的链节,末端挂着一个重物。点击推动链条,看它慢慢稳定下来。

PinJoint2DRigidBody2DStaticBody2D
2D

弹簧关节

三根静止长度相同、刚度和阻尼各异的弹簧并排放置。

DampedSpringJoint2DRigidBody2DLine2D
2D

区域检测

一个统计有什么东西掉进来的区域,用的是 body_entered 和 body_exited 信号。

Area2DRigidBody2DLabel
2D

视野锥

二十八条射线朝鼠标呈扇形展开。碰到墙的那条会变红,这就是最简单形式的视线判断。

RayCast2DLine2DStaticBody2D
2D

形状投射

一个方块在移动前先问自己会停在哪里。那个虚影就是投射返回的安全比例。

ShapeCast2DPolygon2DStaticBody2D
2D

单向平台

从下面可以穿过蓝色平台,从上面则能落在上面。一个属性就搞定了全部。

CharacterBody2DCollisionShape2DStaticBody2D
2D

弹性与摩擦

三个球从同一高度落下,配三种 PhysicsMaterial 设置。bounce 的取值就是全部差别。

PhysicsMaterialRigidBody2DStaticBody2D
2D

传送带

两条一个像素都不动的传送带。constant_linear_velocity 会拖动接触它们的任何东西。

StaticBody2DRigidBody2DCollisionShape2D
2D

冲击波

54 个箱子组成的墙,点击会把它们推开,力度随距离衰减。

RigidBody2DInputEventMouseButtonCollisionShape2D
3D

物理掉落

点击就往地面丢一个 RigidBody3D,看它们堆起来。你生成的会在十秒后自行清除。

RigidBody3DStaticBody3DCollisionShape3D
3D

多米诺骨牌

二十块骨牌排成曲线,只给第一块一个冲量。之后的一切都交给求解器。

RigidBody3DBoxShape3DCamera3D
3D

合页门

一扇由带角度限制的合页固定的门。点击推动它,看限制在哪里挡住了摆动。

HingeJoint3DRigidBody3DStaticBody3D
3D

果冻方块

三个刚度不同的 SoftBody3D 方块落地。变形的是网格本身。

SoftBody3DBoxMeshStaticBody3D
粒子6
界面16
Control

控件一览

基础控件集中在一屏,每个都通过自己的信号向同一个标签汇报。

ButtonCheckBoxOptionButtonHSliderSpinBoxLineEdit
Control

容器巡礼

同样的四个方块交给四种容器。在 Godot 里做布局,就是选谁来安排子节点。

VBoxContainerHBoxContainerGridContainerCenterContainer
Control

锚点与预设

六个用布局预设固定的面板。调整游戏画面大小,每个都守住自己的角落。

ControlPanelStyleBoxFlat
Control

用代码设置主题

同样的三个节点出现两次,差别只是几行 add_theme。

StyleBoxFlatButtonProgressBar
Control

富文本

加粗、颜色、wave、shake 和 rainbow,全都是一个标签里的 BBCode 标签。完全不涉及动画节点。

RichTextLabel
Control

进度与计时器

一个 Timer 填充进度条,可以暂停和继续。进度条读的是 time_left,它自己并不计时。

ProgressBarTimerButton
Control

拖放

筹码在插槽之间移动。三个方法完成全部工作:_get_drag_data、_can_drop_data 和 _drop_data。

PanelContainerGridContainerColorRect
Control

树形视图

一棵两列的场景树,由一个递归函数从嵌套字典构建而成。

TreeTreeItem
Control

物品列表

支持多选的 ItemList,可以移除选中的行,也可以再放回去。

ItemListButton
Control

标签页与分割

一个侧边面板和三个标签页共享宽度。拖动分隔条,两边一起变化。

TabContainerHSplitContainerPanelContainer
Control

节点图

四个带端口的节点,拖拽即可连线。GraphEdit 负责画曲线,是否接受连接由你决定。

GraphEditGraphNode
Control

颜色选择器

完整的选择器连着实时预览、十六进制读数和一排保存的色块。

ColorPickerColorRect
Control

弹窗与对话框

一个右键菜单和两个对话框,各自通过自己的信号回报结果。

PopupMenuAcceptDialogConfirmationDialog
Control

键盘焦点

九个按钮通过 focus_neighbor 连成环形,用 tab 和方向键遍历。这是一套不用鼠标也能操作的界面。

ButtonGridContainer
Control

虚拟摇杆

一个被限制在圆环内的摇杆,驱动一个圆点移动。在手机上同样的代码响应触摸。

PanelStyleBoxFlatInputEventMouseMotion
Control

响应式仪表板

网格中的六张卡片,视口变窄时从三列变成两列。

GridContainerPanelContainerMarginContainer
3D 场景12
3D

基础网格巡礼

六种基础网格排在旋转的环上,每个都有自己的材质:金属、粗糙和自发光。

MeshInstance3DStandardMaterial3DDirectionalLight3D
3D

波浪网格

196 个立方体随正弦波起伏。搭建时两层嵌套循环,每帧一行数学。

MeshInstance3DBoxMeshCamera3D
3D

移动方块

WASD 驱动 CharacterBody3D 在柱子之间穿行,相机在后面跟随。不用鼠标转视角。

CharacterBody3DCamera3DStaticBody3D
3D

环绕相机

按住左键拖动可绕中心物体转动相机,滚轮缩放。偏航、俯仰和距离就是全部状态。

Camera3DInputEventMouseMotionInputEventMouseButton
3D

看向目标

八个锥体对同一个移动的球体调用 look_at。每帧一次调用就替代了全部三角函数。

Node3DMeshInstance3DOmniLight3D
3D

太阳系

嵌套的 Node3D 支点各自以不同速率旋转。卫星绕着行星转,同时免费继承了行星的公转。

Node3DMeshInstance3DOmniLight3D
3D

CSG 造型

一个与球体保持相交的方块,被三个圆柱钻孔,而圆柱每两秒在相减、相并和相交之间切换。

CSGCombiner3DCSGBox3DCSGSphere3DCSGCylinder3D
3D

MultiMesh 森林

两个 MultiMeshInstance3D 节点绘制出四千棵树,树冠使用逐实例颜色。

MultiMeshInstance3DMultiMeshCylinderMesh
3D

3D 中的精灵

公告板模式的 Sprite3D 宝石,纹理由代码逐像素绘制,每个都由 Label3D 标注名字。中间那块牌子关闭了公告板以作对比。

Sprite3DLabel3DImageTexture
3D

灯光巡礼

同样的几何体和同样的白色材质出现三次。cull mask 让每盏灯各管场景的三分之一。

OmniLight3DSpotLight3DDirectionalLight3D
3D

反射探针

金属球在不使用屏幕空间反射的情况下映出一间彩色房间。三种粗糙度显示镜面变模糊的速度。

ReflectionProbeStandardMaterial3DCamera3D
3D

Transform 基础

五个方块和五个手写的 Transform3D:单位矩阵、原点、旋转 Basis、缩放 Basis 以及三者的组合。一个虚影标出单位矩阵的位置。

Transform3DBasisMeshInstance3D
着色器14
2D着色器

Canvas 着色器

由 TIME 驱动的全屏 canvas 着色器。改一个 uniform 并保存,项目就会重新加载。

ColorRectShaderMaterialCanvasLayer
2D着色器

调色板替换

精灵存的是调色板索引而不是颜色,所以轮换调色板就能重绘整幅画面。

Sprite2DImageTextureShaderMaterial
2D着色器

CRT 屏幕

在普通 2D 场景上叠加桶形畸变、扫描线和色差。整个效果只是一次全屏处理。

ColorRectCanvasLayerPolygon2D
2D着色器

暗角与颗粒

在 3D 场景上做去色、暗角和胶片颗粒,只用十一行读取屏幕纹理的代码。

ColorRectCanvasLayerMeshInstance3D
3D着色器

Spatial 着色器

一个顶点随波浪起伏、自发光同时脉动的球体,写在 spatial 着色器里。

MeshInstance3DShaderMaterialWorldEnvironment
3D着色器

溶解

用 GDScript 生成的噪声纹理配合着色器里的 discard,阈值处还有一圈燃烧的边缘。

MeshInstance3DNoiseTexture2DFastNoiseLite
3D着色器

边缘光

法线与视线之间的夹角,取幂之后作为强度。三个形状,三种边缘光强度。

MeshInstance3DShaderMaterialWorldEnvironment
3D着色器

卡通着色

在着色器的 light 函数里把光照量化成色阶,再加一个硬边高光点。

MeshInstance3DDirectionalLight3DShaderMaterial
3D着色器

天空着色器

带星星的程序化日落,写成 shader_type sky。太阳的圆盘跟随光照节点。

SkyShaderMaterialDirectionalLight3D
3D着色器

深度雾

相机前的一个四边形读取 DEPTH_TEXTURE,因此雾知道每个像素有多远。

QuadMeshCamera3DShaderMaterial
3D着色器

热浪扭曲

噪声推动屏幕 UV,并遮罩到画面下半部分,好让差别一眼看清。

ColorRectNoiseTexture2DCanvasLayer
3D着色器

水面

波浪写在顶点着色器里,法线由导数重新计算,因此光照会跟着波浪走。

PlaneMeshShaderMaterialMeshInstance3D
3D着色器

无限网格

一个平面,没有任何纹理。fwidth 让每条线无论相机多远都保持一个像素宽。

PlaneMeshShaderMaterialCamera3D
3D着色器

三平面映射

四个没有 UV 的网格,从世界的三个轴向投影贴图,再按法线混合。

MeshInstance3DNoiseTexture2DShaderMaterial
程序化生成13
2D

噪声查看器

六种 FastNoiseLite 类型并排展示,同一个种子且不加分形,好让每种的特点显出来。

FastNoiseLiteNoiseTexture2DTextureRect
3D

噪声地形

高度图通过 SurfaceTool 变成 ArrayMesh,再用顶点色按高度着色。

SurfaceToolArrayMeshMeshInstance3D
2D

岛屿生成器

噪声乘以径向遮罩,再逐条绘制进 Image。点击生成另一座岛。

FastNoiseLiteImageImageTexture
2D

迷宫生成器

用回溯法挖出的完美迷宫。通道按挖掘顺序出现,颜色也按这个顺序区分。

ImageImageTextureSprite2D
2D

地牢房间

互不重叠地摆放房间,再用随机游走在每一对之间挖出走廊。

Polygon2DLine2DRect2i
2D

L 系统树

一个字符串被两条规则重写四次,然后当作海龟绘图指令读取,每根树枝一个 Line2D。

Line2DLabel
2D

流场

噪声为屏幕上每个点给出一个角度。箭头显示这个场,粒子跟着它走。

FastNoiseLiteLine2D
2D

Marching squares

噪声场的等值线,随着阈值扫过而重绘。场本身从不改变,改变的只是切面。

Node2DFastNoiseLiteLabel
3D

ImmediateMesh 线条

每帧清空并逐顶点重建的网格,包含一条线带和一个线面。

ImmediateMeshMeshInstance3DStandardMaterial3D
3D

SurfaceTool 实体

同一个实体用 SurfaceTool 提交两次,一个硬边一个平滑。区别只在平滑组。

SurfaceToolArrayMeshLabel3D
3D

GridMap 体素

运行时构建的 MeshLibrary 加上由高度图填充的 GridMap,每个格子一个立方体。

GridMapMeshLibraryBoxMesh
2D

用代码生成 TileMap

图集是逐像素绘制的 Image 的 TileSet,再一格一格摆到 TileMapLayer 上。

TileMapLayerTileSetTileSetAtlasSource
2D

几何工具

三次 Geometry2D 调用并把结果画出来:多边形求交、凸包和多边形偏移。

Geometry2DPolygon2DLine2D
寻路9
2D

2D 寻路代理

用代码烘焙的导航区域,以及一个绕着四个角走的代理。点击任意位置可以把它派到别处。

NavigationRegion2DNavigationAgent2DNavigationPolygon
3D

3D 寻路代理

同样的思路搬到三维,NavigationMesh 在加载时由基础网格烘焙而来。点击地面选择目的地。

NavigationRegion3DNavigationAgent3DCharacterBody3D
2D

动态障碍

三个障碍物不断进出导航网格。每次切换都会重新烘焙区域,代理走的是当时还通着的那条路。

NavigationObstacle2DNavigationRegion2DNavigationAgent2D
2D

AStarGrid2D

墙壁会封锁格子,黄色格子的通行代价是六倍。得到的是最省成本的路线,而不是最短的那条。

AStarGrid2DPolygon2DLine2D
2D

AStar2D 图

四十个点按距离相连,AStar2D 在其中两点之间寻路。这里没有网格,图就是你连出来的样子。

AStar2DLine2DPolygon2D
2D

靠近与远离

靠近和远离就是同样两行代码翻转一个符号。画出来的向量分别是期望速度、当前速度和两者之差。

Node2DPolygon2DLine2D
2D

游荡

每个代理瞄准的点只在身前的圆上微微滑动。正是这一点让游荡看起来像有意图,而不是噪声。

Node2DLine2DRandomNumberGenerator
2D

群集行为

七十二个 boid 对小半径内的同伴执行分离、对齐和聚合。每个的颜色取决于它能看到多少邻居。

Polygon2DLine2DNode2D
2D

巡逻状态机

一个 enum 加一个 match 块驱动巡逻、追击和返回。底部那条显示的是最近几秒的状态。

Node2DLabelLine2D
相机8
动画9
2D

缓动曲线

五个方块横穿屏幕,每个对应一种过渡曲线。这是看清每种缓动效果最快的方式。

TweenPolygon2DLabel
2D

链式 Tween

一个 tween 连续跑四个步骤。tween_callback 让当前步骤在屏幕上亮起,parallel 则把两个属性放进同一个步骤。

TweenPolygon2DLine2D
2D

用代码做动画

启动时逐帧写入的位置轨道和颜色轨道,没有任何 .anim 文件。下方的时间轴显示的就是代码插入的那些关键帧。

AnimationPlayerAnimationAnimationLibrary
2D

Curve 资源

逐点构建并用 sample(t) 读取的 Curve。图表由驱动方块的同一个资源绘制,旁边是一个只按时间移动的方块。

CurveLine2DPolygon2D
2D

用代码生成精灵帧

启动时在 Image 缓冲区里绘制的八帧行走循环,交给 AnimatedSprite2D 播放。底部那条就是 SpriteFrames 本身。

AnimatedSprite2DSpriteFramesImageTexture
2D

2D 骨骼

一条由单个 Polygon2D 蒙皮到两根骨骼上的关节手臂。旋转 Bone2D 会带动权重在它上面的顶点。

Skeleton2DBone2DPolygon2D
2D

挤压与拉伸

两边是节奏完全相同的同一个跳跃,只有右边对缩放做了 tween。多出的三行就是全部差别。

TweenPolygon2DColorRect
2D

状态驱动动画

待机、蓄力、冲刺和恢复,每个状态都有自己的 tween。进入新状态会杀掉上一个的 tween,所以它们不会争抢同一个属性。

TweenPolygon2DLabel
3D

3D 骨骼姿势

用代码创建的六节骨骼链,每帧通过 set_bone_pose_rotation 摆姿势。每个 BoneAttachment3D 都带着跟随自身骨骼的网格。

Skeleton3DBoneAttachment3DMeshInstance3D
音频6
输入5
数据8