关于改变graphics透明度的问题

2.2.0依旧没有解决这个问题,请问什么时候解决 @huanxinyin

目前暂不支持透明度修改,请知悉。

遇到什么困难了,2.4都还没支持?!

在改变node透明度的时候可以在update里刷新graphics的strokeColor或者fillColor中的a

@huanxinyin 有排期吗

你只改变颜色是不行的,改变后你还得重新fill或stoke,这两个方法里还会涉及一些计算,频繁的调用对性能有损耗

自己修改下effect,加一个透明属性,自己修改,比修改顶点属性还要好点

都2021年了,还是没有解决

graphics的透明度是由绘制颜色cc.color(255,255,255,0)的最后一个alpha值决定的

那问题来了,怎么渐变呢

渐变alpha值再进行清除重新绘制,实现层面肯定没问题,用tween就可以,性能不懂怎么样

解决了吗?

2022了,还是没有解决

17年的帖子,6年了,我的天

用mask组件然后里面有一个_graphics 属性, 首先要用mask组件来画你的线条,最后更改mask的透明度就可以了

version:3.7
可以使用tween在onUpdate中进行渐变,可以实现,但性能未知,仅供参考。
tween(this.node.getComponent(Graphics)).to(1.0, null, {
easing: ‘smooth’,
onUpdate: (target: Graphics, ratio) => {
let g = target;
g.clear();
g.fillColor = new Color(0, 0, 0, 200 * (1 - ratio));
g.roundRect(0, 0, 100, 100, 5);
g.close();
g.stroke();
g.fill();
}
}).start();


提了个PR改了引擎,graphics已经可以支持透明度,有需要的可以复制自己魔改引擎,或者等等看官方会不会合并。

如果不会改引擎,做一个自定义graphics也是可以的

@ccclass('CustomGraphics')
export class CustomGraphics extends Graphics {
  _render(render) {
    super._render(render);
    if (this.node._uiProps.colorDirty && this.node._uiProps.opacity !== 1) {
      this.updateOpacity();
    }
 }

 updateOpacity() {
   const impl = this.impl;
   if (!impl) {
     return;
   }

   const renderDataList = impl && impl.getRenderDataList();
   if (renderDataList.length <= 0 || !this.model) {
     return;
   }
   const subModelList = this.model.subModels;
   for (let i = 0; i < renderDataList.length; i++) {
     const renderData = renderDataList[i];
     const vb = new Float32Array(renderData.vertexStart * 8);
     for (let j = 0; j < renderData.vertexStart * 8; j++) {
       if (j % 8 === 6) {
         vb[j] = renderData.vData[j] * this.node._uiProps.opacity;
       } else {
         vb[j] = renderData.vData[j];
       }
     }
     subModelList[i].inputAssembler.vertexBuffers[0].update(vb);
   }
  }
}
1赞

3.8了,还是不支持

现在可以支持graphics透明度了吗