ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Godot 2.5D 演示项目深度解析:用 Node25D 插件混合 2D 与 3D 节点构建 2.5D 游戏

2026/10/3 8:40:09 拓冰建站 浏览量
Godot 2.5D 演示项目深度解析:用 Node25D 插件混合 2D 与 3D 节点构建 2.5D 游戏 示例工程【免费下载链接】godot-demo-projectsDemonstration and Template Projects项目地址https://gitcode.com/GitHub_Trending/go/godot-demo-projects点击查看免费下载导读本文基于 godot-demo-projects 仓库中的 misc/2.5d/README.md 及其配套源码系统讲解一种在 Godot 中创建 2.5D 游戏的完整思路通过自定义插件引入Node25D、YSort25D、ShadowMath25D三类节点以「3D 节点算数学、2D 精灵做渲染」的方式混合使用 2D 与 3D并配套一个 2.5D 专用编辑器视口用于直观地编辑关卡。读完本文你将掌握 2.5D 变换矩阵的构成与六种视角模式俯视、正面、45 度、等距、两种斜轴的实现原理以及如何用该插件快速搭建可运行、可排序、带阴影的 2.5D 场景。项目概览这是什么以及它如何运行这是一个使用 GDScript 编写、采用CompatibilityGL 兼容渲染器的官方演示项目工程配置见 project.godotrenderer/rendering_methodgl_compatibility。它的核心观点非常明确2.5D 游戏 用 3D 节点做物理与数学计算用 2D 节点做最终渲染。具体来说整个项目的摄像头是 2D 的所有精灵Sprite也是 2D 的而 3D 节点CharacterBody3D、StaticBody3D等只负责提供数学位置与碰撞计算并不会被真正渲染。这种「借 3D 的算力、出 2D 的画面」的设计让开发者能继续享受 2D 工作流2D 相机、2D 精灵、2D 着色器的同时获得 3D 空间中的真实深度信息用于排序与投影。本项目的 GDScript 版本位于 misc/2.5d仓库中还提供了对应的 C# 版本mono/2.5d供使用 Godot C# 的开发者对照学习。插件结构三类自定义节点是如何注册的所有核心代码都封装在一个名为 Node25D 的编辑器插件中目录结构如下插件入口node25d_plugin.gd插件声明plugin.cfg核心节点node_25d.gd排序节点y_sort_25d.gd阴影节点shadow_math_25d.gd编辑器视口viewport_25d.gd插件在进入编辑器时通过add_custom_type注册三个自定义类型node25d_plugin.gd自定义类型基类作用Node25DNode2D所有 2.5D 对象的基类负责 3D→2D 坐标换算YSort25DNode注意不是 Node2D/Node25D对父节点下所有 2D 子节点按深度排序ShadowMath25DShapeCast3D向下发射形状投射计算并放置阴影同时插件注册了一个主屏幕_has_main_screen()返回true名为2.5D对应编辑器中的 2.5D 视口面板。核心原理Node25D 与 2.5D 变换矩阵节点的层级约定Node25D的用法遵循一个严格约定README 明确说明第一个子节点必须是一个 3D 节点如Node3D、CharacterBody3D、StaticBody3D它只用来计算位置再添加一个 2D 精灵Sprite2D或类似节点用来显示对象外观。在 node_25d.gd 的Node25D_ready()中节点会直接取get_child(0)作为_spatial_node即第一个 3D 子节点所有 2D 精灵则作为后续子节点跟随父节点一起移动。2.5D 变换矩阵位置换算的核心是一组由三个Vector2构成的基向量_basisX、_basisY、_basisZ它们把 3D 世界坐标的 X、Y、Z 三个轴分别映射到屏幕上的 2D 方向。换算逻辑在Node25D_process()中node_25d.gdvar flat_pos _spatial_position.x * _basisX flat_pos _spatial_position.y * _basisY flat_pos _spatial_position.z * _basisZ global_position flat_pos其中SCALE常量定义了1 个 3D 单位对应多少 2D 像素默认值为 32node_25d.gd。注释特别建议该值最好是整数不强制因为整数缩放能让精灵在不同视角下的投影更整齐。修改Node25D_ready()中的三个基向量即可改变所有Node25D实例的默认视角。值得一提的是源码注释还解释了为什么不用一个自定义结构体Basis25D而是用三个裸Vector2早期 GDScript 无法把自定义类型用作内部成员结构见 node_25d.gd 中引用的引擎 issue因此这里采用了展开存储的写法便于直接扩展。六种视角模式set_view_mode(view_mode_index)用match语句切换六套基向量node_25d.gd索引视角_basisX_basisY_basisZ045 度Forty Five Degrees(1, 0)(0, -0.7071)(0, 0.7071)1等距Isometric(0.8660, 0.5)(0, -1)(-0.8660, 0.5)2俯视Top Down(1, 0)(0, 0)(0, 1)3正面Front Side(1, 0)(0, -1)(0, 0)4斜轴 YOblique Y(1, 0)(-0.7071, -0.7071)(0, 1)5斜轴 ZOblique Z(1, 0)(0, -1)(-0.7071, 0.7071)注意表格中的数值均需乘以SCALE32。其中 45 度与等距视角大量使用0.70710678118√2/2与0.86602540378√3/2这类三角常数这正是标准等距投影的几何基础。_check_view_mode()node_25d.gd会在非编辑器环境下轮询输入动作forty_five_mode、isometric_mode、top_down_mode、front_side_mode、oblique_y_mode、oblique_z_mode实时切换视角。这些输入动作在 project.godot 的[input]段中定义对应键盘快捷键分别为 U、I、O、J、K、L。README 强调要实现自定义视角只需在 Node25D 中定义一组新的基向量并应用到所有实例再为对象准备对应视角的 2D 精灵即可——这在本项目中被反复验证见下文精灵实现。深入实操从精灵到角色再到阴影2D 精灵如何适配多种视角2.5D 的核心难点之一是同一对象在不同视角下应有不同的外观。仓库对此给出了完整解法每个精灵节点都预加载全部六张视角贴图并在视角切换时替换。以平台精灵 platform_sprite.gd 为例它预加载了 assets/platform/textures 下的forty_five.png、isometric.png、top_down.png、front_side.png、oblique_y.png、oblique_z.png六张贴图set_view_mode()中通过match把texture换成对应贴图。角色精灵 player_sprite.gd 与阴影精灵 shadow_sprite.gd 采用相同的模式。角色精灵更进一步除了换贴图它还会修改精灵自身的 2D 变换transform.x/transform.y让角色画面在俯视时压扁y 缩放 0.5、45 度视角时轻微压扁y 缩放 0.75等player_sprite.gd从而在多个视角下都显得自然。它还基于_check_movement()返回的八方向_direction与地面检测move_and_collide向下探测在「站立 / 奔跑 / 跳跃」三张贴图间切换动画帧player_sprite.gd。3D 节点只做数学角色移动与平台碰撞角色的数学体是 player_math_25d.gdclass_name PlayerMath25D它继承CharacterBody3D但自身永远不可见仅承担移动计算水平移动Input.get_vector读取 WASD 输入组合出 3D 方向后通过move_and_slide()驱动速度默认 10按住movement_modifierShift时减半垂直移动跳跃时vertical_speed 60每帧受重力240 * delta影响再用move_and_collide(Vector3.UP * vertical_speed * delta)检测落地特别地等距视角下它会把 WASD 映射为斜 45 度的对角线方向isometric_controls逻辑player_math_25d.gd并可通过toggle_isometric_controlsT 键切换为标准方向控制。场景中的平台则使用StaticBody3DBoxShape3D作为数学体例如 demo_scene.tscn 中每个PlatformX节点下都有PlatformMathStaticBody3D与PlatformSpriteSprite2D两个子节点严格遵循「3D 数学 2D 显示」的约定。这也印证了 README 的说法——任何 3D 节点都可以用来做数学计算。2.5D 编辑器视口边看 2D 边编辑 3D 坐标README 提到项目「添加了一个 2.5D 编辑器视口方便编辑 2.5D 关卡」。该视口由 viewport_25d.gd 实现是插件主屏幕的核心共享 2D 世界视口内的SubViewport与当前编辑场景共用同一个world_2d因此编辑器视口里看到的正是游戏运行时 2D 层的真实画面viewport_25d.gd视角按钮联动顶栏的视角按钮组45 Degree / Isometric / Top Down 等切换后_recursive_change_view_mode会递归遍历整个场景树调用每个节点的set_view_modeviewport_25d.gd缩放与平移鼠标滚轮缩放每级缩放倍率为 2 的 13 次根1.05476607648即 13 级翻倍中键拖拽平移且支持选中节点 gizmo 的同步缩放viewport_25d.gd。由于Node25D暴露了spatial_positionexport var spatial_position: Vector3见 node_25d.gd在编辑器里修改该导出属性即可直接调整对象的 3D 坐标随后 2D 位置会立即按当前基向量重新投影——这正是「2.5D 关卡编辑」的落地方式。深度排序YSort25D为了让靠近屏幕下方的对象遮挡上方的对象经典 2D 伪深度插件提供了YSort25D。它直接继承Node挂在某个 2D 父节点下对该父节点的所有Node2D子节点排序y_sort_25d.gd收集父节点下所有Node2D子节点用Node25D.y_sort_slight_xz做自定义排序比较——该比较器以 Y 为主键并叠加0.001 * (x z)的微小权重来消解同高度歧义node_25d.gd按排序结果依次设置z_index从-4000 开始、每次递增 2。关于步长与上限源码注释给出了明确约束Godot 的z_index取值范围是 -4096 到 4096步长 2 是为了给阴影在相邻物体之间留出插入空间阴影的z_index为 -3958正好夹在物体之间见 demo_scene.tscn因此单个YSort25D最多可排序 4000 个节点超过会打印错误并中止y_sort_25d.gd。sort_enabled导出变量控制是否在_process中自动排序也可以手动调用sort()方法。阴影计算ShadowMath25DREADME 描述阴影为「一个试图向下投射的简单 CharacterBody」。实际实现 shadow_math_25d.gd 继承自ShapeCast3D使用方式非常特殊它作为Shadow25D的子节点而Shadow25D位于目标对象之前的兄弟位置不是子节点——即在场景树中阴影节点排在目标对象的下一个兄弟_ready()中通过索引取前一个兄弟节点再取其第一个 3D 子节点作为投射目标shadow_math_25d.gd若位置不对会输出push_error_physics_process中把自身position对齐到目标 3D 位置调用force_shapecast_update()强制更新形状投射若is_colliding()则把阴影global_position移到碰撞点并显示否则隐藏阴影shadow_math_25d.gd。也就是说阴影的「高度」由 ShapeCast3D 朝 -Y向下的射线命中决定落地则显示、悬空则隐藏从而实现了对角色跳跃/平台落差的实时响应。在 demo_scene.tscn 中Player25Dz_index -3956与Shadow25Dz_index -3958紧邻正好满足上述兄弟关系约定。场景搭建实战读懂 demo_sceneassets/demo_scene.tscn 是演示主场景其结构完整展示了插件的全部用法同时它也是 project.godot 中配置的主场景run/main_sceneres://assets/demo_scene.tscnDemoScene (Node2D) ├── Overlay (UI 操作提示, assets/ui/overlay.tscn) ├── Player25D (Node25D) z_index -3956 │ ├── PlayerMath25D (CharacterBody3D) ← 数学 │ └── PlayerSprite (Sprite2D) ← 显示 ├── Shadow25D (Node25D) z_index -3958 │ ├── ShadowMath25D (ShapeCast3D) ← 投射 │ └── ShadowSprite (Sprite2D) ├── Platform0 … Platform23 (Node25D) z_index -3952 … -4000 │ ├── PlatformMath (StaticBody3D CollisionShape3D) │ └── PlatformSprite (Sprite2D) ├── YSort25D (Node) └── AudioStreamPlayer (assets/mr_mrs_robot.ogg)从源码结构可以推断各平台节点的z_index已被 YSort25D 按深度赋值为从 -3952 到 -4000 的递减序列且阴影 z_index 恰好落在相邻平台之间——这与 YSort25D「步长 2 为阴影留位」的设计完全吻合。主场景还包含一个立方体演示assets/cube/cube.tscn cube_math.gd脚本在_ready()中生成 27 个Node3D数学点坐标为 -1/0/1 的 3×3×3 组合乘以 5_process中通过 Q/E、A/D、W/S 旋转整个立方体数学体并把 27 个点同步给父节点的 2D 精灵cube_math.gd直观演示了「任意 3D 几何都能被投影成 2.5D 画面」。按 C 键可在主场景与立方体场景间切换按 Esc 退出。工程配置与运行方式项目的主要工程配置project.godot要点如下渲染器gl_compatibility桌面与移动端一致纹理过滤关闭default_texture_filter0保证像素风精灵锐利物理physics_ticks_per_second120即物理运算以 120Hz 进行配合 3D 数学体获得更平滑的碰撞与投射结果窗口1600×900canvas_items拉伸模式 expand宽高比输入映射WASD/方向键移动、Shift 减速、Space 跳跃、R 复位、C 切换立方体演示、T 切换等距控制、U/I/O/J/K/L 切换六种视角、Esc 退出插件editor_plugins/enabledPackedStringArray(res://addons/node25d/plugin.cfg)启用 Node25D 插件。运行方式用 Godot 4.x工程特征为 4.7导入本目录并直接运行主场景即可。若要在自己的项目中使用只需把 addons/node25d 整个目录复制到项目的addons/下并在 Project Settings → Plugins 中启用 Node25D之后即可在场景中直接添加Node25D、YSort25D、ShadowMath25D节点。运行效果一览六种视角下游戏运行画面分别见 screenshots/forty_five.png、screenshots/isometric.png、screenshots/oblique_z.png、screenshots/oblique_y.png、screenshots/front_side.png 与 screenshots/cube.png。以下两张分别展示等距与 45 度视角下的实际运行场景分层平台、角色与阴影总结这套方案给你的启发从 misc/2.5d/README.md 与配套源码可以提炼出三条可直接复用的设计经验职责分离是 2.5D 的灵魂3D 节点CharacterBody3D/StaticBody3D/ShapeCast3D只负责数学与物理2D 节点Sprite2D/Node2D只负责渲染二者通过Node25D的基向量矩阵桥接视角是一种可插拔配置六种视角本质只是三组Vector2基向量 六套对应贴图扩展新视角只需追加基向量与精灵资源深度与阴影可以全自动YSort25D按 Y 坐标含轻微 X/Z 扰动排序并预留阴影层级ShadowMath25D用形状投射实时计算落点让 2.5D 场景保持 2D 式的简单组织方式。该项目同时提供 GDScriptmisc/2.5d与 C#mono/2.5d两个版本是学习 Godot 混合 2D/3D 工作流、实现伪 3D 视角游戏的良好参考起点。附资源许可背景音乐assets/mr_mrs_robot.ogg版权归 Juan Linietsky约 2008 年采用 CC-BY 署名许可协议见 misc/2.5d/README.md 的 Music license 一节使用或再分发时需保留原作者署名。赞分享示例工程【免费下载链接】godot-demo-projectsDemonstration and Template Projects项目地址https://gitcode.com/GitHub_Trending/go/godot-demo-projects点击查看免费下载相关推荐Godot 2.5D 游戏开发实战基于 mono/2.5d 演示项目的 C 插件实现解析Godot 2.5D 游戏开发实战基于 mono/2.5d 演示项目的 C 插件实现解析 2.5D 是经典而实用的视觉表现手法让游戏对象拥有三维的空间逻辑示例工程从3.5到4.0Godot引擎2.5D演示项目迁移实战指南从3.5到4.0Godot引擎2.5D演示项目迁移实战指南 Godot引擎从3.5版本到4.0版本的更新带来了显著的架构变化特别是在2D/3D混合渲染系统和示例工程melonJS 3D 功能初探WebGL 基础与 2.5D 游戏实现melonJS 3D 功能初探WebGL 基础与 2.5D 游戏实现 melonJS 是一个轻量级的 HTML5 游戏引擎专注于 2D 游戏开发。尽管主要定游戏开发图形学上一篇miniblink49 内核测试实战Google Test 官方 10 个 Samples 全解读下一篇anomalib 中 UniNet 模型实战指南基于统一对比学习框架的异常检测创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考