diff --git a/cc-inspector/src/core/types.ts b/cc-inspector/src/core/types.ts index da46ddc..673f308 100644 --- a/cc-inspector/src/core/types.ts +++ b/cc-inspector/src/core/types.ts @@ -43,7 +43,24 @@ export interface ResponseSupportData { */ version: string; } - +export class DynamicAtlas { + /** + * 是否启用动态图集 + */ + enable: boolean = false; + atlasCount: number = 0; + maxAtlasCount: number = 0; + maxFrameSize: number = 0; + textureSize: number = 0; + textureBleeding: boolean = true; + /** + * 是否支持在游戏中查看 + */ + supportView: boolean = false; +} +export class ResponseGameInfoData { + public dynamicAtals = new DynamicAtlas(); +} export type ResponseUpdateFramesData = FrameDetails[]; export interface RequestUseFrameData { @@ -99,6 +116,12 @@ export enum Msg { RequestDestroy = "request-destroy", ResponseError = "response-error", + + RequestGameInfo = "request-game-info", + ResponseGameInfo = "response-game-info", + + RequestDynamicAtlasView = "request-dynamic-atlas-view", + ResponseDynamicAtlasView = "response-dynamic-atlas-view", } export class PluginEvent { diff --git a/cc-inspector/src/scripts/inject/inspector.ts b/cc-inspector/src/scripts/inject/inspector.ts index bc11ad5..6254d1c 100644 --- a/cc-inspector/src/scripts/inject/inspector.ts +++ b/cc-inspector/src/scripts/inject/inspector.ts @@ -1,6 +1,6 @@ // eval 注入脚本的代码,变量尽量使用var,后来发现在import之后,let会自动变为var import { uniq } from "lodash"; -import { Msg, PluginEvent, RequestLogData, RequestNodeInfoData, RequestSetPropertyData, ResponseNodeInfoData, ResponseSetPropertyData, ResponseSupportData, ResponseTreeInfoData } from "../../core/types"; +import { Msg, PluginEvent, RequestLogData, RequestNodeInfoData, RequestSetPropertyData, ResponseGameInfoData, ResponseNodeInfoData, ResponseSetPropertyData, ResponseSupportData, ResponseTreeInfoData } from "../../core/types"; import { ArrayData, BoolData, ColorData, DataType, EngineData, Group, ImageData, Info, InvalidData, NodeInfoData, NumberData, ObjectCircleData, ObjectData, Property, StringData, TreeData, Vec2Data, Vec3Data, Vec4Data } from "../../views/devtools/data"; import { InjectEvent } from "./event"; import { getValue, trySetValueWithConfig } from "./setValue"; @@ -11,6 +11,10 @@ declare const cc: any; export class Inspector extends InjectEvent { inspectorGameMemoryStorage: Record = {}; + private getAtlasViewFunction() { + // 之前只有v2版本支持 + return cc?.dynamicAtlasManager?.showDebug; + } onMessage(pluginEvent: PluginEvent): void { switch (pluginEvent.msg) { case Msg.RequestSupport: { @@ -22,6 +26,30 @@ export class Inspector extends InjectEvent { this.updateTreeInfo(); break; } + case Msg.RequestGameInfo: { + const ret = new ResponseGameInfoData(); + const atlasManager = cc?.dynamicAtlasManager || cc.internal?.dynamicAtlasManager || null; + if (atlasManager) { + ret.dynamicAtals.enable = atlasManager.enabled; + ret.dynamicAtals.atlasCount = atlasManager.atlasCount; + ret.dynamicAtals.maxAtlasCount = atlasManager.maxAtlasCount; + ret.dynamicAtals.maxFrameSize = atlasManager.maxFrameSize; + ret.dynamicAtals.textureSize = atlasManager.textureSize; + ret.dynamicAtals.textureBleeding = atlasManager.textureBleeding; + ret.dynamicAtals.supportView = !!this.getAtlasViewFunction(); + this.sendMsgToContent(Msg.ResponseGameInfo, ret); + } + break; + } + case Msg.RequestDynamicAtlasView: { + const b = pluginEvent.data as boolean; + const cb = this.getAtlasViewFunction(); + if (cb) { + cb(b); + this.sendMsgToContent(Msg.ResponseDynamicAtlasView, b); + } + break; + } case Msg.RequestNodeInfo: { const data = pluginEvent.data as RequestNodeInfoData; this.getNodeInfo(data.uuid); @@ -91,6 +119,12 @@ export class Inspector extends InjectEvent { return ""; } } + public isCreatorV2() { + return this.getEngineVersion().startsWith("2."); + } + public isCreatorV3() { + return this.getEngineVersion().startsWith("3."); + } notifySupportGame(b: boolean) { const version = this.getEngineVersion(); this.sendMsgToContent(Msg.ResponseSupport, { support: b, msg: "", version } as ResponseSupportData); diff --git a/cc-inspector/src/views/devtools/bridge.ts b/cc-inspector/src/views/devtools/bridge.ts index ffcd33b..67412d7 100644 --- a/cc-inspector/src/views/devtools/bridge.ts +++ b/cc-inspector/src/views/devtools/bridge.ts @@ -43,6 +43,9 @@ class Bridge implements TestClient { on(msg: Msg, callback: (data: PluginEvent) => void) { this.emitter.on(msg, callback); } + off(msg: Msg, callback: (data: PluginEvent) => void) { + this.emitter.off(msg, callback); + } recv(event: PluginEvent): void { this.emit(event); } diff --git a/cc-inspector/src/views/devtools/game-info.vue b/cc-inspector/src/views/devtools/game-info.vue new file mode 100644 index 0000000..aa53f42 --- /dev/null +++ b/cc-inspector/src/views/devtools/game-info.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/cc-inspector/src/views/devtools/hierarchy.vue b/cc-inspector/src/views/devtools/hierarchy.vue index ef681eb..04452d5 100644 --- a/cc-inspector/src/views/devtools/hierarchy.vue +++ b/cc-inspector/src/views/devtools/hierarchy.vue @@ -25,6 +25,7 @@ import { GA_EventName } from "../../ga/type"; import { bridge } from "./bridge"; import { Bus, BusMsg } from "./bus"; import { EngineData, TreeData } from "./data"; +import GameInfo from "./game-info.vue"; import { appStore } from "./store"; import { Timer } from "./timer"; const { CCTree, CCFootBar, CCDock, CCDialog, CCInput, CCButton, CCInputNumber, CCSelect, CCButtonGroup, CCCheckBox, CCColor, CCDivider } = ccui.components; @@ -214,6 +215,16 @@ export default defineComponent({ updateTree(); }, }); + menus.push({ + name: "game info", + callback() { + ga.fireEventWithParam(GA_EventName.MouseMenu, "game info"); + ccui.dialog.showDialog({ + comp: GameInfo, + title: "Game Info", + }); + }, + }); if (selectedUUID) { menus.push({ name: "visible (sapce)",