You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
3.5 KiB
101 lines
3.5 KiB
import { _decorator, Button, Component, Label, Node, sp, Sprite,Animation, RichText, ProgressBar } from "cc";
|
|
|
|
/**自动绑定所需字段 */
|
|
enum attributeType {
|
|
Node = 'm_',
|
|
Node2 = 'n_',
|
|
Label = 'lab_',
|
|
RichText = 'ric_',
|
|
Button = 'btn_',
|
|
Sprite = 'spr_',
|
|
Spine = 'spi_',
|
|
Animation = 'ani_',
|
|
ProgressBar = 'pro_'
|
|
}
|
|
|
|
/**数据类型 */
|
|
interface attributeInfo{
|
|
mKey:attributeType,
|
|
mtype:string,
|
|
mtype2:any,
|
|
}
|
|
|
|
const UIParseConfig : Record<attributeType, attributeInfo> = {
|
|
[attributeType.Node]: { mKey: attributeType.Node, mtype: "Node", mtype2: Node },
|
|
[attributeType.Node2]: { mKey: attributeType.Node2, mtype: "Node", mtype2: Node },
|
|
[attributeType.Label]: { mKey: attributeType.Label, mtype: "Label", mtype2: Label },
|
|
[attributeType.Button]: { mKey: attributeType.Button, mtype: "Button", mtype2: Button },
|
|
[attributeType.Sprite]: { mKey: attributeType.Sprite, mtype: "Sprite", mtype2: Sprite },
|
|
[attributeType.Spine]: { mKey: attributeType.Spine, mtype: "sp.Skeleton", mtype2: sp.Skeleton },
|
|
[attributeType.RichText]: { mKey: attributeType.RichText, mtype: "RichText", mtype2: RichText },
|
|
[attributeType.Animation]: { mKey: attributeType.Animation, mtype: "Animation", mtype2: Animation },
|
|
[attributeType.ProgressBar]: { mKey: attributeType.ProgressBar, mtype: "ProgressBar", mtype2: ProgressBar },
|
|
|
|
}
|
|
|
|
export class UIParseTools{
|
|
|
|
private static tempNodeType: attributeType[] = [attributeType.Node, attributeType.Node2];
|
|
|
|
static CheckNode(tNode: Node): string {
|
|
for (const key in UIParseConfig) {
|
|
const Info = UIParseConfig[key] as attributeInfo;
|
|
if (this.ParseNode(tNode, Info)) {
|
|
return this.getStr(tNode, Info);
|
|
}
|
|
}
|
|
return ``;
|
|
}
|
|
|
|
static AutoBindNode(tNode:Node,Target:any){
|
|
for (const key in UIParseConfig) {
|
|
const Info = UIParseConfig[key] as attributeInfo;
|
|
if (tNode.name[0] == Info.mKey[0] && tNode.name.includes(Info.mKey)) {
|
|
if (this.tempNodeType.includes(Info.mKey)) {
|
|
Target[tNode.name] = tNode;
|
|
} else {
|
|
Target[tNode.name] = tNode.getComponent(Info.mtype2);
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**获取字符串 */
|
|
private static getStr(tNode: Node, Info: attributeInfo) {
|
|
return `
|
|
@property(${Info.mtype})
|
|
${tNode.name}: ${Info.mtype} = null;`;
|
|
}
|
|
|
|
/**添加按钮组件 */
|
|
private static addBtnCommont(TargetNode: Node, Type: any) {
|
|
let tClass = TargetNode.getComponent(Type);
|
|
if (tClass) { return true; }
|
|
tClass = TargetNode.addComponent(Type);
|
|
if (!tClass) {
|
|
return false;
|
|
}
|
|
|
|
switch (Type) {
|
|
case Button:
|
|
{
|
|
let btn = tClass as Button;
|
|
btn.transition = Button.Transition.SCALE
|
|
btn.zoomScale = 0.9;
|
|
}
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private static ParseNode(TargetNode: Node, Info: attributeInfo): boolean {
|
|
if (TargetNode.name.includes(` `)) { return false; }
|
|
if (TargetNode.name == `label`) { return false; }
|
|
const tidx = TargetNode.name.indexOf(Info.mKey);
|
|
if (Info.mKey == attributeType.Node || Info.mKey == attributeType.Node2) {
|
|
return tidx == 0;
|
|
}
|
|
return tidx == 0 && this.addBtnCommont(TargetNode, Info.mtype2);
|
|
}
|
|
}
|
|
|