LabelColor.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { GameEvent } from "../data/const/EventConst";
  2. import EventMng from "../manager/EventMng";
  3. // 已知问题:当修改此节点的透明度和颜色时,渐变会失去效果
  4. const { ccclass, property, requireComponent, menu, executeInEditMode } = cc._decorator;
  5. @ccclass
  6. // 测试了一下,发现使用executeInEditMode后使得引擎每次刷新都会走,考虑到绑定的元素过多,这里关掉了
  7. @executeInEditMode
  8. @requireComponent(cc.RenderComponent)
  9. @menu('Label/LabelColor')
  10. export default class ColorAssembler2D extends cc.Component {
  11. @property
  12. private _colors: cc.Color[] = []; // 支持配置4个颜色,顺序是:左下,右下,右上,左上
  13. @property({ type: [cc.Color] })
  14. public get colors() {
  15. return this._colors;
  16. }
  17. public set colors(colors) {
  18. this._colors = colors;
  19. this._updateColors();
  20. }
  21. onEnable() {
  22. cc.director.once(cc.Director.EVENT_AFTER_DRAW, this._updateColors, this);
  23. EventMng.on(GameEvent.ON_REFRESH_COLOR, this._updateColors, this);
  24. }
  25. onDisable() {
  26. cc.director.off(cc.Director.EVENT_AFTER_DRAW, this._updateColors, this);
  27. EventMng.off(GameEvent.ON_REFRESH_COLOR, this._updateColors, this);
  28. this.node['_renderFlag'] |= cc['RenderFlow'].FLAG_COLOR;
  29. //
  30. }
  31. private _updateColors() {
  32. if (CC_EDITOR) {
  33. Editor.log('Label.Color')
  34. }
  35. const cmp = this.getComponent(cc.RenderComponent);
  36. if (!cmp) return;
  37. const _assembler = cmp['_assembler'];
  38. if (!(_assembler instanceof cc['Assembler2D'])) return;
  39. const uintVerts = _assembler._renderData.uintVDatas[0]; // 颜色数组
  40. if (!uintVerts) return;
  41. const color = this.node.color;
  42. const floatsPerVert = _assembler.floatsPerVert;
  43. const colorOffset = _assembler.colorOffset;
  44. let count = 0;
  45. // console.log(`长度uintVerts.length:${uintVerts.length}, floatsPerVert:${floatsPerVert}`)
  46. for (let i = colorOffset, l = uintVerts.length; i < l; i += floatsPerVert) {
  47. uintVerts[i] = (this.colors[count++] || color)['_val'];
  48. }
  49. }
  50. }