Godot的Canvas layers教程从CanvasItem开始。普通二维节点Node2D与界面节点Control都继承它,CanvasItem可以按树组织,孩子继承父项的变换;父项移动,孩子也随之移动。这些节点直接或间接属于负责显示它们的Viewport。教程接着把Camera2D联系到Viewport的canvas_transform:视口中整个画布层级可以经历同一套变换,而不是每个显示元素天然保留自己的屏幕位置。[1]

界面叠加便是文档用来解释独立层的例子。生命计数、分数或其他界面元素,希望在游戏世界视野变化时仍保持屏幕位置。CanvasLayer为自己的孩子和后代增加一层独立的二维绘制层,并有自己的变换,不依赖其他层的变换。这里的独立性具体落在变换参照上:游戏世界视野可以改变,另一层的显示仍按它自己的关系存在;不是说所有二维节点从此都不再继承父项变换。[1]

绘制前后由层号另行规定。默认二维场景使用零层,层号较大的绘在较小的上方。CanvasLayer类说明进一步指出,这个跨层顺序不受各层内CanvasItem的z_index影响。因此,层号和层内节点的z_index不是同一个排序位置;后者并不能越过前者,重新决定两层之间谁盖在谁上面。教程所说CanvasLayer不依赖树中先后顺序,正是在这套跨层关系里说明的。[1][2]

层号相等时又存在明确例外。类文档说,多个CanvasLayer具有同一layer index时,一层的孩子会绘在另一层孩子之后,但哪一层在前并不确定。这句话没有补给它们一个可由创建先后或树位置推出的固定次序。较大层号在前是不同层号之间的规则,同号层前后不确定则界定了这条数值比较不能继续回答的情形。[2]

每一层还归属于一个特定视口。CanvasLayer类明确说,它不能在多个Viewport之间共享;custom_viewport为空时,使用默认视口。因而,资料里出现两个视口时,不能把一个CanvasLayer的独立变换直接理解成它同时在所有视口里显示。变换可以相对其他层独立,显示对象仍然有其所属视口,两项条件在原定义中同时保留。[2]

follow_viewport_enabled则区分位置所依的空间。类文档定义,启用时CanvasLayer保持其在世界空间的位置,未启用时保持固定屏幕位置。这与layer属性决定谁绘在前面不同:一个说明位置怎样随所述参照表达,一个说明层之间的遮盖次序。方法说明中的get_final_transform又把本层坐标系到Viewport坐标系的变换单独命名,连接的是两个坐标范围,而不是又增加一项排序号码。[2]

可见性也被单独写成属性:visible为false时,该CanvasLayer之下的CanvasItem会隐藏。原文随即限定,CanvasLayer的可见性不像CanvasItem.visible那样向underlying layers传播。采用这段说明时,应保留它对本层CanvasItem和其他层传播的区别,不能把隐藏某层直接扩成所有下层都隐藏,或反过来写成本层孩子也不受影响。[2]

Canvas layers教程的末尾还提醒,CanvasLayer并非控制普通节点绘制顺序所必需的唯一方式。场景面板中的节点相对位置仍有绘制作用,二维节点还具有CanvasItem.z_index。于是,普通节点的相对次序、层内z_index与CanvasLayer跨层层号,是资料里同时存在的几种关系;不能因介绍了独立层,就删除文档保留的其他顺序机制。[1]

本文采用官方仓库master文字,不标作4.5或stable发行说明;未设置节点、运行场景或观察示意图,不给画质、性能与兼容保证。两页首次日期未知。

信息来源

本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。