| name | cocos-dynamic-ui-layer-color-font |
| description | Use when dynamic UI nodes in Cocos Creator appear as gray/blue boxes. |
Cocos Creator 3.x Dynamic UI 修復三部曲
症狀
用 new Node() 動態生成嘅 UI 節點顯示為暗黑剪影、文字極暗黑灰(只有 Emoji 有顏色),或純粹睇唔到字。
根因三部曲(必須做齊)
第一步:Layer — 強制設定 UI_2D
Cocos Creator 3.x 所有 new Node() 預設 layer 係 DEFAULT(3D 層),被 3D Camera 渲染,失去 UI 2D 專屬材質與混色。
import { Layers } from 'cc';
let node = new Node('MyUINode');
node.layer = Layers.Enum.UI_2D;
第二步:Color — 必須用 new Color(r, g, b, 255),唔可以用 Hex string
Cocos Creator 3.x 嘅 Label.color 同 Sprite.color 唔可以直接接受 Hex string('#FFFFFF')或者 ThemeManager 嘅 hex constant。
import { Color, Label } from 'cc';
let label = node.getComponent(Label) || node.addComponent(Label);
label.color = new Color(255, 255, 255, 255);
label.color = new Color(255, 215, 0, 255);
label.color = '#FFFFFF';
label.color = TEXT_DEEP_INK;
label.color = someHexString;
注意: Color.fromHEX() 喺某啲 Cocos 版本可能都有 bug,最穩陣係直接用 new Color(r, g, b, 255)。
第三步:useSystemFont — 確保 Label 有字體
純 code 生成嘅 Label 如果冇 set useSystemFont = true,可能會因為搵唔到 Font Asset 而唔渲染。
let label = node.getComponent(Label) || node.addComponent(Label);
label.useSystemFont = true;
label.string = "要顯示嘅文字";
label.color = new Color(255, 255, 255, 255);
完整範例
import { Node, Label, Color, Layers, UITransform, Size } from 'cc';
function createUILabel(parent: Node, text: string): Node {
let node = new Node('Label');
node.layer = Layers.Enum.UI_2D;
let label = node.addComponent(Label);
label.useSystemFont = true;
label.string = text;
label.color = new Color(255, 255, 255, 255);
let transform = node.addComponent(UITransform);
transform.contentSize = new Size(200, 40);
parent.addChild(node);
return node;
}
排查 checklist(由最高機率排列)
- 所有
new Node() 嘅 UI 節點有冇 layer = Layers.Enum.UI_2D?
- 所有
label.color = xxx 係用 new Color(r, g, b, 255) 定係 hex string?
- 所有 Label 有冇
useSystemFont = true?
- 如果用咗
Color.fromHEX(),有冇換做 new Color() 試過?
- Scene 嘅 Canvas node 嘅 Layer 係唔係
UI_2D?
關聯檔案(BuddhaHeart_Game 項目)
assets/scripts/control/GameBootstrapper.ts — 主入口 UI
assets/scripts/control/CollectivePracticeHallUI.ts — 共修大廳(第一個出現嘅 UI)
assets/scripts/control/*.ts — 其他 UI 檔案都需要 check
assets/scripts/core/StoryEngineUI.ts — 禪修室 UI