Godot 中 zindex 和 ysort 的区别总结

2026-06-25
18547 分钟
...

在 Godot 2D 游戏开发中,角色、树木、怪物、地面、技能特效、UI 都需要正确的显示顺序。比如角色走到树前面时,角色应该挡住树;角色走到树后面时,树又应该挡住角色。

这种显示顺序主要和两个概念有关:z_indexy_sort

其中 z_index 用来手动控制图层顺序,y_sort 用来根据物体的 Y 坐标自动排序。

一句话理解

z_index 是手动分层。

y_sort 是根据 Y 坐标自动排序。

简单来说:

属性作用适合场景
z_index数值越大,显示越靠前地面、特效、UI、固定层级
y_sortY 坐标越大,显示越靠前玩家、怪物、树、石头、NPC

什么是 z_index

z_index 可以理解为图层编号。

数值越大,节点越显示在前面;数值越小,节点越显示在后面。

例如:

ground.z_index = 0
tree.z_index = 10
player.z_index = 20
ui.z_index = 100

这样显示顺序就是:

UI > Player > Tree > Ground

z_index 的优点是简单、直接、稳定。

它适合处理固定层级关系,比如:

对象推荐层级
背景-10
地面0
地面装饰1
角色、怪物、场景物体10
技能特效20
伤害数字50
UI100+

但是 z_index 不适合处理“角色在树前还是树后”这种动态遮挡关系。

因为角色的位置会变化。如果只靠 z_index,角色要么永远压在树上面,要么永远被树挡住,不会根据站位自然变化。

什么是 y_sort

y_sort 是根据节点的 Y 坐标自动决定显示顺序。

在俯视角 2D 游戏里,屏幕越靠下的物体,通常越接近玩家视角,所以应该显示在更前面。

例如:

树的 y = 200
角色的 y = 260

角色更靠下,所以角色显示在树前面。

再比如:

树的 y = 200
角色的 y = 150

角色更靠上,所以树显示在角色前面。

这正好符合俯视角 RPG、幸存者游戏、模拟经营游戏里的遮挡逻辑。

z_indexy_sort 的核心区别

z_index 负责大层级。

y_sort 负责同一层级内部的前后关系。

可以这样理解:

z_index先决定你在哪一层
y_sort再决定同一层里谁挡住谁

比如一个 2D 幸存者游戏可以这样设计:

地面z_index = 0
石头玩家怪物z_index = 10并开启 y_sort
技能特效z_index = 20
UIz_index = 100

这样玩家、怪物、树、石头之间会根据 Y 坐标自动遮挡,而技能特效和 UI 仍然保持固定层级。

推荐节点结构

对于 2D 俯视角游戏,可以使用类似这样的结构:

World
  BackgroundLayer
  GroundLayer
  GroundDecorLayer
  SortLayer
    Player
    Enemies
    Trees
    Rocks
    Chests
  SkillEffectLayer
  DamageTextLayer
CanvasLayer
  UI

其中:

BackgroundLayer背景层
GroundLayer地面层
GroundDecorLayer地面装饰层
SortLayer需要互相遮挡的物体层
SkillEffectLayer技能特效层
DamageTextLayer伤害数字层
CanvasLayer / UI界面层

SortLayer 需要开启 Y Sort Enabled

玩家、怪物、树木、石头、箱子、NPC 这类需要根据站位互相遮挡的对象,都放到 SortLayer 里面。

什么东西适合使用 y_sort

适合使用 y_sort 的对象,一般是世界里的实体物体。

比如:

对象是否适合
玩家适合
怪物适合
NPC适合
树木适合
石头适合
箱子适合
建筑门口的装饰适合

这些对象都可能出现“有时挡住玩家,有时被玩家挡住”的情况。

什么东西不适合使用 y_sort

不适合使用 y_sort 的对象,一般是固定显示层级的内容。

比如:

对象原因
地面永远在最下面
背景远景永远在后面
UI不属于游戏世界排序
全屏雾效通常需要单独控制层级
伤害数字通常应该稳定显示在角色上方
大范围技能特效通常需要固定显示在地面或角色上方

这些内容更适合用 z_indexCanvasLayer 控制。

常见问题

1. 开了 y_sort 但没有效果

通常是因为父节点没有开启 Y Sort Enabled

y_sort 一般不是单独给某个角色设置就结束了,而是要在它们共同的父节点上开启排序。

例如:

SortLayer  开启 Y Sort Enabled
  Player
  Tree
  Enemy
  Rock

这样这些子节点才会参与 Y 排序。

2. 角色还是一直压在树上面

可能是因为它们的 z_index 不一样。

需要互相 Y 排序的对象,最好放在同一个 z_index

例如:

player.z_index = 10
tree.z_index = 10
enemy.z_index = 10

如果玩家是 z_index = 20,树是 z_index = 10,那么玩家会一直显示在树前面,y_sort 就很难达到预期效果。

3. 遮挡位置不自然

可能是节点原点不对。

y_sort 是根据节点的 Y 坐标排序的,所以节点原点最好放在“脚底”或“底部接地点”。

角色的原点应该在脚底。

树的原点应该在树根。

石头、箱子的原点应该在底部中心。

如果原点在图片中心,可能会出现角色明明站在树后面,却显示在树前面的情况。

TileMap 中的 Y Sort Origin

如果使用 TileMapLayer,还会看到 Y Sort Origin

它的作用是调整 tile 参与 Y 排序时使用的位置。

比如一棵树的 tile 很高,但真正应该参与排序的是树根位置,而不是树冠位置。这个时候就可以通过 Y Sort Origin 调整排序参考点。

简单理解:

Y Sort Enabled是否启用 Y 排序
Y Sort Origin用哪个垂直位置参与排序

实际使用建议

对于 2D 俯视角游戏,推荐这样做:

1. z_index 分大层
2. y_sort 处理同一层里的动态遮挡
3. 需要互相遮挡的对象放到同一个 SortLayer
4. 这些对象保持相同 z_index
5. 节点原点放在脚底或底部中心

示例层级:

BackgroundLayer      z_index = -10
GroundLayer          z_index = 0
GroundDecorLayer     z_index = 1
SortLayer            z_index = 10开启 Y Sort Enabled
SkillEffectLayer     z_index = 20
DamageTextLayer      z_index = 50
UI                   CanvasLayer

总结

z_indexy_sort 不是互相替代的关系,而是配合使用的关系。

z_index 解决固定层级问题。

y_sort 解决动态遮挡问题。

在俯视角 2D 游戏里,最推荐的做法是:

先用 z_index 分层再用 y_sort 排同层物体

这样可以让地面、角色、树木、怪物、技能、UI 都保持清晰的显示关系,也能避免角色穿到树冠上、怪物压住 UI、技能特效被地面挡住等问题。

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
godot2026-07-27
Godot 4 常用 UI 节点详解
Godot 4 常用 UI 节点详解 在 Godot 4 中,UI 系统基于 Control(控件) 节点构建。所有 UI 节点都继承自 Control,形成一棵完整的 UI 树。与游戏引擎中常见的"Canvas + DOM"模式不同,Godot 的 UI 系统是声明式的——你在场景中搭好节点树,引擎自动完成布局计算。 一、布局系统:Container 家族 Container 是 Godot UI 的 骨架 。它决定了子节点的大小和位...
学习
godot2026-07-09
Godot 4 自动地形系统(AutoTileSet / Terrains)完全指南
前言 在 2D 游戏开发中,地形瓦片(tile)的拼接是一个绕不开的问题。想象一下:你有一片草地、一条河流、一段平台——如果每一块边缘、角落、过渡区域都要手动选择对应的瓦片图,工作量将是巨大的。 自动地形系统 就是为了解决这个问题而生的。 一、什么是自动地形(Autotiling)? 自动地形的核心思想很简单: 你只管画,引擎帮你选对瓦片 。 当你在 TileMap 上绘制地形时,引擎会自动检测每个瓦片的上下左右邻居,然后根据预设的规则...
学习
godot2026-06-11
Tileset 资源图的标准和规范
一、什么是 Tileset 资源图 Tileset,中文通常叫“图块资源图”或“瓦片图”,是 2D 游戏中非常常见的一种地图资源组织方式。 简单来说,Tileset 就是把很多小图块按照固定尺寸排列在一张图片里。游戏引擎会按照固定的格子大小去切割这张图片,然后把每个小格子当成一个独立的地图块使用。 比如一个 32×32 像素的 Tileset 中,每一个 tile 都是 32×32 像素。地图编辑器或游戏引擎会按照 32×32 的网格,...
学习
godot2026-05-29
用户角色精灵图制作角色的完整流程
在 2D RPG 游戏里,角色通常不是用一张单独图片完成的,而是用一张“角色精灵图”来做。 所谓角色精灵图,通常是一张包含多个动作帧的大图。比如角色向下走有 4 帧,向左走有 4 帧,向右走有 4 帧,向上走有 4 帧。Godot 会根据这些帧不断切换图片,看起来角色就动起来了。 这篇文章主要介绍:拿到一张角色精灵图之后,如何在 Godot 中把它做成一个可以正常移动、播放动画、和地图产生遮挡关系的角色。 一、先理解角色精灵图是什么 角...
学习
godot2026-05-26
Godot 节点系统详细介绍
Godot 里最核心的东西不是“类”,也不是“组件”,而是 节点 Node 。 你可以把 Godot 的节点理解成: 在前端里,一个页面是由很多 DOM 元素组成的; 在 Godot 里,一个游戏场景是由很多 Node 节点组成的。 比如一个玩家角色,可能不是一个单独对象,而是这样的结构: 这里的 是根节点,下面挂着显示图片、播放动画、碰撞检测、摄像机、音效等子节点。 Godot 官方文档也把节点和场景放在一起讲:多个节点组成树状结构后...
学习
godot2026-05-19
第一部分 01:Godot 基础世界观
先建立一个总认知: Godot 做游戏的核心思路是:用一个个 Node 组成 Scene,再把 Scene 放进 SceneTree 运行。代码 Script 负责控制 Node,Resource 负责存数据,Signal 负责对象之间通信。 你可以先把 Godot 想成一个“可视化的前端工程”: | Godot | 前端类比 | 说明 | | | | | | Project | 一个前端项目仓库 | 整个游戏工程 | | Scene...
学习

评论

请登录后发表评论

去登录
加载评论中...

目录