diff --git a/src/core/types.ts b/src/core/types.ts index bc4e45a..087ba65 100644 --- a/src/core/types.ts +++ b/src/core/types.ts @@ -81,6 +81,7 @@ export type RequestOpenScriptData = { script: string; }; export type ResponseErrorData = string; +export type RequestBreakOnData = { uuid: string; type: BreakOnType }; export enum Msg { None = "None", /** @@ -154,8 +155,23 @@ export enum Msg { */ RequestOpenNodeTouchFuntion = "request-open-node-touch-funtion", RequestOpenScript = "request-open-script", + RequestBreakOn = "request-break-on", + RequestBreakClean = "request-break-clean", +} +export enum BreakOnType { + SizeChanged = "size changed", + TransformChanged = "transform changed", + ColorChanged = "color changed", + LayerChanged = "layer changed", + SiblingOrderChanged = "sibling order changed", + ActiveChanged = "active changed", + Destroyed = "destroyed", + ParentChanged = "parent changed", + ChildAdded = "child added", + ChildRemoved = "child removed", + CompAdded = "component added", + CompRemoved = "component removed", } - export class PluginEvent { public static FLAG = "cc-inspector"; /** diff --git a/src/scripts/inject/break.ts b/src/scripts/inject/break.ts new file mode 100644 index 0000000..42b2f10 --- /dev/null +++ b/src/scripts/inject/break.ts @@ -0,0 +1,13 @@ +export const breakArray: Array<{ node: any; key: string; fn: Function }> = []; + +export function addBreak(node: any, key: string, fn: Function) { + breakArray.push({ node, key, fn }); +} +export function cleanBreak() { + breakArray.forEach((el) => { + const { node, key, fn } = el; + if (node && node.isValid) { + node.off(key, fn); + } + }); +} diff --git a/src/scripts/inject/hint/index.ts b/src/scripts/inject/hint/index.ts index e501b6e..e7d7ce5 100644 --- a/src/scripts/inject/hint/index.ts +++ b/src/scripts/inject/hint/index.ts @@ -131,7 +131,7 @@ export class Hint { }, } as IUiMenuItem; }); - ccui.menu.showMenuByMouseEvent(event, menu, 0.8); + ccui.menu.showMenuByMouseEvent(event, menu, { opacity: 0.8 }); } } private sendInspectNodeMsg(node: any) { diff --git a/src/scripts/inject/inspector.ts b/src/scripts/inject/inspector.ts index 0692170..f252424 100644 --- a/src/scripts/inject/inspector.ts +++ b/src/scripts/inject/inspector.ts @@ -1,6 +1,6 @@ // eval 注入脚本的代码,变量尽量使用var,后来发现在import之后,let会自动变为var import { uniq } from "lodash"; -import { Msg, PluginEvent, RequestLogData, RequestNodeInfoData, RequestOpenNodeTouchFuntionData, RequestOpenScriptData, RequestSetPropertyData, ResponseGameInfoData, ResponseNodeInfoData, ResponseSetPropertyData, ResponseSupportData, ResponseTreeInfoData } from "../../core/types"; +import { BreakOnType, Msg, PluginEvent, RequestBreakOnData, RequestLogData, RequestNodeInfoData, RequestOpenNodeTouchFuntionData, RequestOpenScriptData, RequestSetPropertyData, ResponseGameInfoData, ResponseNodeInfoData, ResponseSetPropertyData, ResponseSupportData, ResponseTreeInfoData } from "../../core/types"; import { CompType, getNodeIcon } from "../../views/devtools/comp"; import { ArrayData, BoolData, ColorData, DataType, EngineData, EnumData, Group, ImageData, Info, InvalidData, NodeInfoData, NumberData, ObjectCircleData, ObjectData, Property, StringData, TreeData, Vec2Data, Vec3Data, Vec4Data } from "../../views/devtools/data"; import { calcCodeHint, getCallbacks } from "./code-hint"; @@ -12,6 +12,7 @@ import { inspectTarget } from "./inspect-list"; import { getValue, trySetValueWithConfig } from "./setValue"; import { BuildArrayOptions, BuildImageOptions, BuildObjectOptions, BuildVecOptions } from "./types"; import { isHasProperty } from "./util"; +import { addBreak, cleanBreak } from "./break"; declare const cc: any; export class Inspector extends InjectEvent { @@ -224,6 +225,39 @@ export class Inspector extends InjectEvent { } break; } + case Msg.RequestBreakClean: { + cleanBreak(); + break; + } + case Msg.RequestBreakOn: { + const data: RequestBreakOnData = pluginEvent.data; + const node = this.inspectorGameMemoryStorage[data.uuid]; + if (node && node.isValid && node instanceof cc.Node) { + const map = {}; + map[BreakOnType.ActiveChanged] = cc.Node?.EventType?.ACTIVE_CHANGED; + map[BreakOnType.SizeChanged] = cc.Node?.EventType?.SIZE_CHANGED; + map[BreakOnType.TransformChanged] = cc.Node?.EventType?.TRANSFORM_CHANGED; + map[BreakOnType.ColorChanged] = cc.Node?.EventType?.COLOR_CHANGED; + map[BreakOnType.LayerChanged] = cc.Node?.EventType?.LAYER_CHANGED; + map[BreakOnType.SiblingOrderChanged] = cc.Node?.EventType?.SIBLING_ORDER_CHANGED || cc.Node?.EventType?.CHILDREN_ORDER_CHANGED; + map[BreakOnType.Destroyed] = cc.Node?.EventType?.NODE_DESTROYED; + map[BreakOnType.ParentChanged] = cc.Node?.EventType?.PARENT_CHANGED; + map[BreakOnType.ChildAdded] = cc.Node?.EventType?.CHILD_ADDED; + map[BreakOnType.ChildRemoved] = cc.Node?.EventType?.CHILD_REMOVED; + map[BreakOnType.CompAdded] = cc.Node?.EventType?.COMPONENT_ADDED; + map[BreakOnType.CompRemoved] = cc.Node?.EventType?.COMPONENT_REMOVED; + const key = map[data.type]; + if (key) { + const fn = () => { + eval("console.log(key);debugger;"); + }; + node.on(key, fn); + addBreak(node, key, fn); + } else { + console.log(`not adapt event: ${data.type}`); + } + } + } } } init() { diff --git a/src/views/devtools/hierarchy.vue b/src/views/devtools/hierarchy.vue index bdf067e..2a46fcb 100644 --- a/src/views/devtools/hierarchy.vue +++ b/src/views/devtools/hierarchy.vue @@ -22,7 +22,7 @@ import { HandExpandOptions } from "@xuyanfeng/cc-ui/types/cc-tree/const"; import Mousetrap, { MousetrapInstance } from "mousetrap"; import { storeToRefs } from "pinia"; import { defineComponent, nextTick, onMounted, onUnmounted, ref, toRaw, watch } from "vue"; -import { Msg, PluginEvent, RequestOpenNodeTouchFuntionData, RequestOpenScriptData, RequestTreeInfoData, RequestUseFrameData, ResponseSetPropertyData, ResponseSupportData } from "../../core/types"; +import { BreakOnType, Msg, PluginEvent, RequestBreakOnData, RequestOpenNodeTouchFuntionData, RequestOpenScriptData, RequestTreeInfoData, RequestUseFrameData, ResponseSetPropertyData, ResponseSupportData } from "../../core/types"; import { ga } from "../../ga"; import { GA_EventName } from "../../ga/type"; import { ShowCode } from "../../scripts/inject/types"; @@ -484,6 +484,35 @@ export default defineComponent({ }, }); } + // 断点功能 + menus.push({ type: ccui.menu.MenuType.Separator }); + if (data) { + const breakMenus: IUiMenuItem[] = []; + for (let key in BreakOnType) { + const v = BreakOnType[key]; + breakMenus.push({ + name: `${v}`, + enabled: true, + callback: (item) => { + ga.fireEventWithParam(GA_EventName.MouseMenu, item.name); + bridge.send(Msg.RequestBreakOn, { uuid: data.id, type: v } as RequestBreakOnData); + }, + }); + } + menus.push({ + name: "break on", + enabled: true, + items: breakMenus, + }); + } + menus.push({ + name: "break clean", + enabled: true, + callback: (item) => { + ga.fireEventWithParam(GA_EventName.MouseMenu, item.name); + bridge.send(Msg.RequestBreakClean); + }, + }); ccui.menu.showMenuByMouseEvent(event, menus); }, onChangeCase() {