参考:
这是别人的解决方案。这里自己动手试试,记录一下。

组件代码ColorAssembler2D.js:
cc.Class({
extends: cc.Component,
properties: {
colors: [cc.Color]
},
onLoad() {
},
onEnable() {
cc.director.once(cc.Director.EVENT_AFTER_DRAW, this._updateColors, this);
},
onDisable() {
cc.director.off(cc.Director.EVENT_AFTER_DRAW, this._updateColors, this);
this.node['_renderFlag'] |= cc['RenderFlow'].FLAG_COLOR;
},
_updateColors() {
const cmp = this.getComponent(cc.RenderComponent);
if (!cmp) return;
const _assembler = cmp['_assembler'];
if (!(_assembler instanceof cc['Assembler2D'])) return;
const uintVerts = _assembler._renderData.uintVDatas[0];
if (!uintVerts) return;
const color = this.node.color;
const floatsPerVert = _assembler.floatsPerVert;
const colorOffset = _assembler.colorOffset;
let count = 0;
for (let i = colorOffset, l = uintVerts.length; i < l; i += floatsPerVert) {
uintVerts[i] = (this.colors[count++] || color)['_val'];
}
},
});
将组件ColorAssembler2D.js绑定到字体或图片上,设置4种颜色

4种颜色对应四个角

运行项目,彩色字体生效

用在图片上同理,下图是原图和使用彩色渐变后效果

例如有个需求,就是普通装备字体是普通颜色,而高级装备是彩色字体。
普通装备时字体淡黑色显示
label.node.getComponent("ColorAssembler2D").onDisable();
label.node.color = new cc.Color().fromHEX("#eeeeee");
label.string = "普通装备"
高级装备彩色显示(要把颜色变成白色)
label.node.color = new cc.Color().fromHEX("#ffffff");
label.node.getComponent("ColorAssembler2D").onEnable();
label.string = "高级装备"
浙公网安备 33010602011771号