
这堆代码写的很乱,到底是做了啥功能。比如1个节点如果有动画在改变uiOpacity,那怎么假设传入的父节点透明度一定是1呢?
看明白了,代码虽然丑点,但稍微修改下也能用了。


大概是啥问题
心累啊,_setByParent这个标记有问题,父节点触发setEntityLocalOpacityDirtyRecursively时,有可能node._uiProps.uiComp都还没初始化好把。
透明度js和原生这块是不是写崩了,感觉就是2套逻辑。原生这边没有层级树遍历得机制,那万一子节点还带动画呢。
这个问题还好,实际上如果你的parent 是个普通的node ,不带render ,比如就是单纯的一个节点 下面有一些sprite ,那么你把parent 的父节点修改透明度,直接无法影响sprite 的透明度,为解决这个bug ,我单独给原生和ts 都额外写了透明度的传递计算
public static multiply (out: Out, a: Out, b: Out): Out {
out.r = a.r * b.r;
out.g = a.g * b.g;
out.b = a.b * b.b;
out.a = a.a * b.a;
return out;
}
Color得乘法不能这样写。
不是这个问题
应该是恢复本身的透明的 然后颜色设置为脏区域,渲染帧的时候在计算实际的透明的,不然每次修改透明的都要从根节点计算到叶子节点,这里逻辑帧修改某个节点的透明度只是把这个节点设置为脏区域和遍历改节点的子节点都标记为脏并让自己的透明度只受自己的属性影响,渲染帧的时候只需要把父节点运算的透明的和自己的计算一下在把脏标记去掉就好了,我是这么理解的

实际上 是不是原生 都有这个bug,原生部分c++ 那边把parent 的透明度作为参数传递下来了,实际上也是不对的,ts这边 没有render的情况透明度也就被自动跳过向下传递的