修复发送纯数据导致的异常问题

This commit is contained in:
xu_yanfeng 2024-12-16 10:10:05 +08:00
parent 945ea9060f
commit 91e7f271f6
3 changed files with 208 additions and 42 deletions

View File

@ -1,33 +1,9 @@
// eval 注入脚本的代码,变量尽量使用var,后来发现在import之后,let会自动变为var
import { uniq } from "lodash";
import { Msg, Page, PluginEvent } from "../../core/types";
import {
ArrayData,
BoolData,
ColorData,
DataType,
EngineData,
Group,
ImageData,
Info,
InvalidData,
NodeInfoData,
NumberData,
ObjectData,
ObjectItemRequestData,
Property,
StringData,
TreeData,
Vec2Data,
Vec3Data,
} from "../../views/devtools/data";
import { ArrayData, BoolData, ColorData, DataType, EngineData, Group, ImageData, Info, InvalidData, NodeInfoData, NumberData, ObjectData, ObjectItemRequestData, Property, StringData, TreeData, Vec2Data, Vec3Data } from "../../views/devtools/data";
import { getValue, trySetValueWithConfig } from "./setValue";
import {
BuildArrayOptions,
BuildImageOptions,
BuildObjectOptions,
BuildVecOptions,
} from "./types";
import { BuildArrayOptions, BuildImageOptions, BuildObjectOptions, BuildVecOptions } from "./types";
import { isHasProperty } from "./util";
declare const cc: any;
@ -646,10 +622,7 @@ class CCInspector {
let compGroup = this._getGroupData(itemComp);
groupData.push(compGroup);
}
const data: NodeInfoData = {
uuid: uuid,
group: groupData,
};
const data: NodeInfoData = new NodeInfoData(uuid, groupData);
this.sendMsgToContent(Msg.NodeInfo, data);
} else {
// 未获取到节点数据

View File

@ -24,8 +24,8 @@ export class Info {
public data: any;
public readonly: boolean = false;
public path: Array<string> = [];// 属性对应的路径
constructor() {
this.id = v4();
constructor(id: string = "") {
this.id = id || v4();
}
public isEnum(): boolean { return false; }
public isVec2(): boolean { return false; }
@ -45,11 +45,16 @@ export class Info {
}
export class TextData extends Info {
public data: string = "";
constructor(data: string = "") {
super();
this.type = DataType.Text;
this.data = data;
}
parse(data: TextData) {
this.data = data.data;
return this;
}
public isText(): boolean { return true; }
}
@ -78,6 +83,13 @@ export class EngineData extends Info {
super();
this.type = DataType.Engine;
}
parse(data: EngineData) {
this.id = data.id;
this.engineType = data.engineType;
this.engineUUID = data.engineUUID;
this.engineName = data.engineName;
return this;
}
init(name: string, type: string, uuid: string) {
this.engineName = name;
this.engineType = type;
@ -94,7 +106,15 @@ export class ArrayData extends Info {
super();
this.type = DataType.Array;
}
parse(data: ArrayData) {
this.id = data.id;
for (let i = 0; i < data.data.length; i++) {
const item = data.data[i];
const property = new Property(item.name, item.value).parse(item);
this.data.push(property);
}
return this;
}
add(info: Property) {
this.data.push(info);
return this;
@ -130,6 +150,11 @@ export class ObjectData extends Info {
super();
this.type = DataType.Object;
}
parse(data: ObjectData) {
this.id = data.id;
this.data = data.data;
return this;
}
test() {
this.data = JSON.stringify({ fack: 'test' });
@ -165,38 +190,62 @@ export class InvalidData extends Info {
}
export class ColorData extends Info {
constructor(color: string) {
public data: string = "#ffffff";
constructor(color: string = "#ffffff") {
super();
this.type = DataType.Color;
this.data = color;
}
parse(data: ColorData) {
this.id = data.id;
this.data = data.data;
return this;
}
public isColor(): boolean { return true; }
}
export class StringData extends Info {
constructor(data: string) {
public data: string = "";
constructor(data: string = "") {
super();
this.type = DataType.String;
this.data = data;
}
parse(data: StringData) {
this.id = data.id;
this.data = data.data;
return this;
}
public isString(): boolean { return true; }
}
export class NumberData extends Info {
constructor(data: number) {
public data: number = 0;
constructor(data: number = 0) {
super();
this.type = DataType.Number;
this.data = data;
}
parse(data: NumberData) {
this.id = data.id;
this.data = data.data;
return this;
}
public isNumber(): boolean { return true; }
}
export class BoolData extends Info {
constructor(bol: boolean) {
public data: boolean = false;
constructor(bol: boolean = false) {
super();
this.type = DataType.Bool;
this.data = bol;
}
parse(data: BoolData) {
this.id = data.id;
this.data = data.data;
return this;
}
public isBool(): boolean { return true; }
}
@ -209,6 +258,15 @@ export class Vec2Data extends Info {
this.data = [];
return this;
}
parse(data: Vec2Data) {
this.id = data.id;
for (let i = 0; i < data.data.length; i++) {
const item = data.data[i];
const property = new Property(item.name, item.value).parse(item);
this.data.push(property);
}
return this;
}
add(info: Property) {
this.data.push(info);
@ -233,7 +291,15 @@ export class Vec3Data extends Info {
this.data = [];
return this;
}
parse(data: Vec3Data) {
this.id = data.id;
for (let i = 0; i < data.data.length; i++) {
const item = data.data[i];
const property = new Property(item.name, item.value).parse(item);
this.data.push(property);
}
return this;
}
add(info: Property) {
this.data.push(info);
return this;
@ -257,7 +323,14 @@ export class Vec4Data extends Info {
this.data = [];
return this;
}
parse(data: Vec4Data) {
for (let i = 0; i < data.data.length; i++) {
const item = data.data[i];
const property = new Property(item.name, item.value).parse(item);
this.data.push(property);
}
return this;
}
add(info: Property) {
this.data.push(info);
return this;
@ -285,6 +358,11 @@ export class ImageData extends Info {
this.data = "";
return this;
}
parse(data: ImageData) {
this.id = data.id;
this.data = data.data;
return this;
}
test() {
const cocos = 'data:image/png;base64,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';
this.data = cocos;
@ -299,6 +377,14 @@ export class EnumData extends Info {
super();
this.type = DataType.Enum;
}
parse(data: EnumData) {
this.id = data.id;
for (let i = 0; i < data.values.length; i++) {
const item = data.values[i];
this.values.push({ name: item.name, value: item.value });
}
return this;
}
public isEnum(): boolean {
return this.type === DataType.Enum;
}
@ -328,6 +414,55 @@ export class Property {
this.name = name;
this.value = info;
}
parse(data: Property) {
this.name = data.name;
this.value = data.value;
switch (data.value.type) {
case DataType.Object:
this.value = new ObjectData().parse(data.value as ObjectData);
break;
case DataType.Number:
this.value = new NumberData().parse(data.value as NumberData);
break;
case DataType.Array:
this.value = new ArrayData().parse(data.value as ArrayData);
break;
case DataType.String:
this.value = new StringData().parse(data.value as StringData);
break;
case DataType.Bool:
this.value = new BoolData().parse(data.value as BoolData);
break;
case DataType.Color:
this.value = new ColorData().parse(data.value as ColorData);
break;
case DataType.Vec2:
this.value = new Vec2Data().parse(data.value as Vec2Data);
break;
case DataType.Vec3:
this.value = new Vec3Data().parse(data.value as Vec3Data);
break;
case DataType.Vec4:
this.value = new Vec4Data().parse(data.value as Vec4Data);
break;
case DataType.Image:
this.value = new ImageData().parse(data.value as ImageData);
break;
case DataType.Text:
this.value = new TextData().parse(data.value as TextData);
break;
case DataType.Enum:
this.value = new EnumData().parse(data.value as EnumData);
break;
case DataType.Engine:
this.value = new EngineData().parse(data.value as EngineData);
break;
case DataType.ObjectItem:
default:
throw new Error(`not support type: ${typeof data === 'string' ? data : JSON.stringify(data)}`);
}
return this;
}
}
export class Group {
@ -342,7 +477,17 @@ export class Group {
this.name = name;
this.id = id || '';
}
parse(data: Group) {
this.id = data.id;
this.name = data.name;
this.data = [];
for (let i = 0; i < data.data.length; i++) {
const item = data.data[i];
const property = new Property(item.name, item.value).parse(item);
this.data.push(property);
}
return this;
}
addProperty(property: Property) {
this.data.push(property)
}
@ -371,7 +516,7 @@ export class Group {
}
}
export interface NodeInfoData {
export class NodeInfoData {
/**
* uuid
*/
@ -380,4 +525,21 @@ export interface NodeInfoData {
*
*/
group: Group[];
constructor(uuid: string, group: Group[]) {
this.uuid = uuid;
this.group = group;
}
/**
* json数据解析成NodeInfoData
*/
parse(data: NodeInfoData) {
this.uuid = data.uuid;
this.group = [];
for (let i = 0; i < data.group.length; i++) {
const item = data.group[i];
const group = new Group(item.name, item.id).parse(item);
this.group.push(group);
}
return this;
}
}

View File

@ -1,10 +1,11 @@
<template>
<div v-if="show" class="test">
<CCSection name="功能测试" :expand="false">
<CCSection name="功能测试" :expand="true">
<CCButton @click="onClickHasCocosGame">Has CocosGame</CCButton>
<CCButton @click="onClickNoCocosGame">No CocosGame</CCButton>
<CCButton @click="onTestTree">init tree data</CCButton>
<CCButton @click="onFrames">test frame</CCButton>
<CCButton @click="onTestNodeInfo">test node info</CCButton>
</CCSection>
</div>
</template>
@ -26,6 +27,32 @@ export default defineComponent({
},
setup(props, { emit }) {
const show = ref(__DEV__);
//
const testData = {
uuid: "d1NHXHs35F1rbFJZKeigkl",
group: [
{
id: "d1NHXHs35F1rbFJZKeigkl",
name: "cc.Scene",
data: [
{
name: "position",
value: {
id: "b9068b6f-8c1c-4d88-ac52-52cc09b37c1c",
type: "Vec3",
readonly: false,
path: [],
data: [
{ name: "x", value: { id: "be42ab63-d767-466e-8ba4-fb1b21201c54", type: "Number", readonly: false, path: ["d1NHXHs35F1rbFJZKeigkl", "x"], data: 0 } },
{ name: "y", value: { id: "498db9b2-e4a5-4c91-a546-1c3233e9bb50", type: "Number", readonly: false, path: ["d1NHXHs35F1rbFJZKeigkl", "y"], data: 0 } },
{ name: "z", value: { id: "400e184f-d754-4b66-aeb9-9f1feb1136a3", type: "Number", readonly: false, path: ["d1NHXHs35F1rbFJZKeigkl", "z"], data: 0 } },
],
},
},
],
},
],
};
return {
show,
onClickHasCocosGame() {
@ -52,6 +79,10 @@ export default defineComponent({
const event = new PluginEvent(Page.Background, Page.Devtools, Msg.UpdateFrames, data);
testServer.send(event);
},
onTestNodeInfo() {
const event = new PluginEvent(Page.Background, Page.Devtools, Msg.NodeInfo, testData);
testServer.send(event);
},
};
},
});