一、Visibility和Layer
1.参考设置节点的可见性
引擎采用更加通用的节点,和相机相匹配。当节点设置的Layer属性包含在相机的 Visibility 属性 中时,节点便可以被相机看见,同时支持 3D 组件与 2D 组件的混合渲染。以便更灵活地控制节点组件的可见性,使分组显示多样化。
节点的 Layer 属性是全局且唯一的,但是不同的节点可以设置相同的 Layer 属性,使其被同一个相机所观察。开发者可以使用引擎内置的 Layer 属性,也可以使用自定义的 Layer 属性,点击下图中的 Edit 按钮即可前往 项目设置 -> Layers 页面进行设置。详情请参考 层级 文档。
2.参考层级
节点的 Layer 属性是一个无符号 32 位的整数,最多支持 32 个不同类型的 Layer,可在编辑器上方菜单栏的 项目 -> 项目设置 -> Layers 中设置。其中开发者可自定义第 0 ~ 19 个 Layer,剩下后面的 12 个 Layers 则是引擎内置的。
相机的 Visibility 属性跟节点的 Layer 属性,都是用来控制其可见性的。但只有当节点设置的 Layer 属性包含在相机的 Visibility 中时,节点才可以被相机看见。相机的 Visibility 属性采用 |
和 &
这种位操作符来判断节点的 Layer 是否应该被观察到,且支持同时选择多个 Layer。具体内容可参考 Camera — Visibility 属性。
3.参考相机分组渲染
分组渲染功能是通过相机组件的 Visibility 属性配合节点的 Layer 属性 共同决定的。用户可通过代码设置 Visibility 的值来完成分组渲染。所有节点默认都属于 DEFAULT 层,在所有相机都可见。
4.参考设置 Visibility 属性
Visibility 属性用于设置哪些层级(Layer)的节点应该被相机观察到,可同时选择多个 Layer。
注意:从 Cocos Creator 3.0 开始,2D 元素(例如 Sprite)的渲染也遵从 Layer 与 Visibility 的判断,开发者可以根据需要自行调整 Layer 与 Visibility。
当开发者在 Visibility 属性中勾选了多个 Layer 时,Visibility 属性值便是通过将多个 Layer 的属性值执行 |
操作计算得出。
例如,下图中相机的 Visibility 属性同时勾选了 UI_3D 和 DEFAULT 这两个 Layer,通过 查询 Layer 属性值 可以知道 UI_3D 的属性值是 1 << 23,DEFAULT 的属性值是 1 << 30,那么 Visibility 属性值便是 1 << 23 | 1 << 30 = 1820327937。
Visibility 属性可以同时选择多个 Layer,同时 Node 上的 Layer 也有自身的值,因此相机的 Visibility 属性是一个 2^32 位的整数,每一种可见的 layer 占一位,采用位操作运算,最高支持 32 个不同的 Layer 标签(每一种 Layer 值占一位,即用 2^32 表示)。在相机 culling 时,每个节点的 layer 值会跟相机进行 & 操作运算,如果相机的 Visibility 属性包含这个 Layer,那么当前节点就会被相机所看见,反之则看不见。
二、代码设置Layer
1.creator3.0 怎么通过代码动态修改节点图层,节点的layer是number类型,我怎么知道哪个值代表什么图层
比如你要设置 A 节点的 layer 为 Layers 设置里的第一个。那么参考代码就是:
this.node.layer = (1 << 0);
如果不是自定义layer,可以这样:
node.layer = Layers.Enum.UI_2D;
2.creator3.0 原先默认分组default失效?
在编辑器中修改 layer 会自动提示是否要同步所有子节点。如果在代码中可以使用 node.walk
node.walk((child)=>{
child.layer = ...;
})