TileMapLayer 与遮挡:人在柜前还是柜后
地面绘制与纵深排序要拆开思考。
01TileSet 与 TileMapLayer
TileSet 是可用图块和相关数据的定义;TileMapLayer 是把它们摆在地图上的一层。新练习采用 Godot 4.7 的 TileMapLayer,不把旧教程的 TileMap 多层接口直接复制过来。可以用一层铺地面,把需要和角色动态排序的物件放到合适的共同节点层级中。
02Y 排序比较的是位置,而不是图片语义
引擎不知道柜子哪里接触地面。需要由节点原点、纹理偏移和排序设置表达;在同一个排序关系中,按纵向位置决定前后。z_index、CanvasLayer、父级结构也影响顺序,不是随意勾选 Y Sort 就能覆盖一切。优先统一脚点,再检查这些层级。
03可复现的遮挡实验
- 建立一个 Node2D 排序父节点,开启 y_sort_enabled。
- 下面放一个占位角色和一个测试高物件,各自根节点位于脚点,Sprite2D 向上偏移显示。
- 保持两者有效 z_index 相同,用上下移动观察前后关系。
- 刻意把物件原点移到图片中心,比较错误表现;再恢复脚点。
- 地面可放到单独 TileMapLayer,避免每一块地面都与角色做无意义的交错。
04碰撞与遮挡不是同一张轮廓
柜子上半部可以挡住角色,但角色只需要被其落地占用区域阻挡。若碰撞覆盖整张高图片,玩家会在远离柜脚的位置撞上一面看不见的墙。把“视觉高度”和“地面占地”分别验证;正式比例之后决定,不从展示小样直接取碰撞尺寸。
05搭一张只有地面、人物和高物件的测试台
先不要在完整房间里排查遮挡。建立一个独立测试场景,只保留地面、占位人物和高物件。地面固定在后方,需要互相穿插的人物和物件放到明确的共同排序关系中。给两者脚点画辅助十字,保持有效 z_index 相同,再让人物从物件上方走到下方。你应该能把前后变化和脚点位置对应起来,而不是只记住某个 Inspector 勾选项。
接着故意把物件原点移到图片中心,观察排序切换位置是否变得不合理,再恢复。这个错误对照很重要:引擎只比较配置出来的位置,不会理解哪里是柜子的底脚。把正确与错误两种位置截在同一张对照图中,比只保存最终正常画面更能帮助以后检查新素材。
06用排除法区分排序设置和图片偏移
如果人物始终压在物件前面,先看两者是否真的属于同一个可比较的排序关系,再看 z_index 与 CanvasLayer 是否把它们分到不同层级。只有这些条件合理,讨论脚点才有意义。若排序确实发生,但发生得太早或太晚,再调整根节点原点、Sprite2D 偏移与资源脚点的对应关系。
不要为了修一个物件,把它的 z_index 不断调大。这样可能让它永远在前面,眼前场景似乎好了,人物走到另一侧却再次出错。也不要同时调整碰撞形状:遮挡错不一定意味着阻挡错。分别记录“画在哪里”“根据哪里排序”“挡住哪片地面”,三个问题各自有答案,才能在更复杂房间中维持可解释的结构。
07高墙和跨格物件要在实际路线中验收
把一个高于单格的练习物件放进测试地图,沿前方、后方和两侧各走一遍。观察人物是否在合理的位置被遮住,是否仍能判断脚下位置,以及碰撞是否只覆盖约定占地。有些遮挡技术上正确,却让玩家完全看不清可通行路线;这时需要回到空间可读性,而不只是调整排序参数。
地图里的地面、前景装饰和可穿插物件不必全用同一种排序方式。先按需要分清职责,再验证具体层级,不要把所有东西都塞进一个 Y Sort 开关下面。验收产出应包含节点树、脚点标注、有效层级设置和人物绕行观察。这里用的是中性练习素材;正式墙高、角色比例、柜子位置与房屋布局仍未定案,测试通过不自动成为正式美术规范。
动手后,再勾选
不是“我看懂了”,而是你在独立练习里做出并检查过。
换一个情景,你会怎么判断?
角色被排序到柜子前后不对,最先检查什么?
用自己的话,留一条笔记
可以写“我之前以为……,现在发现……”,或者记录还没解决的问题。
↗回到资料核对
本课是解释与练习,不替代对应版本的官方手册。网页实验不运行 Godot;未标明实机验证的代码,仍需在独立工程中检查。
标记已读不会自动勾选实作,也不代表游戏功能已经完成。