设置节点的layer无效

  • Creator 版本: 3.6.1

  • 目标平台:Chrome浏览器

  • 重现方式:
    项目中有两个相机A,B。其中A相机的Visibility是default,B相机的Visibility是 1 << 10

    父节点node在编辑器中将layer设置为 1 << 10,然后加载一个prefab,通过instantiate将prefab实例化一个节点child_node,将child_node的layer设置为 1 << 10 之后添加在节点 node 上。发现child_node这个节点依然在A相机里面显示了。

    如果在编辑器里面拖一个prefab预制到父节点,然后将其layer设置为 1 << 10,这个时候可以在B相机里面显示。

整体给我的感觉是使用代码设置一个节点的layer,layer值是变了,但是渲染没变。

        tileNode.layer = 1 << 10;
        this.node.addChild(tileNode);
        this.tileNodes.push(tileNode);
  • 重现概率: 必现

demo.zip (68.0 KB)

你要改渲染节点啊。。mesh都挂在子节点,只改父节点是不会历遍子节点的,需要自己手动改(需要这么设计)


大佬,请问为啥要写成layer=1<<10呢?直接写数字不是更方便吗?

为了可读性

我还是get不到点子上,能否详细讲一讲?

你想想,你想存储多个开关标志,怎么存储
最low的当然是用数组,这个在序列化的时候会在解析json的环节有性能问题,包体也很大
次low的方式是用字符串“0101010101”,优点和数组一样,都是可读可手改,缺点是包体大
业内习惯性的做法是什么呢,是二进制位来存储,也就是1 << 1,1 << 2,1 << 3,好处嘛就是运算快,包体小

那比如操作第二个标志
设置的时候应当是num |= (1<<2)
判断的时候应当是if(num & 1 << 2)
取消标记的时候应当是num &= ~(1<<2)

那你发现没有,这些写法里,重要的是什么,是2,也就是第2个二进制位,阅读代码的时候一眼就看出来操作的是哪个标志,你直接写数字的话不就失去了可读性么


引擎文档里有介绍 ,节点的 Layer 属性是一个无符号 32 位的整数,最多支持 32 个不同类型的 Layer,其中开发者可自定义第 0 ~ 19 个 Layer,剩下后面的 12 个 Layers 则是引擎内置的。

那回到实践,楼主写1 << 10就可以清楚的知道设置的是第10个摄像机


小菜鸡瞎写,有错的可别较真哈

2赞

明白了,原来是这样的操作,讲的很清楚,感谢讲解,膜拜大佬!