最近老是遇到在Cocos Creator 3.x版本的节点显示问题。
- 我明明添加了节点,也挂载了精灵Sprite,但是为什么在web预览没办法显示呢?
- 我明明动态创建了预制体界面,也挂载到父节点上了,日志log打印出来了,为什么不显示呢?
同样的设置,我在Cocos Creator 2.4.x版本上,显示是正常的?这一切是why 为什么呢?
Reason:
Cocos Creator 3.x 版本,默认在层级管理器上,添加Node节点的层级 layer 是DEFAULT的。 默认的场景下,是只包含一个 Main Camera 主摄像机(因为不在Canvas下,这边默认是设置为了3D摄像机) 和 一个 Main Light 主光源。主摄像机 Main Camera的可见性掩码 visibility 默认勾选 可见 UI_3D & IGNORE_RAYCAST & DEFAULT。因为没有勾选UI_2D,所以如果设置层级为UI_2D的 节点,不会被该摄像机渲染(即不可见)。 如果添加的是UI节点或者渲染节点,则默认创建Canvas画布,并动态添加UI的摄像机,后添加UI节点挂载到Canvas下。此时UI节点的layer是UI_2D,动态添加的UI摄像机的 可见性掩码 visibility 默认勾选 可见 UI_2D & UI_3D。 想必看到这里,也知道上面的原因了。
- 如果需要正常显示,那么需要在Canvas下挂载UI组件或者渲染组件的节点,而且需要设置节点的layer为UI_2D。因为Canvas下的摄像机的可见性掩码默认值开启了UI_2D 和 UI_3D,导致除了UI_2D 和 UI_3D以外的层级节点,被该2D摄像机渲染剔除了。如果需要自定义节点的layer 比如wall,想要在2D摄像机上渲染 层级为wall的节点,那么你需要在2D摄像机的 可见性掩码 visibility 勾选 wall。
- 动态加载的预制体,为什么看不见了?是因为动态加载的预制体或者动态创建的节点 new Node(),默认的layer是DEFAULT导致的。需要手动代码设置 node.layer = Layers.Enum.UI_2D,因为默认的2D摄像机的可见范围是 UI_2D 和 UI_3D,如果你修改了可见性掩码,那就需要做对应的修改了。
- 那Cocos Creator2.4.x为什么没有这个问题?因为默认创建的节点是default,相机camera默认是勾选了 default。因为Cocos Creator 3.x 整合了2D 和3D ,为了让用户更加容易区分2D和3D,且更加合理的管理节点层级(是为了做渲染剔除),所以做了不同的层级layer默认导致的。
|