godot-demo-projects:40个直接能跑的开源Demo,带你上手Godot游戏开发 📅 发布时间:2026/9/18 20:44:14 👁 浏览次数: godot-demo-projects40个直接能跑的开源Demo带你上手Godot游戏开发【免费下载链接】godot-demo-projectsDemonstration and Template Projects项目地址: https://gitcode.com/GitHub_Trending/go/godot-demo-projectsgodot-demo-projects 是 Godot 演示项目合集收录 40 多个开箱即跑的开源 Demo覆盖 2D、3D、网络、音频等场景。它适合零 Godot 基础的开发者照着官方思路写游戏每个 Demo 都是独立项目指向目录就能运行。仓库全景10秒扫一遍仓库按主题切分顶层目录就是分类先看这张表再进去逛目录Demo 类型2d/角色移动、导航寻路、状态机、平台跳跃等 20 多个 2D 样例3d/3D 角色、粒子、灯光阴影、物理等 20 多个 3D 样例mono/pong、dodge_the_creeps 等经典 Demo 的 C# 版本networking/多人 pong、websocket 聊天、webrtcgui/、audio/UI 交互、字体、音效与合成loading/、mobile/存档加载、线程加载、移动端输入先 clone 下来git clone https://gitcode.com/GitHub_Trending/go/godot-demo-projects。每个 Demo 目录都有自己的project.godot所以你不需要合并任何工程编辑器打开哪个目录就能跑哪个。先让角色动起来玩家输入怎么写第一关永远是角色听我的话。这些 Demo 的数据流高度统一输入事件 → 改 velocity → 调move_and_slide()交给物理引擎。5分钟控制一个Pong挡板先选最轻量的例子。2d/pong/的挡板就是一个Area2D控制逻辑只有几行。挡板脚本每帧读取上下输入的强度差值按帧移动位置并用clamp挡住屏幕边缘extends Area2D const MOVE_SPEED : 100.0 func _process(delta): var input : Input.get_action_strength(left_move_down) - Input.get_action_strength(left_move_up) position.y clamp(position.y input * MOVE_SPEED * delta, 16, get_viewport_rect().size.y - 16)坑在输入函数上get_action_strength返回 0~1 的模拟值换成is_action_pressed就变成 0/1 布尔挡板移动会失去手感。Godot 2D 角色移动三行代码要会走路跳跃的角色看2d/kinematic_character/。玩家是CharacterBody2D水平移动、重力、跳跃全在一个_physics_process里完成。脚本干三件事读左右输入改水平速度、重力累积垂直速度、最后调一次move_and_slide()落地extends CharacterBody2D const WALK_FORCE : 600 const WALK_MAX_SPEED : 200 const JUMP_SPEED : 200 func _physics_process(delta): var walk : WALK_FORCE * Input.get_axis(move_left, move_right) velocity.x clamp(velocity.x walk * delta, -WALK_MAX_SPEED, WALK_MAX_SPEED) velocity.y get_gravity().y * delta move_and_slide() if is_on_floor() and Input.is_action_just_pressed(jump): velocity.y -JUMP_SPEED最容易踩的坑是把跳跃判断放在move_and_slide()之前。位移还没结算is_on_floor()的结果不可靠角色会漏跳或空中跳。让角色自己绕过障碍角色能走了下一步是让它自己绕开障碍。导航系统替你算好路线你只负责沿路线走。2D 导航寻路两步设好2d/navigation/的 Demo 里角色会绕开障碍走向鼠标点击处。设置就两步地图上放带NavigationPolygon资源的NavigationRegion2D角色身上挂NavigationAgent2D。脚本只做两件事点击时把鼠标位置写进 agent 的 target物理帧里沿着 agent 算出的路径点走extends CharacterBody2D var movement_speed : 200.0 onready var navigation_agent: NavigationAgent2D $NavigationAgent2D func _unhandled_input(event): if event.is_action_pressed(click): navigation_agent.target_position get_global_mouse_position() func _physics_process(_delta): if navigation_agent.is_navigation_finished(): return velocity global_position.direction_to(navigation_agent.get_next_path_position()) * movement_speed move_and_slide()最常见的故障是角色不动十有八九是NavigationPolygon没生成或改地图后没重新生成。把 agent 的debug_enabled打开路径点有没有算出来一目了然。3D 角色的前进方向跟着相机走到 3D前进不再是固定坐标轴而是相对相机的方向。3d/kinematic_character/用CharacterBody3D处理先把输入向量乘相机基变换再施加到速度上。精简后的关键段如下方向旋转是核心两行extends CharacterBody3D const MAX_SPEED : 3.5 const JUMP_SPEED : 6.5 func _physics_process(delta): var dir : Vector3(Input.get_axis(move_left, move_right), 0, Input.get_axis(move_forward, move_back)) dir $Target/Camera3D.global_transform.basis * dir velocity get_gravity() * delta velocity.x dir.x * MAX_SPEED velocity.z dir.z * MAX_SPEED move_and_slide() if is_on_floor() and Input.is_action_pressed(jump): velocity.y JUMP_SPEED坑有两处不乘相机基变换转视角按 W 会横着走用脚本瞬移角色后记得调reset_physics_interpolation()不然角色会从旧位置飞到新位置。别让复杂角色失控状态机Demo移动、跳跃、攻击、受击叠在一起if-else就失控了。2d/finite_state_machine/给出标准答案把每种行为拆成独立状态脚本交给状态机统一调度。把角色行为拆成状态player/states/下每个状态都是一个脚本idle、move、jump、attack、stagger。状态机基类只干三件事转发输入、转发物理帧、监听状态结束信号。调度逻辑在state_machine.gd核心段如下注意它维护了一个状态栈func _unhandled_input(event): current_state.handle_input(event) func _physics_process(delta): current_state.update(delta) func _change_state(state_name): if state_name previous: states_stack.pop_front() else: states_stack[0] states_map[state_name] current_state states_stack[0] state_changed.emit(current_state)值得学的是previous约定状态结束可以弹回栈里上一个状态攻击结束后自动回到移动状态不用为每对行为写转换表。抄这个 Demo 最容易犯的错是把状态逻辑写回玩家主脚本里——一写回去整个机制就退化成 if-else。按问题挑Demo不知道从哪下手按你要解决的问题对号入座Demo需要加的节点上手难度适合的项目类型调参频率pong 挡板Area2D低休闲、UI 交互练习低2D 角色CharacterBody2D低平台、俯视角动作中力与速度2D 导航NavigationAgent2D中自动跟随、寻路低状态机多个状态脚本较高多行为复杂角色高状态转换进阶与避坑Demo 之间互相独立动手前先看它属于哪个project.godot输入映射、自动加载、渲染器设置可能各不相同。移动逻辑放_physics_processmove_and_slide()和is_on_floor()只在物理帧有意义写进_process是角色抖动的头号原因。跳跃用Input.is_action_just_pressed换成is_action_pressed会变成持续跳跃手感全毁。3D Demo 注意渲染器复杂光照的用 Forward低配机器在 Project Settings 里切到 Compatibility 再跑。习惯 C# 的去mono/目录pong 等 Demo 与 GDScript 版结构一一对应需要 .NET 版 Godot 编辑器。别直接改 Demo 写自己的游戏把相关目录整个拷出去当骨架否则工程设置会和 Demo 的混在一起。下一步建议具体到动作先跑通2d/pong/再打开2d/kinematic_character/把WALK_MAX_SPEED改成 300 看角色跑得多快然后依次看2d/navigation/和2d/finite_state_machine/。这四个 Demo 能改明白再去3d/目录就不慌了。完整目录清单在各层README.md里都有仓库根目录那份最值得先读。【免费下载链接】godot-demo-projectsDemonstration and Template Projects项目地址: https://gitcode.com/GitHub_Trending/go/godot-demo-projects创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考