From bbf12d06a7345a4d15012c5930018b49f336ac54 Mon Sep 17 00:00:00 2001 From: qgh Date: Fri, 15 May 2026 14:43:38 +0800 Subject: [PATCH 1/5] add prefab test --- .../scene/test/prefab-for-editor.testcase.ts | 436 ++++++++++++++++++ src/core/scene/test/scene.test.ts | 1 + 2 files changed, 437 insertions(+) create mode 100644 src/core/scene/test/prefab-for-editor.testcase.ts diff --git a/src/core/scene/test/prefab-for-editor.testcase.ts b/src/core/scene/test/prefab-for-editor.testcase.ts new file mode 100644 index 000000000..7392898b1 --- /dev/null +++ b/src/core/scene/test/prefab-for-editor.testcase.ts @@ -0,0 +1,436 @@ +/* + * TODO(qgh):理论上不应该放在这里测试,因为这些接口不是通过proxy调用的 + 而是直接通过service调用的。因为目前还未实现service接口的直接测试,因此是简单的实现。 + 后续需要迁移 + */ +import type { + ICreateByNodeTypeParams, + ICreatePrefabFromNodeParams, + IGetPrefabInfoParams, + INode, + IPrefab, + IApplyPrefabChangesParams, + ISetPropertyOptions, +} from '../common'; +import { NodeType } from '../common'; +import { NodeProxy } from '../main-process/proxy/node-proxy'; +import { EditorProxy } from '../main-process/proxy/editor-proxy'; +import { Rpc } from '../main-process/rpc'; +import { SceneTestEnv } from './scene-test-env'; +import * as fse from 'fs-extra'; +import * as path from 'path'; +import { assetManager } from '../../assets'; + +const rpcPrefabRequest = (method: string, args?: any[]) => + (Rpc.getInstance() as any).request('Prefab', method, args); + +const rpcNodeRequest = (method: string, args?: any[]) => + (Rpc.getInstance() as any).request('Node', method, args); + +function queryNodeDump(path: string): Promise { + return rpcNodeRequest('query', [{ path, queryChildren: false, queryComponent: false }]); +} + +function setNodeProperty(options: ISetPropertyOptions): Promise { + return rpcNodeRequest('setProperty', [options]); +} + +describe('Prefab ForEditor 接口测试', () => { + const testDirName = 'prefab-for-editor'; + const testDir = path.join(SceneTestEnv.cacheDirectory, testDirName); + const testDirURL = `${SceneTestEnv.targetDirectoryURL}/${testDirName}`; + const SceneBaseName = 'prefab-for-editor-scene'; + const SceneURL = `${testDirURL}/${SceneBaseName}.scene`; + + function getURL(name: string, ext: string): string { + return `${testDirURL}/${name}${ext}`; + } + + beforeAll(async () => { + if (!fse.existsSync(testDir)) { + fse.ensureDirSync(testDir); + await assetManager.refreshAsset(testDir); + } + + await EditorProxy.create({ + type: 'scene', + baseName: SceneBaseName, + targetDirectory: testDirURL, + }); + await EditorProxy.open({ + urlOrUUID: SceneURL, + }); + }); + + afterAll(async () => { + await EditorProxy.close({ + urlOrUUID: SceneURL, + }); + try { + fse.removeSync(testDir); + fse.removeSync(testDir + '.meta'); + } catch (e) { } + }); + + describe('1. createPrefabFromNode - 返回 INode dump 数据验证', () => { + let prefabNodeDump: INode | null = null; + const prefabURL = getURL('dump-test-prefab', '.prefab'); + + beforeAll(async () => { + const testNode = await NodeProxy.createByType({ + path: '', + name: 'DumpTestNode', + nodeType: NodeType.SPRITE, + position: { x: 10, y: 20, z: 0 }, + }); + expect(testNode).toBeDefined(); + + const params: ICreatePrefabFromNodeParams = { + nodePath: testNode!.path, + dbURL: prefabURL, + overwrite: true, + }; + + prefabNodeDump = await rpcPrefabRequest('createPrefabFromNode', [params]); + }); + + it('返回有效的 INode 结构', () => { + expect(prefabNodeDump).not.toBeNull(); + expect(prefabNodeDump!.name).toBeDefined(); + expect(prefabNodeDump!.name.value).toBeDefined(); + expect(prefabNodeDump!.uuid).toBeDefined(); + expect(prefabNodeDump!.active).toBeDefined(); + expect(prefabNodeDump!.position).toBeDefined(); + expect(prefabNodeDump!.rotation).toBeDefined(); + expect(prefabNodeDump!.scale).toBeDefined(); + expect(prefabNodeDump!.layer).toBeDefined(); + expect(prefabNodeDump!.__comps__).toBeDefined(); + expect(prefabNodeDump!.__type__).toBeDefined(); + }); + + it('dump 包含 __prefab__ 预制体信息', () => { + expect(prefabNodeDump).not.toBeNull(); + const d = prefabNodeDump as any; + expect(d.__prefab__).toBeDefined(); + expect(d.__prefab__).not.toBeNull(); + }); + + it('__prefab__ 包含 fileId 字段', () => { + const d = prefabNodeDump as any; + expect(d.__prefab__.fileId).toBeDefined(); + expect(typeof d.__prefab__.fileId).toBe('string'); + }); + + it('__prefab__ 包含 instance 字段(预制体实例信息)', () => { + const d = prefabNodeDump as any; + expect(d.__prefab__.instance).toBeDefined(); + }); + }); + + describe('2. getPrefabInfo - 返回 IPrefab dump 数据验证(嵌套预制体)', () => { + let prefabDump: IPrefab | null = null; + let outerNodePath = ''; + const innerPrefabURL = getURL('inner-button-prefab', '.prefab'); + const outerPrefabURL = getURL('outer-nested-prefab', '.prefab'); + + beforeAll(async () => { + // 创建 Button 节点(Button 组件有 target 属性是 cc.Node 引用) + const buttonNode = await NodeProxy.createByType({ + path: '', + name: 'InnerButtonNode', + nodeType: NodeType.BUTTON, + }); + expect(buttonNode).toBeDefined(); + + // 将 Button 节点转换为内部预制体 + const innerResult: any = await rpcPrefabRequest('createPrefabFromNode', [{ + nodePath: buttonNode!.path, + dbURL: innerPrefabURL, + overwrite: true, + } as ICreatePrefabFromNodeParams]); + expect(innerResult).toBeDefined(); + + // 创建外部父节点 + const outerNode = await NodeProxy.createByType({ + path: '', + name: 'OuterNode', + nodeType: NodeType.EMPTY, + }); + expect(outerNode).toBeDefined(); + + // 在外部节点下创建内部预制体的实例(嵌套预制体) + const nestedInstance = await NodeProxy.createByAsset({ + dbURL: innerPrefabURL, + path: outerNode!.path, + name: 'NestedButtonInstance', + }); + expect(nestedInstance).toBeDefined(); + + // 将外部节点转换为预制体(包含嵌套预制体实例) + const outerResult: any = await rpcPrefabRequest('createPrefabFromNode', [{ + nodePath: outerNode!.path, + dbURL: outerPrefabURL, + overwrite: true, + } as ICreatePrefabFromNodeParams]); + expect(outerResult).toBeDefined(); + outerNodePath = outerResult.path || outerResult.__path__ || outerNode!.path; + + // 获取外部预制体的 prefab 信息 + prefabDump = await rpcPrefabRequest('getPrefabInfo', [{ + nodePath: outerNodePath, + } as IGetPrefabInfoParams]); + }); + + it('返回有效的 IPrefab 结构', () => { + expect(prefabDump).not.toBeNull(); + }); + + it('包含 fileId 字段', () => { + expect(prefabDump!.fileId).toBeDefined(); + expect(typeof prefabDump!.fileId).toBe('string'); + }); + + it('包含 targetOverrides 字段(数组)', () => { + if(prefabDump?.targetOverrides){ + expect(prefabDump.targetOverrides).toBeDefined(); + expect(Array.isArray(prefabDump!.targetOverrides)).toBe(true); + } + }); + + it('targetOverrides 条目包含 propertyPath 数组', () => { + if(prefabDump?.targetOverrides) { + expect(prefabDump!.targetOverrides).toBeDefined(); + expect(prefabDump!.targetOverrides!.length).toBeGreaterThan(0); + for (const info of prefabDump!.targetOverrides!) { + expect(info.propertyPath).toBeDefined(); + expect(Array.isArray(info.propertyPath)).toBe(true); + } + } + }); + + it('包含 instance 字段', () => { + expect(prefabDump!.instance).toBeDefined(); + }); + + it('instance 中包含 propertyOverrides', () => { + if (prefabDump!.instance && typeof prefabDump!.instance === 'object') { + const instance = prefabDump!.instance as any; + if (instance.value) { + expect(instance.value.propertyOverrides).toBeDefined(); + } + } + }); + }); + + describe('3. propertyOverrides 的 propertyPath 转换验证', () => { + let nodePath = ''; + const prefabURL = getURL('override-test-prefab', '.prefab'); + + beforeAll(async () => { + const testNode = await NodeProxy.createByType({ + path: '', + name: 'OverrideTestNode', + nodeType: NodeType.EMPTY, + }); + expect(testNode).toBeDefined(); + nodePath = testNode!.path; + + // 创建预制体 + const createResult: any = await rpcPrefabRequest('createPrefabFromNode', [{ + nodePath: nodePath, + dbURL: prefabURL, + overwrite: true, + } as ICreatePrefabFromNodeParams]); + + expect(createResult).toBeDefined(); + nodePath = createResult.path || createResult.__path__ || nodePath; + }); + + it('修改预制体实例属性后,propertyOverrides 的 propertyPath 应为 string[]', async () => { + // 修改节点属性以产生 propertyOverride + const dump = await queryNodeDump(nodePath) as INode; + expect(dump).not.toBeNull(); + + const positionDump = { ...dump.position, value: { x: 99, y: 88, z: 77 } }; + const setResult = await setNodeProperty({ + nodePath: nodePath, + path: 'position', + dump: positionDump, + }); + expect(setResult).toBe(true); + + // 通过 getPrefabInfo 获取预制体信息(原始 dump) + const prefabDump: any = await rpcPrefabRequest('getPrefabInfo', [{ + nodePath: nodePath, + } as IGetPrefabInfoParams]); + expect(prefabDump).not.toBeNull(); + + // 通过 DumpConverter 转换后验证 propertyPath 是 string[] + const { DumpConverter } = await import('../main-process/proxy/dump-converter'); + const converted = DumpConverter.convertPrefab(prefabDump); + expect(converted).not.toBeNull(); + + if (converted?.instance?.propertyOverrides) { + for (const po of converted.instance.propertyOverrides) { + expect(Array.isArray(po.propertyPath)).toBe(true); + for (const item of po.propertyPath) { + expect(typeof item).toBe('string'); + } + } + } + }); + + it('应用修改后再修改,propertyPath 依然是 string[]', async () => { + // 先应用修改 + const applyResult = await rpcPrefabRequest('applyPrefabChanges', [{ + nodePath: nodePath, + } as IApplyPrefabChangesParams]); + expect(applyResult).toBe(true); + + // 再次修改 + const dump = await queryNodeDump(nodePath) as INode; + const scaleDump = { ...dump.scale, value: { x: 3, y: 3, z: 3 } }; + await setNodeProperty({ + nodePath: nodePath, + path: 'scale', + dump: scaleDump, + }); + + // 获取并转换 + const prefabDump: any = await rpcPrefabRequest('getPrefabInfo', [{ + nodePath: nodePath, + } as IGetPrefabInfoParams]); + expect(prefabDump).not.toBeNull(); + + const { DumpConverter } = await import('../main-process/proxy/dump-converter'); + const converted = DumpConverter.convertPrefab(prefabDump); + expect(converted).not.toBeNull(); + + if (converted?.instance?.propertyOverrides) { + for (const po of converted.instance.propertyOverrides) { + expect(Array.isArray(po.propertyPath)).toBe(true); + for (const item of po.propertyPath) { + expect(typeof item).toBe('string'); + } + } + } + }); + }); + + describe('4. targetOverrides 转换验证', () => { + it('嵌套预制体的 targetOverrides 转换后 propertyPath 是 string[]', async () => { + // 创建 Button 节点作为内部预制体(Button.target 是 cc.Node 引用) + const buttonNode = await NodeProxy.createByType({ + path: '', + name: 'TargetOverrideButton', + nodeType: NodeType.BUTTON, + }); + expect(buttonNode).toBeDefined(); + + const innerPrefabURL = getURL('to-inner-prefab', '.prefab'); + const innerResult: any = await rpcPrefabRequest('createPrefabFromNode', [{ + nodePath: buttonNode!.path, + dbURL: innerPrefabURL, + overwrite: true, + } as ICreatePrefabFromNodeParams]); + expect(innerResult).toBeDefined(); + + // 创建外部节点,嵌套内部预制体实例 + const outerNode = await NodeProxy.createByType({ + path: '', + name: 'TargetOverrideOuter', + nodeType: NodeType.EMPTY, + }); + expect(outerNode).toBeDefined(); + + const nestedInstance = await NodeProxy.createByAsset({ + dbURL: innerPrefabURL, + path: outerNode!.path, + name: 'NestedButtonForTO', + }); + expect(nestedInstance).toBeDefined(); + + // 创建外部预制体 + const outerPrefabURL = getURL('to-outer-prefab', '.prefab'); + const outerResult: any = await rpcPrefabRequest('createPrefabFromNode', [{ + nodePath: outerNode!.path, + dbURL: outerPrefabURL, + overwrite: true, + } as ICreatePrefabFromNodeParams]); + expect(outerResult).toBeDefined(); + + const outerNodePath = outerResult.path || outerResult.__path__ || outerNode!.path; + + // 获取外部预制体信息 + const prefabDump: any = await rpcPrefabRequest('getPrefabInfo', [{ + nodePath: outerNodePath, + } as IGetPrefabInfoParams]); + expect(prefabDump).not.toBeNull(); + + // 转换并验证 targetOverrides + const { DumpConverter } = await import('../main-process/proxy/dump-converter'); + const converted = DumpConverter.convertPrefab(prefabDump); + expect(converted).not.toBeNull(); + expect(converted!.targetOverrides).toBeDefined(); + expect(Array.isArray(converted!.targetOverrides)).toBe(true); + + for (const to of converted!.targetOverrides) { + expect(Array.isArray(to.propertyPath)).toBe(true); + for (const item of to.propertyPath) { + expect(typeof item).toBe('string'); + } + } + }); + }); + + describe('5. DumpConverter.convertPrefab 转换完整性验证', () => { + it('转换后的 IPrefabInfo 包含所有必要字段', async () => { + const testNode = await NodeProxy.createByType({ + path: '', + name: 'ConvertTestNode', + nodeType: NodeType.SPRITE, + }); + expect(testNode).toBeDefined(); + + const prefabURL = getURL('convert-test-prefab', '.prefab'); + const createResult: any = await rpcPrefabRequest('createPrefabFromNode', [{ + nodePath: testNode!.path, + dbURL: prefabURL, + overwrite: true, + } as ICreatePrefabFromNodeParams]); + expect(createResult).toBeDefined(); + + const nodePath = createResult.path || createResult.__path__ || testNode!.path; + + const prefabDump: any = await rpcPrefabRequest('getPrefabInfo', [{ + nodePath: nodePath, + } as IGetPrefabInfoParams]); + expect(prefabDump).not.toBeNull(); + + const { DumpConverter } = await import('../main-process/proxy/dump-converter'); + const converted = DumpConverter.convertPrefab(prefabDump); + expect(converted).not.toBeNull(); + + // 必要字段 + expect(converted!.fileId).toBeDefined(); + expect(typeof converted!.fileId).toBe('string'); + expect(converted!.targetOverrides).toBeDefined(); + expect(Array.isArray(converted!.targetOverrides)).toBe(true); + expect(converted!.nestedPrefabInstanceRoots).toBeDefined(); + expect(Array.isArray(converted!.nestedPrefabInstanceRoots)).toBe(true); + + // instance 字段 + if (converted!.instance) { + expect(converted!.instance.fileId).toBeDefined(); + expect(converted!.instance.propertyOverrides).toBeDefined(); + expect(Array.isArray(converted!.instance.propertyOverrides)).toBe(true); + expect(converted!.instance.mountedChildren).toBeDefined(); + expect(Array.isArray(converted!.instance.mountedChildren)).toBe(true); + expect(converted!.instance.mountedComponents).toBeDefined(); + expect(Array.isArray(converted!.instance.mountedComponents)).toBe(true); + expect(converted!.instance.removedComponents).toBeDefined(); + expect(Array.isArray(converted!.instance.removedComponents)).toBe(true); + } + }); + }); +}); diff --git a/src/core/scene/test/scene.test.ts b/src/core/scene/test/scene.test.ts index ea7a2fc5d..6f20b2d35 100644 --- a/src/core/scene/test/scene.test.ts +++ b/src/core/scene/test/scene.test.ts @@ -30,6 +30,7 @@ import './node-for-editor.testcase'; import './component-proxy.testcase'; import './component-for-editor.testcase'; import './prefab-proxy.testcase'; +import './prefab-for-editor.testcase'; import './script-proxy.testcase'; import './engine-proxy.testcase'; import './scene-exit.testcase'; From 00e2f6b0460f25a94f62008cbbee8ab94e69046d Mon Sep 17 00:00:00 2001 From: qgh Date: Tue, 19 May 2026 11:38:33 +0800 Subject: [PATCH 2/5] unify input parameter suffix from params to options --- e2e/mcp/api/component.e2e.test.ts | 26 ++-- src/api/scene/component-schema.ts | 12 +- src/api/scene/component.ts | 28 ++-- src/api/scene/node-schema.ts | 20 +-- src/api/scene/node.ts | 24 +-- src/api/scene/prefab.ts | 14 +- src/api/scene/scene.ts | 12 +- src/core/scene/common/asset.ts | 4 +- src/core/scene/common/cli/component.ts | 2 +- src/core/scene/common/node.ts | 22 +-- src/core/scene/common/prefab/service.ts | 14 +- src/core/scene/common/script.ts | 10 +- src/core/scene/main-process/index.ts | 13 +- src/core/scene/main-process/messages.ts | 10 +- .../scene/main-process/proxy/asset-proxy.ts | 8 +- .../main-process/proxy/component-proxy.ts | 36 ++--- .../scene/main-process/proxy/node-proxy.ts | 62 ++++---- .../scene/main-process/proxy/prefab-proxy.ts | 34 ++--- .../scene/main-process/proxy/script-proxy.ts | 20 +-- src/core/scene/scene-process/service/asset.ts | 4 +- .../scene/scene-process/service/component.ts | 54 +------ .../scene-process/service/component/index.ts | 42 +++-- src/core/scene/scene-process/service/node.ts | 67 ++++---- .../scene/scene-process/service/prefab.ts | 22 +-- .../service/prefab/validate-params.ts | 4 +- .../scene/scene-process/service/script.ts | 10 +- .../test/component-for-editor.testcase.ts | 12 +- .../scene/test/component-proxy.testcase.ts | 44 +++--- .../scene/test/node-for-editor.testcase.ts | 8 +- src/core/scene/test/node-proxy.testcase.ts | 64 ++++---- .../scene/test/prefab-for-editor.testcase.ts | 28 ++-- src/core/scene/test/prefab-proxy.testcase.ts | 144 +++++++++--------- src/core/scene/test/script-proxy.testcase.ts | 8 +- 33 files changed, 419 insertions(+), 463 deletions(-) diff --git a/e2e/mcp/api/component.e2e.test.ts b/e2e/mcp/api/component.e2e.test.ts index 01c6f94b4..1f3562283 100644 --- a/e2e/mcp/api/component.e2e.test.ts +++ b/e2e/mcp/api/component.e2e.test.ts @@ -79,7 +79,7 @@ describe('MCP Component API', () => { it('should add component successfully', async () => { // 添加Label组件 const addResult = await mcpClient.callTool('scene-add-component', { - addComponentInfo: { + options: { nodePath: testNodePath, component: 'cc.Label', }, @@ -95,7 +95,7 @@ describe('MCP Component API', () => { it('should query component successfully', async () => { // 先添加组件 const addResult = await mcpClient.callTool('scene-add-component', { - addComponentInfo: { + options: { nodePath: testNodePath, component: 'cc.Label', }, @@ -108,7 +108,7 @@ describe('MCP Component API', () => { // 查询组件 const queryResult = await mcpClient.callTool('scene-query-component', { - component: { path: componentPath } + options: { path: componentPath } }); expect(queryResult.code).toBe(200); expect(queryResult.data).toBeDefined(); @@ -122,7 +122,7 @@ describe('MCP Component API', () => { it('should set component property successfully', async () => { // 先添加组件 const addResult = await mcpClient.callTool('scene-add-component', { - addComponentInfo: { + options: { nodePath: testNodePath, component: 'cc.Label', }, @@ -135,7 +135,7 @@ describe('MCP Component API', () => { // 查询组件初始属性 const queryResult = await mcpClient.callTool('scene-query-component', { - component: { path: componentPath } + options: { path: componentPath } }); expect(queryResult.code).toBe(200); expect(queryResult.data).toBeDefined(); @@ -144,7 +144,7 @@ describe('MCP Component API', () => { // 设置组件属性 const setResult = await mcpClient.callTool('scene-set-component-property', { - setPropertyOptions: { + options: { componentPath: componentPath, properties: { string: 'Hello World' @@ -155,7 +155,7 @@ describe('MCP Component API', () => { // 验证属性已更改 const queryAfterSet = await mcpClient.callTool('scene-query-component', { - component: { path: componentPath } + options: { path: componentPath } }); expect(queryAfterSet.code).toBe(200); expect(queryAfterSet.data).toBeDefined(); @@ -166,7 +166,7 @@ describe('MCP Component API', () => { it('should delete component successfully', async () => { // 先添加组件 const addResult = await mcpClient.callTool('scene-add-component', { - addComponentInfo: { + options: { nodePath: testNodePath, component: 'cc.Label', }, @@ -178,13 +178,13 @@ describe('MCP Component API', () => { // 删除组件 const deleteResult = await mcpClient.callTool('scene-delete-component', { - component: { path: componentPath } + options: { path: componentPath } }); expect(deleteResult.code).toBe(200); // 验证组件已删除 - 查询应该返回null或失败 const queryAfterDelete = await mcpClient.callTool('scene-query-component', { - component: { path: componentPath } + options: { path: componentPath } }); // 组件删除后查询应该失败或返回null expect(queryAfterDelete.code).not.toBe(200); @@ -199,7 +199,7 @@ describe('MCP Component API', () => { // 添加多个不同类型的组件 for (const componentType of componentTypes) { const addResult = await mcpClient.callTool('scene-add-component', { - addComponentInfo: { + options: { nodePath: testNodePath, component: componentType, }, @@ -212,7 +212,7 @@ describe('MCP Component API', () => { // 验证组件已添加 const queryResult = await mcpClient.callTool('scene-query-component', { - component: { path: addResult.data.path } + options: { path: addResult.data.path } }); expect(queryResult.code).toBe(200); expect(queryResult.data).toBeDefined(); @@ -223,7 +223,7 @@ describe('MCP Component API', () => { // 清理添加的组件 for (const componentPath of addedComponents) { await mcpClient.callTool('scene-delete-component', { - component: { path: componentPath } + options: { path: componentPath } }); } }); diff --git a/src/api/scene/component-schema.ts b/src/api/scene/component-schema.ts index 330161e74..7ad0994af 100644 --- a/src/api/scene/component-schema.ts +++ b/src/api/scene/component-schema.ts @@ -4,18 +4,18 @@ import { SchemaComponentIdentifier } from '../base/schema-identifier'; import { SchemaCompPrefabInfo } from './prefab-info-schema'; // Create component information // 创建组件信息 -export const SchemaAddComponentInfo = z.object({ +export const SchemaAddComponentOptions = z.object({ nodePath: z.string().describe('Node path'), // 节点路径 component: z.string().describe('Component name, supports component name, component resource URL and UUID'), // 组件名称,支持组件名称、组件资源的 URL 与 UUID }).describe('Information for adding a component'); // 添加组件的信息 // Remove component // 移除组件 -export const SchemaRemoveComponent = z.object({ +export const SchemaRemoveComponentOptions = z.object({ path: z.string().describe('Path of the component, including node path'), // 组件的路径,包含节点路径 }).describe('Information required to remove a component'); // 移除组件需要的信息 // Query component // 查询组件 -export const SchemaQueryComponent = z.object({ +export const SchemaQueryComponentOptions = z.object({ path: z.string().describe('Path of the component, including node path'), // 组件的路径,包含节点路径 }).describe('Information required to query a component'); // 查询组件需要的信息 @@ -123,10 +123,10 @@ export const SchemaComponentResult = z.union([SchemaComponent, z.null()]).descri export const SchemaBooleanResult = z.boolean().describe('Interface return result'); // 接口返回结果 // Type export // 类型导出 -export type TAddComponentInfo = z.infer; +export type TAddComponentOptions = z.infer; export type TComponentIdentifier = z.infer; -export type TRemoveComponentOptions = z.infer; -export type TQueryComponentOptions = z.infer; +export type TRemoveComponentOptions = z.infer; +export type TQueryComponentOptions = z.infer; export type TSetPropertyOptions = z.infer; export type TComponentResult = z.infer; export type TQueryAllComponentResult = z.infer; diff --git a/src/api/scene/component.ts b/src/api/scene/component.ts index 5f082ccff..9a5c0ad76 100644 --- a/src/api/scene/component.ts +++ b/src/api/scene/component.ts @@ -1,13 +1,13 @@ import { - SchemaAddComponentInfo, + SchemaAddComponentOptions, SchemaSetPropertyOptions, SchemaComponentResult, SchemaBooleanResult, SchemaQueryAllComponentResult, - SchemaQueryComponent, - SchemaRemoveComponent, + SchemaQueryComponentOptions, + SchemaRemoveComponentOptions, - TAddComponentInfo, + TAddComponentOptions, TSetPropertyOptions, TComponentResult, TQueryAllComponentResult, @@ -18,7 +18,7 @@ import { import { description, param, result, title, tool } from '../decorator/decorator.js'; import { COMMON_STATUS, CommonResultType } from '../base/schema-base'; import { Scene, IComponentInfo } from '../../core/scene'; -import { ISetPropertyOptionsInfo } from '../../core/scene/common/cli/component'; +import { ISetComponentPropertyOptions } from '../../core/scene/common/cli/component'; export class ComponentApi { @@ -29,9 +29,9 @@ export class ComponentApi { @title('Add component') // 添加组件 @description('Add component to node, input node name, component type, built-in or custom component. Returns all component details on success. Can query all component names via scene-query-all-component') // 添加组件到节点中,输入节点名,组件类型,内置组件或自定义组件, 成功返回所有的组件详细信息,可以通过 scene-query-all-component 查询到所有组件的名称 @result(SchemaComponentResult) - async addComponent(@param(SchemaAddComponentInfo) addComponentInfo: TAddComponentInfo): Promise> { + async addComponent(@param(SchemaAddComponentOptions) options: TAddComponentOptions): Promise> { try { - const component = await Scene.Component.add({ nodePath: addComponentInfo.nodePath, component: addComponentInfo.component }); + const component = await Scene.Component.add({ nodePath: options.nodePath, component: options.component }); return { code: COMMON_STATUS.SUCCESS, data: component @@ -51,9 +51,9 @@ export class ComponentApi { @title('Remove component') // 删除组件 @description('Remove node component, returns true on success, false on failure') // 删除节点组件,移除成功返回 true, 移除失败返回 false @result(SchemaBooleanResult) - async removeComponent(@param(SchemaRemoveComponent) component: TRemoveComponentOptions): Promise> { + async removeComponent(@param(SchemaRemoveComponentOptions) options: TRemoveComponentOptions): Promise> { try { - const result = await Scene.Component.remove(component); + const result = await Scene.Component.remove(options); return { code: COMMON_STATUS.SUCCESS, data: result @@ -73,11 +73,11 @@ export class ComponentApi { @title('Query component') // 查询组件 @description('Query component info, returns all properties of the component') // 查询组件信息,返回组件的所有属性 @result(SchemaComponentResult) - async queryComponent(@param(SchemaQueryComponent) component: TQueryComponentOptions): Promise> { + async queryComponent(@param(SchemaQueryComponentOptions) options: TQueryComponentOptions): Promise> { try { - const componentInfo = await Scene.Component.query(component); + const componentInfo = await Scene.Component.query(options); if (!componentInfo) { - throw new Error(`component not found: ${component.path}`); + throw new Error(`component not found: ${options.path}`); } return { code: COMMON_STATUS.SUCCESS, @@ -98,9 +98,9 @@ export class ComponentApi { @title('Set component property') // 设置组件属性 @description('Set component property. Input component path (unique index of component), property name, property value to modify corresponding property info. Property types can be queried via scene-query-component') // 设置组件属性,输入组件path(唯一索引的组件)、属性名称、属性值,修改对应属性的信息,属性的类型可以通过 scene-query-component 查询到 @result(SchemaBooleanResult) - async setProperty(@param(SchemaSetPropertyOptions) setPropertyOptions?: TSetPropertyOptions): Promise> { + async setProperty(@param(SchemaSetPropertyOptions) options?: TSetPropertyOptions): Promise> { try { - const result = await Scene.Component.setProperty(setPropertyOptions as ISetPropertyOptionsInfo); + const result = await Scene.Component.setProperty(options as ISetComponentPropertyOptions); return { code: COMMON_STATUS.SUCCESS, data: result diff --git a/src/api/scene/node-schema.ts b/src/api/scene/node-schema.ts index 254a219f7..de262fcd4 100644 --- a/src/api/scene/node-schema.ts +++ b/src/api/scene/node-schema.ts @@ -45,7 +45,7 @@ export const SchemaNodeSearch = SchemaNodeIdentifier.extend({ }).describe('Query options for nodes, the result is the intersection of the passed information'); // 查询节点的选项参数,查询结果是传入的信息的交集 // 查询节点的参数 -export const SchemaNodeQuery = z.object({ +export const SchemaNodeQueryOptions = z.object({ path: z.string().describe('Node path, root path is "/"'), // 节点路径 queryChildren: z.boolean().default(false).describe('Whether to query child node information'), // 是否查询子节点信息 queryComponent: z.boolean().default(false).describe('Whether to query component`s detailed information, the child component only returns concise information.'), // 是否查询组件信息,子节点只返回简易的信息 @@ -55,7 +55,7 @@ export const SchemaNodeQuery = z.object({ export const SchemaNodeQueryResult: z.ZodType = SchemaNode; //节点更新的参数 -export const SchemaNodeUpdate = z.object({ +export const SchemaNodeUpdateOptions = z.object({ path: z.string().describe('Relative path of the node'), // 节点相对路径 name: z.string().optional().describe('Name of the node to update'), // 更新的节点名称 properties: SchemaNodeProperty.partial().optional().describe('Node properties to update, can update partial properties'), // 要更新的节点属性,可以只更新部分属性 @@ -72,7 +72,7 @@ export const SchemaNodeDeleteResult = z.object({ }); // 删除节点的参数 -export const SchemaNodeDelete = z.object({ +export const SchemaNodeDeleteOptions = z.object({ path: z.string().describe('Relative path of the node'), // 节点相对路径 keepWorldTransform: z.boolean().optional().describe('Keep world transform'), // 保持世界变换 }).describe('To configure options for node deletion, the Scene must be open first.'); // 删除节点的选项参数,需先打开场景 @@ -86,20 +86,20 @@ const SchemaNodeCreateBase = z.object({ canvasRequired: z.boolean().optional().describe('Whether Canvas is required'), // 是否需要 Canvas }).describe('To configure options for node creation, the Scene must be open first.'); // 创建节点的选项参数, 需先打开场景; -export const SchemaNodeCreateByAsset = SchemaNodeCreateBase.extend({ +export const SchemaNodeCreateByAssetOptions = SchemaNodeCreateBase.extend({ dbURL: SchemaUrl.describe('Prefab asset path, if created from a prefab, please pass this parameter, format is custom db path e.g. db://assets/abc.prefab'), // 预制体资源路径,如果是从某个预制体创建,请传入这个参数,格式为自定义的db 路径比如 db://assets/abc.prefab }); -export const SchemaNodeCreateByType = SchemaNodeCreateBase.extend({ +export const SchemaNodeCreateByTypeOptions = SchemaNodeCreateBase.extend({ nodeType: z.enum(Object.values(NodeType) as [string, ...string[]]).describe('Node type'), // 节点类型 }); // 类型导出 -export type TDeleteNodeOptions = z.infer; -export type TUpdateNodeOptions = z.infer; -export type TCreateNodeByAssetOptions = z.infer; -export type TCreateNodeByTypeOptions = z.infer; -export type TQueryNodeOptions = z.infer; +export type TDeleteNodeOptions = z.infer; +export type TUpdateNodeOptions = z.infer; +export type TCreateNodeByAssetOptions = z.infer; +export type TCreateNodeByTypeOptions = z.infer; +export type TQueryNodeOptions = z.infer; export type TNodeDetail = z.infer; export type TNodeUpdateResult = z.infer; export type TNodeDeleteResult = z.infer; diff --git a/src/api/scene/node.ts b/src/api/scene/node.ts index 97437d852..265bc21b8 100644 --- a/src/api/scene/node.ts +++ b/src/api/scene/node.ts @@ -1,9 +1,9 @@ import { - SchemaNodeCreateByAsset, - SchemaNodeCreateByType, - SchemaNodeUpdate, - SchemaNodeDelete, - SchemaNodeQuery, + SchemaNodeCreateByAssetOptions, + SchemaNodeCreateByTypeOptions, + SchemaNodeUpdateOptions, + SchemaNodeDeleteOptions, + SchemaNodeQueryOptions, TNodeDetail, TNodeUpdateResult, TNodeDeleteResult, @@ -18,7 +18,7 @@ import { } from './node-schema'; import { description, param, result, title, tool } from '../decorator/decorator.js'; import { COMMON_STATUS, CommonResultType } from '../base/schema-base'; -import { ICreateByNodeTypeParams, INodeInfo, Scene } from '../../core/scene'; +import { ICreateByNodeTypeOptions, INodeInfo, Scene } from '../../core/scene'; export class NodeApi { @@ -29,13 +29,13 @@ export class NodeApi { @title('Create Node By Type') // 根据类型创建节点 @description('Create a node named name with type nodeType under the path in the currently opened scene. The node path must be unique. If multi-level nodes are not created, empty nodes will be automatically completed.') // 在当前打开的场景中的 path 路径下创建一个名字为 name,类型为 nodeType 的节点,节点的路径必须是唯一的,如果有多级节点没创建,会自动补全空节点。 @result(SchemaNodeQueryResult) - async createNodeByType(@param(SchemaNodeCreateByType) options: TCreateNodeByTypeOptions): Promise> { + async createNodeByType(@param(SchemaNodeCreateByTypeOptions) options: TCreateNodeByTypeOptions): Promise> { const ret: CommonResultType = { code: COMMON_STATUS.SUCCESS, data: undefined, }; try { - const resultNode = await Scene.Node.createByType(options as ICreateByNodeTypeParams); + const resultNode = await Scene.Node.createByType(options as ICreateByNodeTypeOptions); if (resultNode) { ret.data = resultNode; } @@ -56,7 +56,7 @@ export class NodeApi { @title('Create Node By Asset') // 根据资源创建节点 @description('Create a node named name using dbURL asset under the path in the currently opened scene. The node path must be unique. If multi-level nodes are not created, empty nodes will be automatically completed. Example of resource dbURL format: db://assets/sample.prefab') // 在当前打开的场景中的 path 路径下使用 dbURL 资源,创建一个名字为 name 的节点,节点的路径必须是唯一的,如果有多级节点没创建,会自动补全空节点,资源的 dbURL 格式举例:db://assets/sample.prefab @result(SchemaNodeQueryResult) - async createNodeByAsset(@param(SchemaNodeCreateByAsset) options: TCreateNodeByAssetOptions): Promise> { + async createNodeByAsset(@param(SchemaNodeCreateByAssetOptions) options: TCreateNodeByAssetOptions): Promise> { const ret: CommonResultType = { code: COMMON_STATUS.SUCCESS, data: undefined, @@ -83,7 +83,7 @@ export class NodeApi { @title('Delete Node') // 删除节点 @description('Delete a node in the currently opened scene. You need to pass in the path of the node, such as: Canvas/Node1') // 在当前打开的场景中删除节点,需要传入节点的路径,比如:Canvas/Node1 @result(SchemaNodeDeleteResult) - async deleteNode(@param(SchemaNodeDelete) options: TDeleteNodeOptions): Promise> { + async deleteNode(@param(SchemaNodeDeleteOptions) options: TDeleteNodeOptions): Promise> { const ret: CommonResultType = { code: COMMON_STATUS.SUCCESS, data: undefined, @@ -112,7 +112,7 @@ export class NodeApi { @title('Update Node') // 更新节点 @description('Update a node in the currently opened scene. You need to pass in the path of the node, such as: Canvas/Node1') // 在当前打开的场景中更新节点,需要传入节点的路径,比如:Canvas/Node1 @result(SchemaNodeUpdateResult) - async updateNode(@param(SchemaNodeUpdate) options: TUpdateNodeOptions): Promise> { + async updateNode(@param(SchemaNodeUpdateOptions) options: TUpdateNodeOptions): Promise> { try { const data = await Scene.Node.update(options); return { @@ -135,7 +135,7 @@ export class NodeApi { @title('Query Node') // 查询节点 @description('Query a node in the currently opened scene. You need to pass in the path of the node, such as: Canvas/Node1') // 在当前打开的场景中查询节点,需要传入节点的路径,比如:Canvas/Node1 @result(SchemaNodeQueryResult) - async queryNode(@param(SchemaNodeQuery) options: TQueryNodeOptions): Promise> { + async queryNode(@param(SchemaNodeQueryOptions) options: TQueryNodeOptions): Promise> { const ret: CommonResultType = { code: COMMON_STATUS.SUCCESS, data: undefined, diff --git a/src/api/scene/prefab.ts b/src/api/scene/prefab.ts index 0efd8ec7f..62ce5d96b 100644 --- a/src/api/scene/prefab.ts +++ b/src/api/scene/prefab.ts @@ -33,7 +33,7 @@ export class PrefabApi { @result(SchemaNode) async createPrefabFromNode(@param(SchemaCreatePrefabFromNodeOptions) options: TCreatePrefabFromNodeOptions): Promise> { try { - const data = await Scene.createPrefabFromNode(options); + const data = await Scene.Prefab.createFromNode(options); return { data: data, code: COMMON_STATUS.SUCCESS, @@ -53,7 +53,7 @@ export class PrefabApi { @result(SchemaApplyPrefabChangesResult) async applyPrefabChanges(@param(SchemaApplyPrefabChangesOptions) options: TApplyPrefabChangesOptions): Promise> { try { - const data = await Scene.applyPrefabChanges(options); + const data = await Scene.Prefab.applyChanges(options); return { data: data, code: COMMON_STATUS.SUCCESS, @@ -73,7 +73,7 @@ export class PrefabApi { @result(SchemaRevertToPrefabResult) async revertToPrefab(@param(SchemaRevertToPrefabOptions) options: TRevertToPrefabOptions): Promise> { try { - const data = await Scene.revertToPrefab(options); + const data = await Scene.Prefab.revert(options); return { data: data, code: COMMON_STATUS.SUCCESS, @@ -93,7 +93,7 @@ export class PrefabApi { @result(SchemaNode) async unpackPrefabInstance(@param(SchemaUnpackPrefabInstanceOptions) options: TUnpackPrefabInstanceOptions): Promise> { try { - const data = await Scene.unpackPrefabInstance(options); + const data = await Scene.Prefab.unpack(options); return { data: data, code: COMMON_STATUS.SUCCESS, @@ -113,7 +113,7 @@ export class PrefabApi { @result(SchemaIsPrefabInstanceResult) async isPrefabInstance(@param(SchemaIsPrefabInstanceOptions) options: TIsPrefabInstanceOptions): Promise> { try { - const data = await Scene.isPrefabInstance(options); + const data = await Scene.Prefab.isInstance(options); return { data: data, code: COMMON_STATUS.SUCCESS, @@ -133,7 +133,7 @@ export class PrefabApi { @result(SchemaGetPrefabResult) async getPrefabInfo(@param(SchemaGetPrefabInfoOptions) options: TGetPrefabInfoParams): Promise> { try { - const data = await Scene.getPrefabInfo(options); + const data = await Scene.Prefab.getInfo(options); return { data: data, code: COMMON_STATUS.SUCCESS, @@ -146,4 +146,4 @@ export class PrefabApi { }; } } -} \ No newline at end of file +} diff --git a/src/api/scene/scene.ts b/src/api/scene/scene.ts index 18f142c97..34cedb7a8 100644 --- a/src/api/scene/scene.ts +++ b/src/api/scene/scene.ts @@ -41,7 +41,7 @@ export class SceneApi { @result(SchemaCurrentResult) async queryCurrent(): Promise> { try { - const data = await Scene.queryCurrent(); + const data = await Scene.Editor.queryCurrent(); const result = { data: data as TCurrentResult, code: COMMON_STATUS.SUCCESS, @@ -66,7 +66,7 @@ export class SceneApi { @result(SchemaOpenResult) async open(@param(SchemaOpenOptions) options: TOpenOptions): Promise> { try { - const data = await Scene.open({ urlOrUUID: options.dbURLOrUUID, simpleNode: options.simpleNode }); + const data = await Scene.Editor.open({ urlOrUUID: options.dbURLOrUUID, simpleNode: options.simpleNode }); return { data: data as TOpenResult, code: COMMON_STATUS.SUCCESS, @@ -86,7 +86,7 @@ export class SceneApi { @result(SchemaCloseResult) async close(): Promise> { try { - const data = await Scene.close({}); + const data = await Scene.Editor.close({}); return { data, code: COMMON_STATUS.SUCCESS, @@ -106,7 +106,7 @@ export class SceneApi { @result(SchemaSaveResult) async save(): Promise> { try { - const data = await Scene.save({}); + const data = await Scene.Editor.save({}); return { data, code: COMMON_STATUS.SUCCESS, @@ -126,7 +126,7 @@ export class SceneApi { @result(SchemaCreateResult) async createScene(@param(SchemaCreateOptions) options: TCreateOptions): Promise> { try { - const data = await Scene.create({ + const data = await Scene.Editor.create({ type: 'scene', baseName: options.baseName, targetDirectory: options.dbURL, @@ -152,7 +152,7 @@ export class SceneApi { @result(SchemaReload) async reloadScene(): Promise> { try { - const data = await Scene.reload({}); + const data = await Scene.Editor.reload({}); return { code: COMMON_STATUS.SUCCESS, data: data as TReload, diff --git a/src/core/scene/common/asset.ts b/src/core/scene/common/asset.ts index 4ff993683..c4621c78d 100644 --- a/src/core/scene/common/asset.ts +++ b/src/core/scene/common/asset.ts @@ -19,11 +19,11 @@ export interface IAssetService extends IServiceEvents { * 资源发生变化时,进行处理 * @param uuid */ - assetChanged(uuid: string): Promise; + changed(uuid: string): Promise; /** * 资源删除时,进行处理 * @param uuid */ - assetDeleted(uuid: string): Promise; + deleted(uuid: string): Promise; } diff --git a/src/core/scene/common/cli/component.ts b/src/core/scene/common/cli/component.ts index fbcfe6353..357e60536 100644 --- a/src/core/scene/common/cli/component.ts +++ b/src/core/scene/common/cli/component.ts @@ -18,7 +18,7 @@ export interface IComponentInfo extends IComponentIdentifier { /** * CLI 设置组件属性的选项 */ -export interface ISetPropertyOptionsInfo { +export interface ISetComponentPropertyOptions { componentPath: string; properties: { [key: string]: null | undefined | number | boolean | string | object | Array; diff --git a/src/core/scene/common/node.ts b/src/core/scene/common/node.ts index 884f85edb..1f87ff629 100644 --- a/src/core/scene/common/node.ts +++ b/src/core/scene/common/node.ts @@ -30,7 +30,7 @@ export interface INodeTreeItem { components: INodeTreeComponent[]; } -export interface IQueryNodeTreeParams { +export interface IQueryNodeTreeOptions { path?: string; } @@ -97,7 +97,7 @@ export enum MobilityMode { } // 节点查询参数接口 -export interface IQueryNodeParams { +export interface IQueryNodeOptions { path: string; // 查询的节点路径 queryChildren: boolean; // 是否查询子节点信息 queryComponent: boolean; // 是否查询component的详细信息 @@ -144,7 +144,7 @@ export interface INode { } // 节点删除参数接口 -export interface IDeleteNodeParams { +export interface IDeleteNodeOptions { path: string; // 节点相对路径 keepWorldTransform?: boolean; // 保持世界变换 } @@ -166,7 +166,7 @@ export interface IDeleteNodeResult { // canvasRequired?: boolean; // } -interface IBaseCreateNodeParams { +interface IBaseCreateNodeOptions { path: string; name?: string; workMode?: '2d' | '3d'; @@ -175,11 +175,11 @@ interface IBaseCreateNodeParams { canvasRequired?: boolean; } -export interface ICreateByNodeTypeParams extends IBaseCreateNodeParams { +export interface ICreateByNodeTypeOptions extends IBaseCreateNodeOptions { nodeType: NodeType; } -export interface ICreateByAssetParams extends IBaseCreateNodeParams { +export interface ICreateByAssetOptions extends IBaseCreateNodeOptions { dbURL: string; } @@ -228,30 +228,30 @@ export interface INodeService extends IServiceEvents { * 创建节点 * @param params */ - createByType(params: ICreateByNodeTypeParams): Promise; + createByType(params: ICreateByNodeTypeOptions): Promise; /** * 创建节点 * @param params */ - createByAsset(params: ICreateByAssetParams): Promise; + createByAsset(params: ICreateByAssetOptions): Promise; /** * 删除节点 * @param params */ - delete(params: IDeleteNodeParams): Promise; + delete(params: IDeleteNodeOptions): Promise; /** * 查询节点信息 * * @param params - 查询选项 * @returns 查询到的节点信息,未找到返回 null */ - query(params?: IQueryNodeParams): Promise; + query(params?: IQueryNodeOptions): Promise; /** * 查询节点树(层级管理器格式) */ - queryNodeTree(params: IQueryNodeTreeParams): Promise; + queryNodeTree(params: IQueryNodeTreeOptions): Promise; // ---- 编辑器相关接口 ---- diff --git a/src/core/scene/common/prefab/service.ts b/src/core/scene/common/prefab/service.ts index f1f6e589f..33cf53a0b 100644 --- a/src/core/scene/common/prefab/service.ts +++ b/src/core/scene/common/prefab/service.ts @@ -24,32 +24,32 @@ export interface IPrefabService extends IServiceEvents { /** * 将节点转换为预制体资源 */ - createPrefabFromNode(params: ICreatePrefabFromNodeParams): Promise; + createFromNode(params: ICreatePrefabFromNodeParams): Promise; /** * 将节点的修改应用回预制体资源 */ - applyPrefabChanges(params: IApplyPrefabChangesParams): Promise; + applyChanges(params: IApplyPrefabChangesParams): Promise; /** * 重置节点到预制体原始状态 */ - revertToPrefab(params: IRevertToPrefabParams): Promise; + revert(params: IRevertToPrefabParams): Promise; /** * 解耦预制体实例,使其成为普通节点 */ - unpackPrefabInstance(params: IUnpackPrefabInstanceParams): Promise; + unpack(params: IUnpackPrefabInstanceParams): Promise; /** * 检查节点是否为预制体实例 */ - isPrefabInstance(params: IIsPrefabInstanceParams): Promise; + isInstance(params: IIsPrefabInstanceParams): Promise; /** * 获取节点的预制体信息 */ - getPrefabInfo(params: IGetPrefabInfoParams): Promise; + getInfo(params: IGetPrefabInfoParams): Promise; /** * 移除 prefab info @@ -57,4 +57,4 @@ export interface IPrefabService extends IServiceEvents { * @param removeNested */ removePrefabInfoFromNode(node: Node, removeNested?: boolean): void; -} \ No newline at end of file +} diff --git a/src/core/scene/common/script.ts b/src/core/scene/common/script.ts index 967d9806e..9c1ab93cf 100644 --- a/src/core/scene/common/script.ts +++ b/src/core/scene/common/script.ts @@ -11,11 +11,11 @@ export interface IPublicScriptService extends Omit; - loadScript(): Promise; - removeScript(): Promise; - scriptChange(): Promise; - queryScriptCid(uuid: string): Promise; - queryScriptName(uuid: string): Promise; + load(): Promise; + remove(): Promise; + change(): Promise; + queryCid(uuid: string): Promise; + queryName(uuid: string): Promise; isCustomComponent(classConstructor: Function): boolean; suspend(condition: Promise): void; } diff --git a/src/core/scene/main-process/index.ts b/src/core/scene/main-process/index.ts index c6d14b7dd..cfd504cac 100644 --- a/src/core/scene/main-process/index.ts +++ b/src/core/scene/main-process/index.ts @@ -20,15 +20,12 @@ export interface IMainModule { } export const Scene = { - ...EditorProxy, - ...ScriptProxy, - ...AssetProxy, - ...EngineProxy, - ...PrefabProxy, - // 节点相关的接口 + Editor: EditorProxy, + Script: ScriptProxy, + Asset: AssetProxy, + Engine: EngineProxy, + Prefab: PrefabProxy, Node: NodeProxy, - // 组件相关的接口 Component: ComponentProxy, - // 场景进程 worker: sceneWorker, }; diff --git a/src/core/scene/main-process/messages.ts b/src/core/scene/main-process/messages.ts index 5d03968ea..64917e7aa 100644 --- a/src/core/scene/main-process/messages.ts +++ b/src/core/scene/main-process/messages.ts @@ -16,7 +16,7 @@ export async function listenModuleMessages() { switch (asset.meta.importer) { case 'typescript': case 'javascript': - void ScriptProxy.loadScript(); + void ScriptProxy.load(); break; } }); @@ -25,21 +25,21 @@ export async function listenModuleMessages() { switch (asset.meta.importer) { case 'typescript': case 'javascript': { - void ScriptProxy.scriptChange(); + void ScriptProxy.change(); break; } } - AssetProxy.assetChanged(asset.uuid).catch((err) => {}); + AssetProxy.changed(asset.uuid).catch((err) => {}); }); assetManager.on('asset-delete', (asset: IAsset) => { switch (asset.meta.importer) { case 'typescript': case 'javascript': { - void ScriptProxy.removeScript(); + void ScriptProxy.remove(); break; } } - AssetProxy.assetDeleted(asset.uuid).catch((err) => {}); + AssetProxy.deleted(asset.uuid).catch((err) => {}); }); } diff --git a/src/core/scene/main-process/proxy/asset-proxy.ts b/src/core/scene/main-process/proxy/asset-proxy.ts index 8b7f24755..21a291b77 100644 --- a/src/core/scene/main-process/proxy/asset-proxy.ts +++ b/src/core/scene/main-process/proxy/asset-proxy.ts @@ -2,10 +2,10 @@ import { IPublicAssetService } from '../../common'; import { Rpc } from '../rpc'; export const AssetProxy: IPublicAssetService = { - assetChanged(uuid: string): Promise { - return Rpc.getInstance().request('Asset', 'assetChanged', [uuid]); + changed(uuid: string): Promise { + return Rpc.getInstance().request('Asset', 'changed', [uuid]); }, - assetDeleted(uuid: string): Promise { - return Rpc.getInstance().request('Asset', 'assetDeleted', [uuid]); + deleted(uuid: string): Promise { + return Rpc.getInstance().request('Asset', 'deleted', [uuid]); }, }; diff --git a/src/core/scene/main-process/proxy/component-proxy.ts b/src/core/scene/main-process/proxy/component-proxy.ts index 4b5c6bfd7..8f9aa682c 100644 --- a/src/core/scene/main-process/proxy/component-proxy.ts +++ b/src/core/scene/main-process/proxy/component-proxy.ts @@ -5,44 +5,44 @@ import { IPublicComponentService, } from '../../common'; import { IComponentInfo } from '../../common/cli/component'; -import { ISetPropertyOptionsInfo } from '../../common/cli/component'; +import { ISetComponentPropertyOptions } from '../../common/cli/component'; import { Rpc } from '../rpc'; import { DumpConverter } from './dump-converter'; export interface IComponentProxy extends Omit { - add(params: IAddComponentOptions): Promise; - query(params: IQueryComponentOptions): Promise; - setProperty(params: ISetPropertyOptionsInfo): Promise; + add(options: IAddComponentOptions): Promise; + query(options: IQueryComponentOptions): Promise; + setProperty(options: ISetComponentPropertyOptions): Promise; } export const ComponentProxy: IComponentProxy = { - async add(params: IAddComponentOptions): Promise { - const result: any = await Rpc.getInstance().request('Component', 'add', [params]); + async add(options: IAddComponentOptions): Promise { + const result: any = await Rpc.getInstance().request('Component', 'add', [options]); return DumpConverter.toComponent(result); }, - remove(params: IRemoveComponentOptions): Promise { - return Rpc.getInstance().request('Component', 'remove', [params]); + remove(options: IRemoveComponentOptions): Promise { + return Rpc.getInstance().request('Component', 'remove', [options]); }, - async query(params: IQueryComponentOptions): Promise { - const result: any = await Rpc.getInstance().request('Component', 'query', [params]); + async query(options: IQueryComponentOptions): Promise { + const result: any = await Rpc.getInstance().request('Component', 'query', [options]); if (!result) return null; - if (typeof params !== 'string') { + if (typeof options !== 'string') { return DumpConverter.toComponent(result); } return result; }, - async setProperty(params: ISetPropertyOptionsInfo): Promise { - const segments = params.componentPath.split('/'); + async setProperty(options: ISetComponentPropertyOptions): Promise { + const segments = options.componentPath.split('/'); segments.pop(); const nodePath = segments.join('/'); - const compDump: any = await Rpc.getInstance().request('Component', 'query', [params.componentPath]); + const compDump: any = await Rpc.getInstance().request('Component', 'query', [options.componentPath]); if (!compDump) { - throw new Error(`Component not found: ${params.componentPath}`); + throw new Error(`Component not found: ${options.componentPath}`); } const nodeTree: any = await Rpc.getInstance().request('Node', 'queryNodeTree', [{ path: nodePath }]); @@ -52,10 +52,10 @@ export const ComponentProxy: IComponentProxy = { const compUuid = compDump.value?.uuid?.value; const compIndex = nodeTree.components.findIndex((c: any) => c.value === compUuid); if (compIndex < 0) { - throw new Error(`Component index not found: ${params.componentPath}`); + throw new Error(`Component index not found: ${options.componentPath}`); } - for (const [key, value] of Object.entries(params.properties)) { + for (const [key, value] of Object.entries(options.properties)) { const propDef = compDump.value?.[key]; if (!propDef) { throw new Error(`Property '${key}' not found on component`); @@ -64,7 +64,7 @@ export const ComponentProxy: IComponentProxy = { nodePath, path: `__comps__.${compIndex}.${key}`, dump: { ...propDef, value }, - record: params.record, + record: options.record, }] as any); } return true; diff --git a/src/core/scene/main-process/proxy/node-proxy.ts b/src/core/scene/main-process/proxy/node-proxy.ts index 4e0771b9f..8b6f89ec4 100644 --- a/src/core/scene/main-process/proxy/node-proxy.ts +++ b/src/core/scene/main-process/proxy/node-proxy.ts @@ -1,10 +1,10 @@ import { INodeTreeItem, - ICreateByNodeTypeParams, - ICreateByAssetParams, - IQueryNodeParams, - IQueryNodeTreeParams, - IDeleteNodeParams, + ICreateByNodeTypeOptions, + ICreateByAssetOptions, + IQueryNodeOptions, + IQueryNodeTreeOptions, + IDeleteNodeOptions, IDeleteNodeResult, IUpdateNodeParams, IUpdateNodeResult, @@ -15,33 +15,33 @@ import { Rpc } from '../rpc'; import { DumpConverter } from './dump-converter'; export interface INodeProxy extends Omit { - createByType(params: ICreateByNodeTypeParams): Promise; - createByAsset(params: ICreateByAssetParams): Promise; - query(params?: IQueryNodeParams): Promise; - update(params: IUpdateNodeParams): Promise; + createByType(options: ICreateByNodeTypeOptions): Promise; + createByAsset(options: ICreateByAssetOptions): Promise; + query(options?: IQueryNodeOptions): Promise; + update(options: IUpdateNodeParams): Promise; } export const NodeProxy: INodeProxy = { - async createByType(params: ICreateByNodeTypeParams): Promise { - const result: any = await Rpc.getInstance().request('Node', 'createByType', [params]); + async createByType(options: ICreateByNodeTypeOptions): Promise { + const result: any = await Rpc.getInstance().request('Node', 'createByType', [options]); return result ? DumpConverter.toNode(result, { children: true }) : null; }, - async createByAsset(params: ICreateByAssetParams): Promise { - const result: any = await Rpc.getInstance().request('Node', 'createByAsset', [params]); + async createByAsset(options: ICreateByAssetOptions): Promise { + const result: any = await Rpc.getInstance().request('Node', 'createByAsset', [options]); return result ? DumpConverter.toNode(result, { children: true }) : null; }, - delete(params: IDeleteNodeParams): Promise { - return Rpc.getInstance().request('Node', 'delete', [params]); + delete(options: IDeleteNodeOptions): Promise { + return Rpc.getInstance().request('Node', 'delete', [options]); }, - async update(params: IUpdateNodeParams): Promise { - const nodeDump: any = await Rpc.getInstance().request('Node', 'query', [{ path: params.path, queryChildren: false, queryComponent: false }]); + async update(options: IUpdateNodeParams): Promise { + const nodeDump: any = await Rpc.getInstance().request('Node', 'query', [{ path: options.path, queryChildren: false, queryComponent: false }]); if (!nodeDump) { - throw new Error(`Node not found: ${params.path}`); + throw new Error(`Node not found: ${options.path}`); } const properties: Record = {}; - if (params.properties) { - const p = params.properties; + if (options.properties) { + const p = options.properties; if (p.position) properties.position = p.position; if (p.rotation) properties.rotation = p.rotation; if (p.scale) properties.scale = p.scale; @@ -56,36 +56,36 @@ export const NodeProxy: INodeProxy = { throw new Error(`Property '${key}' not found on node`); } await (Rpc.getInstance() as any).request('Node', 'setProperty', [{ - nodePath: params.path, + nodePath: options.path, path: key, dump: { ...propDef, value }, }]); } - let currentPath = params.path; - if (params.name) { + let currentPath = options.path; + if (options.name) { const nameDef = nodeDump.name; if (!nameDef) { throw new Error('Property \'name\' not found on node'); } await (Rpc.getInstance() as any).request('Node', 'setProperty', [{ - nodePath: params.path, + nodePath: options.path, path: 'name', - dump: { ...nameDef, value: params.name }, + dump: { ...nameDef, value: options.name }, }]); const segments = currentPath.split('/'); - segments[segments.length - 1] = params.name; + segments[segments.length - 1] = options.name; currentPath = segments.join('/'); } return { path: currentPath }; }, - async query(params?: IQueryNodeParams): Promise { - const result: any = await Rpc.getInstance().request('Node', 'query', [params]); + async query(options?: IQueryNodeOptions): Promise { + const result: any = await Rpc.getInstance().request('Node', 'query', [options]); if (!result) return null; - return DumpConverter.toNode(result, { path: params?.path, fullComponents: true }); + return DumpConverter.toNode(result, { path: options?.path, fullComponents: true }); }, - queryNodeTree(params: IQueryNodeTreeParams): Promise { - return Rpc.getInstance().request('Node', 'queryNodeTree', [params]); + queryNodeTree(options: IQueryNodeTreeOptions): Promise { + return Rpc.getInstance().request('Node', 'queryNodeTree', [options]); }, }; diff --git a/src/core/scene/main-process/proxy/prefab-proxy.ts b/src/core/scene/main-process/proxy/prefab-proxy.ts index e9d23be74..18b795de2 100644 --- a/src/core/scene/main-process/proxy/prefab-proxy.ts +++ b/src/core/scene/main-process/proxy/prefab-proxy.ts @@ -9,33 +9,33 @@ import { INodeInfo } from '../../common/cli/node'; import { Rpc } from '../rpc'; import { DumpConverter } from './dump-converter'; -export interface IPrefabProxy extends Omit { - createPrefabFromNode(params: ICreatePrefabFromNodeParams): Promise; - unpackPrefabInstance(params: IUnpackPrefabInstanceParams): Promise; - getPrefabInfo(params: IGetPrefabInfoParams): Promise; +export interface IPrefabProxy extends Omit { + createFromNode(params: ICreatePrefabFromNodeParams): Promise; + unpack(params: IUnpackPrefabInstanceParams): Promise; + getInfo(params: IGetPrefabInfoParams): Promise; } export const PrefabProxy: IPrefabProxy = { - applyPrefabChanges(params: IApplyPrefabChangesParams): Promise { - return Rpc.getInstance().request('Prefab', 'applyPrefabChanges', [params]); + applyChanges(params: IApplyPrefabChangesParams): Promise { + return Rpc.getInstance().request('Prefab', 'applyChanges', [params]); }, - async createPrefabFromNode(params: ICreatePrefabFromNodeParams): Promise { - const result: any = await Rpc.getInstance().request('Prefab', 'createPrefabFromNode', [params]); + async createFromNode(params: ICreatePrefabFromNodeParams): Promise { + const result: any = await Rpc.getInstance().request('Prefab', 'createFromNode', [params]); return DumpConverter.toNode(result, { children: false }); }, - async getPrefabInfo(params: IGetPrefabInfoParams): Promise { - const result: any = await Rpc.getInstance().request('Prefab', 'getPrefabInfo', [params]); + async getInfo(params: IGetPrefabInfoParams): Promise { + const result: any = await Rpc.getInstance().request('Prefab', 'getInfo', [params]); if (!result) return null; return DumpConverter.convertPrefab(result); }, - isPrefabInstance(params: IIsPrefabInstanceParams): Promise { - return Rpc.getInstance().request('Prefab', 'isPrefabInstance', [params]); + isInstance(params: IIsPrefabInstanceParams): Promise { + return Rpc.getInstance().request('Prefab', 'isInstance', [params]); }, - revertToPrefab(params: IRevertToPrefabParams): Promise { - return Rpc.getInstance().request('Prefab', 'revertToPrefab', [params]); + revert(params: IRevertToPrefabParams): Promise { + return Rpc.getInstance().request('Prefab', 'revert', [params]); }, - async unpackPrefabInstance(params: IUnpackPrefabInstanceParams): Promise { - const result: any = await Rpc.getInstance().request('Prefab', 'unpackPrefabInstance', [params]); + async unpack(params: IUnpackPrefabInstanceParams): Promise { + const result: any = await Rpc.getInstance().request('Prefab', 'unpack', [params]); return DumpConverter.toNode(result); } -}; \ No newline at end of file +}; diff --git a/src/core/scene/main-process/proxy/script-proxy.ts b/src/core/scene/main-process/proxy/script-proxy.ts index 08cbf6943..d7e551fd3 100644 --- a/src/core/scene/main-process/proxy/script-proxy.ts +++ b/src/core/scene/main-process/proxy/script-proxy.ts @@ -2,22 +2,22 @@ import { IPublicScriptService } from '../../common'; import { Rpc } from '../rpc'; export const ScriptProxy: IPublicScriptService = { - removeScript(): Promise { - return Rpc.getInstance().request('Script', 'removeScript'); + remove(): Promise { + return Rpc.getInstance().request('Script', 'remove'); }, - scriptChange(): Promise { - return Rpc.getInstance().request('Script', 'scriptChange'); + change(): Promise { + return Rpc.getInstance().request('Script', 'change'); }, investigatePackerDriver(): Promise { return Rpc.getInstance().request('Script', 'investigatePackerDriver'); }, - loadScript(): Promise { - return Rpc.getInstance().request('Script', 'loadScript'); + load(): Promise { + return Rpc.getInstance().request('Script', 'load'); }, - queryScriptCid(uuid: string): Promise { - return Rpc.getInstance().request('Script', 'queryScriptCid', [uuid]); + queryCid(uuid: string): Promise { + return Rpc.getInstance().request('Script', 'queryCid', [uuid]); }, - queryScriptName(uuid: string): Promise { - return Rpc.getInstance().request('Script', 'queryScriptName', [uuid]); + queryName(uuid: string): Promise { + return Rpc.getInstance().request('Script', 'queryName', [uuid]); } }; diff --git a/src/core/scene/scene-process/service/asset.ts b/src/core/scene/scene-process/service/asset.ts index 66b476bba..1ef1733a0 100644 --- a/src/core/scene/scene-process/service/asset.ts +++ b/src/core/scene/scene-process/service/asset.ts @@ -10,7 +10,7 @@ export class AssetService extends BaseService implements IAssetSer * 主进程监听 asset 事件,所触发事件 * @param uuid */ - public async assetChanged(uuid: string) { + public async changed(uuid: string) { this.releaseAsset(uuid); await assetWatcherManager.onAssetChanged(uuid); this.emit('asset:change', uuid); @@ -20,7 +20,7 @@ export class AssetService extends BaseService implements IAssetSer * 主进程监听 asset 事件,所触发事件 * @param uuid */ - public async assetDeleted(uuid: string) { + public async deleted(uuid: string) { assetWatcherManager.onAssetDeleted(uuid); this.emit('asset:deleted', uuid); } diff --git a/src/core/scene/scene-process/service/component.ts b/src/core/scene/scene-process/service/component.ts index ac051c707..bb51e9cef 100644 --- a/src/core/scene/scene-process/service/component.ts +++ b/src/core/scene/scene-process/service/component.ts @@ -18,7 +18,6 @@ import compMgr from './component/index'; import componentUtils from './component/utils'; import getComponentFunctionOfNode from './component/get-component-function-of-node'; import { hasOneKindOfComponent } from './node/node-utils'; -import { isEditorNode } from './node/node-utils'; import { createShouldHideInHierarchyCanvasNode } from './node/node-create'; import PrefabService from './prefab'; @@ -124,7 +123,7 @@ export class ComponentService extends BaseService implements I let ctor = null; if (uuid) { - const cid = await Service.Script.queryScriptCid(uuid); + const cid = await Service.Script.queryCid(uuid); if (cid && cid !== 'MissingScript' && cid !== 'cc.MissingScript') { resolvedName = cid; ctor = cc.js.getClassById(cid) || cc.js.getClassByName(cid); @@ -467,58 +466,11 @@ export class ComponentService extends BaseService implements I } public init() { - this.registerCompMgrEvents(); - } - - private readonly CompMgrEventHandlers = { - ['add']: 'onCompAdd', - ['remove']: 'onCompRemove', - } as const; - private compMgrEventHandlers = new Map void>(); - /** - * 注册引擎 Node 管理相关事件的监听 - */ - registerCompMgrEvents() { - this.unregisterCompMgrEvents(); - Object.entries(this.CompMgrEventHandlers).forEach(([eventType, handlerName]) => { - const handler = (this as any)[handlerName].bind(this); - EditorExtends.Component.on(eventType, handler); - this.compMgrEventHandlers.set(eventType, handler); - }); + compMgr.init(); } unregisterCompMgrEvents() { - Object.keys(this.CompMgrEventHandlers).forEach(eventType => { - const handler = this.compMgrEventHandlers.get(eventType); - if (handler) { - EditorExtends.Component.off(eventType, handler); - this.compMgrEventHandlers.delete(eventType); - } - }); - } - - /** - * 添加到组件缓存 - * @param {String} uuid - * @param {cc.Component} component - */ - onCompAdd(uuid: string, component: Component) { - if (isEditorNode(component.node)) { - return; - } - this.emit('component:added', component); - } - - /** - * 移除组件缓存 - * @param {String} uuid - * @param {cc.Component} component - */ - onCompRemove(uuid: string, component: Component) { - if (isEditorNode(component.node)) { - return; - } - this.emit('component:removed', component); + compMgr.unregisterCompMgrEvents(); } /** diff --git a/src/core/scene/scene-process/service/component/index.ts b/src/core/scene/scene-process/service/component/index.ts index 12b5b57d3..b16f5c762 100644 --- a/src/core/scene/scene-process/service/component/index.ts +++ b/src/core/scene/scene-process/service/component/index.ts @@ -7,6 +7,7 @@ import { Component, MissingScript } from 'cc'; import { IProperty } from '../../../@types/public'; import { type IComponentEvents } from '../../../common'; import { ServiceEvents } from '../core/global-events'; +import { isEditorNode } from '../node/node-utils'; export class CompManager { protected _recycleComponent: Record = {}; @@ -20,28 +21,35 @@ export class CompManager { init() { this.registerCompMgrEvents(); } - _onCompAdded?: (uuid: string, component: Component) => void; - _onCompRemoved?: (uuid: string, component: Component) => void; + private readonly CompMgrEventHandlers = { + ['add']: 'onCompAdd', + ['remove']: 'onCompRemove', + } as const; + private compMgrEventHandlers = new Map void>(); + /** * 注册引擎Component管理相关事件的监听 */ registerCompMgrEvents() { - this._onCompAdded = this.add.bind(this); - CompMgr.on('add', this._onCompAdded); - this._onCompRemoved = this.remove.bind(this); - CompMgr.on('remove', this._onCompRemoved); + this.unregisterCompMgrEvents(); + Object.entries(this.CompMgrEventHandlers).forEach(([eventType, handlerName]) => { + const handler = (this as any)[handlerName].bind(this); + CompMgr.on(eventType, handler); + this.compMgrEventHandlers.set(eventType, handler); + }); } /** * 反注册引擎Component管理相关事件的监听 */ unregisterCompMgrEvents() { - if (this._onCompAdded) { - CompMgr.off('add', this._onCompAdded); - } - if (this._onCompRemoved) { - CompMgr.off('remove', this._onCompRemoved); - } + Object.keys(this.CompMgrEventHandlers).forEach(eventType => { + const handler = this.compMgrEventHandlers.get(eventType); + if (handler) { + CompMgr.off(eventType, handler); + this.compMgrEventHandlers.delete(eventType); + } + }); } /** @@ -56,7 +64,10 @@ export class CompManager { * @param {String} uuid * @param {cc.Component} component */ - add(uuid: string, component: Component) { + onCompAdd(uuid: string, component: Component) { + if (isEditorNode(component.node)) { + return; + } this.emit('component:added', component); } @@ -65,7 +76,10 @@ export class CompManager { * @param {String} uuid * @param {cc.Component} component */ - remove(uuid: string, component: Component) { + onCompRemove(uuid: string, component: Component) { + if (isEditorNode(component.node)) { + return; + } this.emit('component:removed', component); } diff --git a/src/core/scene/scene-process/service/node.ts b/src/core/scene/scene-process/service/node.ts index 9e273fb82..1ab84800a 100644 --- a/src/core/scene/scene-process/service/node.ts +++ b/src/core/scene/scene-process/service/node.ts @@ -1,13 +1,13 @@ import { register, BaseService, Service } from './core'; import { - type ICreateByAssetParams, - type ICreateByNodeTypeParams, - type IDeleteNodeParams, + type ICreateByAssetOptions, + type ICreateByNodeTypeOptions, + type IDeleteNodeOptions, type IDeleteNodeResult, type INode, type INodeService, - type IQueryNodeParams, - type IQueryNodeTreeParams, + type IQueryNodeOptions, + type IQueryNodeTreeOptions, type INodeTreeItem, type INodeEvents, NodeType, @@ -32,11 +32,11 @@ const NodeMgr = EditorExtends.Node; */ @register('Node') export class NodeService extends BaseService implements INodeService { - async createByType(params: ICreateByNodeTypeParams): Promise { + async createByType(options: ICreateByNodeTypeOptions): Promise { try { await Service.Editor.lock(); - let canvasNeeded = params.canvasRequired || false; - const nodeType = params.nodeType as string; + let canvasNeeded = options.canvasRequired || false; + const nodeType = options.nodeType as string; const paramsArray = NodeConfig[nodeType]; if (!paramsArray || paramsArray.length < 0) { throw new Error(`Node type '${nodeType}' is not implemented`); @@ -44,12 +44,12 @@ export class NodeService extends BaseService implements INodeServic let assetUuid = paramsArray[0].assetUuid || null; canvasNeeded = paramsArray[0].canvasRequired ? true : false; const projectType = paramsArray[0]['project-type']; - const workMode = params.workMode; + const workMode = options.workMode; if (projectType && workMode && projectType !== workMode.toLowerCase() && paramsArray.length > 1) { assetUuid = paramsArray[1]['assetUuid'] || null; canvasNeeded = paramsArray[1].canvasRequired ? true : false; } - return await this._createNode(assetUuid, canvasNeeded, params.nodeType == NodeType.EMPTY, params); + return await this._createNode(assetUuid, canvasNeeded, options.nodeType == NodeType.EMPTY, options); } catch (error) { console.error(error); throw error; @@ -58,15 +58,15 @@ export class NodeService extends BaseService implements INodeServic } } - async createByAsset(params: ICreateByAssetParams): Promise { + async createByAsset(options: ICreateByAssetOptions): Promise { try { await Service.Editor.lock(); - const assetUuid = await Rpc.getInstance().request('assetManager', 'queryUUID', [params.dbURL]); + const assetUuid = await Rpc.getInstance().request('assetManager', 'queryUUID', [options.dbURL]); if (!assetUuid) { - throw new Error(`Asset not found for dbURL: ${params.dbURL}`); + throw new Error(`Asset not found for dbURL: ${options.dbURL}`); } - const canvasNeeded = params.canvasRequired || false; - return await this._createNode(assetUuid, canvasNeeded, false, params); + const canvasNeeded = options.canvasRequired || false; + return await this._createNode(assetUuid, canvasNeeded, false, options); } catch (error) { console.error(error); throw error; @@ -75,15 +75,15 @@ export class NodeService extends BaseService implements INodeServic } } - async _createNode(assetUuid: string | null, canvasNeeded: boolean, checkUITransform: boolean, params: ICreateByNodeTypeParams | ICreateByAssetParams): Promise { + async _createNode(assetUuid: string | null, canvasNeeded: boolean, checkUITransform: boolean, options: ICreateByNodeTypeOptions | ICreateByAssetOptions): Promise { const currentScene = Service.Editor.getRootNode(); if (!currentScene) { throw new Error('Failed to create node: the scene is not opened.'); } - const workMode = params.workMode || '2d'; + const workMode = options.workMode || '2d'; // 使用增强的路径处理方法 - let parent = await this._getOrCreateNodeByPath(params.path, currentScene); + let parent = await this._getOrCreateNodeByPath(options.path, currentScene); if (!parent) { parent = currentScene; } @@ -95,7 +95,7 @@ export class NodeService extends BaseService implements INodeServic canvasRequired: canvasNeeded }); resultNode = node; - parent = await this.checkCanvasRequired(workMode.toLowerCase(), Boolean(canvasRequired), parent, params.position as Vec3) as Node; + parent = await this.checkCanvasRequired(workMode.toLowerCase(), Boolean(canvasRequired), parent, options.position as Vec3) as Node; } if (!resultNode) { resultNode = new cc.Node(); @@ -110,12 +110,12 @@ export class NodeService extends BaseService implements INodeServic * 是否要 unlink 为普通节点 * 有 nodeType 说明是内置资源创建的,需要移除 prefab info */ - if ('nodeType' in params) { + if ('nodeType' in options) { Service.Prefab.removePrefabInfoFromNode(resultNode, true); } - if (params.name) { - resultNode.name = params.name; + if (options.name) { + resultNode.name = options.name; } this.emit('node:before-add', resultNode); @@ -132,11 +132,11 @@ export class NodeService extends BaseService implements INodeServic } // Compared to the editor, the position is set via API, so local coordinates are used here. - if (params.position) { - resultNode.setPosition(params.position); + if (options.position) { + resultNode.setPosition(options.position); } - resultNode.setParent(parent, params.keepWorldTransform); + resultNode.setParent(parent, options.keepWorldTransform); // setParent 后,node的path可能会变,node的name需要同步path中对应的name const path = NodeMgr.getNodePath(resultNode); const name = path.split('/').pop(); @@ -230,7 +230,7 @@ export class NodeService extends BaseService implements INodeServic return currentParent; } - async delete(params: IDeleteNodeParams): Promise { + async delete(options: IDeleteNodeOptions): Promise { try { await Service.Editor.lock(); const root = Service.Editor.getRootNode(); @@ -238,13 +238,13 @@ export class NodeService extends BaseService implements INodeServic throw new Error('Failed to delete node: the scene is not opened.'); } - const path = params.path; + const path = options.path; const node = NodeMgr.getNodeByPath(path); if (!node) { return null; } - nodeMgr.baseRemoveNode(node, params.keepWorldTransform); + nodeMgr.baseRemoveNode(node, options.keepWorldTransform); return { path: path, @@ -257,14 +257,14 @@ export class NodeService extends BaseService implements INodeServic } } - async query(params?: IQueryNodeParams): Promise { + async query(options?: IQueryNodeOptions): Promise { try { await Service.Editor.lock(); const root = Service.Editor.getRootNode(); if (!root) { throw new Error('Failed to query node: the scene is not opened.'); } - const path = params?.path; + const path = options?.path; const node = (path && path !== '/') ? NodeMgr.getNodeByPath(path) : root; if (!node) return null; return await sceneUtils.generateNodeDump(node, { @@ -279,7 +279,7 @@ export class NodeService extends BaseService implements INodeServic } } - async queryNodeTree(params: IQueryNodeTreeParams): Promise { + async queryNodeTree(options: IQueryNodeTreeOptions): Promise { try { await Service.Editor.lock(); const root = Service.Editor.getRootNode(); @@ -323,8 +323,8 @@ export class NodeService extends BaseService implements INodeServic }; let node: Node | null = root; - if (params.path) { - node = NodeMgr.getNodeByPath(params.path); + if (options.path) { + node = NodeMgr.getNodeByPath(options.path); } if (!node) { return null; @@ -474,4 +474,3 @@ export class NodeService extends BaseService implements INodeServic return nodeMgr.getPathByUuid(uuid); } } - diff --git a/src/core/scene/scene-process/service/prefab.ts b/src/core/scene/scene-process/service/prefab.ts index fc23cca5d..f240ffcc5 100644 --- a/src/core/scene/scene-process/service/prefab.ts +++ b/src/core/scene/scene-process/service/prefab.ts @@ -16,7 +16,7 @@ import type { IRevertToPrefabParams, IUnpackPrefabInstanceParams, } from '../../common'; -import { validateCreatePrefabParams, validateNodePathParams } from './prefab/validate-params'; +import { validateCreateParams, validateNodePathParams } from './prefab/validate-params'; import { sceneUtils } from './scene/utils'; import { Rpc } from '../rpc'; @@ -31,10 +31,10 @@ export class PrefabService extends BaseService implements IPrefab /** * 将节点转换为预制体资源 */ - async createPrefabFromNode(params: ICreatePrefabFromNodeParams): Promise { + async createFromNode(params: ICreatePrefabFromNodeParams): Promise { try { - validateCreatePrefabParams(params); + validateCreateParams(params); const nodeUuid = EditorExtends.Node.getNodeUuidByPathOrThrow(params.nodePath); @@ -61,7 +61,7 @@ export class PrefabService extends BaseService implements IPrefab /** * 将节点的修改应用回预制体资源 */ - async applyPrefabChanges(params: IApplyPrefabChangesParams): Promise { + async applyChanges(params: IApplyPrefabChangesParams): Promise { try { validateNodePathParams(params); @@ -82,7 +82,7 @@ export class PrefabService extends BaseService implements IPrefab /** * 重置节点到预制体原始状态 */ - async revertToPrefab(params: IRevertToPrefabParams): Promise { + async revert(params: IRevertToPrefabParams): Promise { try { validateNodePathParams(params); const node = EditorExtends.Node.getNodeByPathOrThrow(params.nodePath); @@ -96,7 +96,7 @@ export class PrefabService extends BaseService implements IPrefab /** * 解耦预制体实例,使其成为普通节点 */ - async unpackPrefabInstance(params: IUnpackPrefabInstanceParams): Promise { + async unpack(params: IUnpackPrefabInstanceParams): Promise { try { validateNodePathParams(params); const node = EditorExtends.Node.getNodeByPathOrThrow(params.nodePath); @@ -116,7 +116,7 @@ export class PrefabService extends BaseService implements IPrefab /** * 检查节点是否为预制体实例 */ - async isPrefabInstance(params: IIsPrefabInstanceParams): Promise { + async isInstance(params: IIsPrefabInstanceParams): Promise { try { const node = EditorExtends.Node.getNodeByPathOrThrow(params.nodePath); return !!prefabUtils.getPrefab(node)?.instance; @@ -129,7 +129,7 @@ export class PrefabService extends BaseService implements IPrefab /** * 获取节点的预制体信息 */ - async getPrefabInfo(params: IGetPrefabInfoParams): Promise { + async getInfo(params: IGetPrefabInfoParams): Promise { try { const node = EditorExtends.Node.getNodeByPathOrThrow(params.nodePath); const prefabInfo = prefabUtils.getPrefab(node); @@ -317,12 +317,6 @@ export class PrefabService extends BaseService implements IPrefab } } - /** - * 将一个节点恢复到关联的 prefab 的状态 - * @param {*} nodeUuid - */ - public revert(nodeUuid: string) { } - /** * 将一个节点的修改,应用到关联的 prefab 上 * @param {*} nodeUuid diff --git a/src/core/scene/scene-process/service/prefab/validate-params.ts b/src/core/scene/scene-process/service/prefab/validate-params.ts index 1ef3f033e..ded841867 100644 --- a/src/core/scene/scene-process/service/prefab/validate-params.ts +++ b/src/core/scene/scene-process/service/prefab/validate-params.ts @@ -3,7 +3,7 @@ import type { IApplyPrefabChangesParams, ICreatePrefabFromNodeParams } from '../ const PREFAB_EXTENSION = '.prefab'; const ASSET_URL_PREFIX = 'db://'; -export function validateCreatePrefabParams(params: ICreatePrefabFromNodeParams): void { +export function validateCreateParams(params: ICreatePrefabFromNodeParams): void { if (!params?.nodePath?.trim()) { throw new Error('节点路径不能为空或纯空格'); } @@ -26,4 +26,4 @@ export function validateNodePathParams(params: IApplyPrefabChangesParams): void if (!params?.nodePath?.trim()) { throw new Error('节点路径不能为空或纯空格'); } -} \ No newline at end of file +} diff --git a/src/core/scene/scene-process/service/script.ts b/src/core/scene/scene-process/service/script.ts index 9a110e815..20a90bd37 100644 --- a/src/core/scene/scene-process/service/script.ts +++ b/src/core/scene/scene-process/service/script.ts @@ -186,7 +186,7 @@ export class ScriptService extends BaseService implements IScript * 传入一个 uuid 返回这个 uuid 对应的脚本组件名字 * @param uuid */ - async queryScriptName(uuid: string) { + async queryName(uuid: string) { const compressUuid = utils.UUID.compressUUID(uuid, false); const list = this._executor.queryClassesInModule(compressUuid); if (!list) { @@ -200,7 +200,7 @@ export class ScriptService extends BaseService implements IScript * 传入一个 uuid 返回这个 uuid 对应的脚本的 cid * @param uuid */ - async queryScriptCid(uuid: string) { + async queryCid(uuid: string) { const compressUuid = utils.UUID.compressUUID(uuid, false); const list = this._executor.queryClassesInModule(compressUuid); if (!list) { @@ -223,21 +223,21 @@ export class ScriptService extends BaseService implements IScript /** * 加载脚本时触发 */ - async loadScript() { + async load() { this._syncPluginScriptListAsync(); } /** * 删除脚本时触发 */ - async removeScript() { + async remove() { this._syncPluginScriptListAsync(); } /** * 脚本发生变化时触发 */ - async scriptChange() { + async change() { this._syncPluginScriptListAsync(); } diff --git a/src/core/scene/test/component-for-editor.testcase.ts b/src/core/scene/test/component-for-editor.testcase.ts index 6a111bda1..28333e6ed 100644 --- a/src/core/scene/test/component-for-editor.testcase.ts +++ b/src/core/scene/test/component-for-editor.testcase.ts @@ -4,8 +4,8 @@ 后续需要迁移 */ import { - type ICreateByNodeTypeParams, - type IDeleteNodeParams, + type ICreateByNodeTypeOptions, + type IDeleteNodeOptions, type IAddComponentOptions, type IQueryComponentOptions, type ISetPropertyOptions, @@ -15,7 +15,7 @@ import { type IExecuteComponentMethodOptions, NodeType, } from '../common'; -import { type ISetPropertyOptionsInfo } from '../common/cli/component'; +import { type ISetComponentPropertyOptions } from '../common/cli/component'; import { ComponentProxy } from '../main-process/proxy/component-proxy'; import { NodeProxy } from '../main-process/proxy/node-proxy'; import { EditorProxy } from '../main-process/proxy/editor-proxy'; @@ -68,7 +68,7 @@ describe('Component ForEditor 接口测试', () => { await EditorProxy.open({ urlOrUUID: SceneTestEnv.sceneURL, }); - const params: ICreateByNodeTypeParams = { + const params: ICreateByNodeTypeOptions = { path: 'TestNode', nodeType: NodeType.EMPTY, position: { x: 1, y: 2, z: 0 }, @@ -83,7 +83,7 @@ describe('Component ForEditor 接口测试', () => { afterAll(async () => { try { - const params: IDeleteNodeParams = { + const params: IDeleteNodeOptions = { path: nodePath, keepWorldTransform: false, }; @@ -142,7 +142,7 @@ describe('Component ForEditor 接口测试', () => { it('reset - 修改属性后重置应恢复默认值', async () => { // 先修改属性 - const setComponentProperty: ISetPropertyOptionsInfo = { + const setComponentProperty: ISetComponentPropertyOptions = { componentPath: componentPath, properties: { string: 'modified' }, }; diff --git a/src/core/scene/test/component-proxy.testcase.ts b/src/core/scene/test/component-proxy.testcase.ts index 79d6d8fad..ea9d50b54 100644 --- a/src/core/scene/test/component-proxy.testcase.ts +++ b/src/core/scene/test/component-proxy.testcase.ts @@ -1,7 +1,7 @@ import { - ICreateByNodeTypeParams, - IDeleteNodeParams, - IQueryNodeParams, + ICreateByNodeTypeOptions, + IDeleteNodeOptions, + IQueryNodeOptions, IAddComponentOptions, IRemoveComponentOptions, IQueryComponentOptions, @@ -10,7 +10,7 @@ import { NodeType, INodeInfo } from '../common'; -import { ISetPropertyOptionsInfo } from '../common/cli/component'; +import { ISetComponentPropertyOptions } from '../common/cli/component'; import { ComponentProxy } from '../main-process/proxy/component-proxy'; import { NodeProxy } from '../main-process/proxy/node-proxy'; import { EditorProxy } from '../main-process/proxy/editor-proxy'; @@ -30,7 +30,7 @@ describe('Component Proxy 测试', () => { // }; // const prefabNode = await NodeProxy.createNodeByAsset(params); - const params: ICreateByNodeTypeParams = { + const params: ICreateByNodeTypeOptions = { path: 'TestNode', nodeType: NodeType.EMPTY, position: { x: 1, y: 2, z: 0 }, @@ -48,7 +48,7 @@ describe('Component Proxy 测试', () => { }); afterAll(async () => { try { - const params: IDeleteNodeParams = { + const params: IDeleteNodeOptions = { path: nodePath, keepWorldTransform: false }; @@ -348,7 +348,7 @@ describe('Component Proxy 测试', () => { component: 'label' }; try { - const params: ICreateByNodeTypeParams = { + const params: ICreateByNodeTypeOptions = { path: 'TestNode', name: 'new node', nodeType: NodeType.EMPTY, @@ -386,7 +386,7 @@ describe('Component Proxy 测试', () => { path: componentPath }; try { - const setComponentProperty: ISetPropertyOptionsInfo = { + const setComponentProperty: ISetComponentPropertyOptions = { componentPath: componentPath, properties: { string: 'abc', @@ -546,7 +546,7 @@ describe('Component Proxy 测试', () => { try { expect(componentInfo?.properties['fontSize'].value).toBe(40); - const setComponentProperty: ISetPropertyOptionsInfo = { + const setComponentProperty: ISetComponentPropertyOptions = { componentPath: componentPath, properties: { fontSize: 80, @@ -563,7 +563,7 @@ describe('Component Proxy 测试', () => { }); it('setProperty - 设置组件属性 - enum类型', async () => { try { - const setComponentProperty: ISetPropertyOptionsInfo = { + const setComponentProperty: ISetComponentPropertyOptions = { componentPath: componentPath, properties: { overflow: 1 }, }; @@ -579,7 +579,7 @@ describe('Component Proxy 测试', () => { }); it('setProperty - 设置组件属性 - boolean类型', async () => { try { - const setComponentProperty: ISetPropertyOptionsInfo = { + const setComponentProperty: ISetComponentPropertyOptions = { componentPath: componentPath, properties: { enableOutline: true }, }; @@ -595,7 +595,7 @@ describe('Component Proxy 测试', () => { }); it('setProperty - 设置组件属性 - color类型', async () => { try { - const setComponentProperty: ISetPropertyOptionsInfo = { + const setComponentProperty: ISetComponentPropertyOptions = { componentPath: componentPath, properties: { outlineColor: { @@ -624,7 +624,7 @@ describe('Component Proxy 测试', () => { }); it('setProperty - 设置组件属性 - 设置枚举类型之外的值', async () => { try { - const setComponentProperty: ISetPropertyOptionsInfo = { + const setComponentProperty: ISetComponentPropertyOptions = { componentPath: componentPath, properties: { overflow: 100000 @@ -676,7 +676,7 @@ describe('Component Proxy 测试', () => { it('setProperty - 设置组件属性 - 设置SpriteFrame', async () => { try { // 对错误的值 类型 会修改失败,但是返回还是true - const setComponentProperty: ISetPropertyOptionsInfo = { + const setComponentProperty: ISetComponentPropertyOptions = { componentPath: componentPath, properties: { spriteFrame: { @@ -703,7 +703,7 @@ describe('Component Proxy 测试', () => { const actuallyExcludedTypes: string[] = []; beforeAll(async () => { - const params: IQueryNodeParams = { + const params: IQueryNodeOptions = { path: nodePath, queryChildren: false, queryComponent: true @@ -751,7 +751,7 @@ describe('Component Proxy 测试', () => { } try { - const params: IQueryNodeParams = { + const params: IQueryNodeOptions = { path: nodePath, queryChildren: false, queryComponent: true @@ -778,7 +778,7 @@ describe('Component Proxy 测试', () => { const nodes: INodeInfo[] = []; beforeAll(async () => { for (let i = 0; i < testCount; ++i) { - const params: ICreateByNodeTypeParams = { + const params: ICreateByNodeTypeOptions = { path: 'TestNode', nodeType: NodeType.EMPTY, position: { x: 1, y: 2, z: 0 }, @@ -793,7 +793,7 @@ describe('Component Proxy 测试', () => { }); afterAll(async () => { for (let i = 0; i < nodes.length; ++i) { - const params: IDeleteNodeParams = { + const params: IDeleteNodeOptions = { path: nodes[i].path, keepWorldTransform: false }; @@ -834,7 +834,7 @@ describe('Component Proxy 测试', () => { let nodeName: string = ''; let nodePath: string = ''; beforeAll(async () => { - const params: ICreateByNodeTypeParams = { + const params: ICreateByNodeTypeOptions = { path: 'TestNode', nodeType: NodeType.EMPTY, position: { x: 1, y: 2, z: 0 }, @@ -848,7 +848,7 @@ describe('Component Proxy 测试', () => { nodePath = testNode.path; }); afterAll(async () => { - const params: IDeleteNodeParams = { + const params: IDeleteNodeOptions = { path: nodePath, keepWorldTransform: false }; @@ -949,7 +949,7 @@ describe('Component Proxy 测试', () => { describe('15. setProperty - record 参数测试', () => { let componentPath = ''; beforeAll(async () => { - const queryNodeParam: IQueryNodeParams = { + const queryNodeParam: IQueryNodeOptions = { path: nodePath, queryChildren: false, queryComponent: false, @@ -987,7 +987,7 @@ describe('Component Proxy 测试', () => { describe('16. 组件命名规则测试 - 同类型组件自动添加后缀', () => { let testNodePath = ''; beforeAll(async () => { - const params: ICreateByNodeTypeParams = { + const params: ICreateByNodeTypeOptions = { path: 'TestNode', name: 'CompNamingTestNode', nodeType: NodeType.EMPTY, diff --git a/src/core/scene/test/node-for-editor.testcase.ts b/src/core/scene/test/node-for-editor.testcase.ts index f4b6cdd53..e9178d79a 100644 --- a/src/core/scene/test/node-for-editor.testcase.ts +++ b/src/core/scene/test/node-for-editor.testcase.ts @@ -4,8 +4,8 @@ 后续需要迁移 */ import { - type ICreateByNodeTypeParams, - type IQueryNodeParams, + type ICreateByNodeTypeOptions, + type IQueryNodeOptions, type INodeInfo, type INode, type ISetPropertyOptions, @@ -62,7 +62,7 @@ describe('Node ForEditor 接口测试', () => { await EditorProxy.open({ urlOrUUID: SceneTestEnv.sceneURL, }); - const params: ICreateByNodeTypeParams = { + const params: ICreateByNodeTypeOptions = { path: '/', name: testNodeName, nodeType: NodeType.EMPTY, @@ -71,7 +71,7 @@ describe('Node ForEditor 接口测试', () => { expect(testNode).toBeDefined(); // 通过 queryNode 获取节点 UUID - const queryParams: IQueryNodeParams = { + const queryParams: IQueryNodeOptions = { path: testNode!.path, queryChildren: false, queryComponent: false, diff --git a/src/core/scene/test/node-proxy.testcase.ts b/src/core/scene/test/node-proxy.testcase.ts index a3f903a76..71d4ac211 100644 --- a/src/core/scene/test/node-proxy.testcase.ts +++ b/src/core/scene/test/node-proxy.testcase.ts @@ -1,9 +1,9 @@ import { - type ICreateByAssetParams, - type ICreateByNodeTypeParams, - type IDeleteNodeParams, - type IQueryNodeParams, - type IQueryNodeTreeParams, + type ICreateByAssetOptions, + type ICreateByNodeTypeOptions, + type IDeleteNodeOptions, + type IQueryNodeOptions, + type IQueryNodeTreeOptions, type IUpdateNodeParams, type INodeInfo, NodeType, @@ -34,7 +34,7 @@ describe('Node Proxy 测试', () => { describe('1. 基础节点操作', () => { it('createByType - 创建多级父节点的节点', async () => { const multiParentPath = 'Canvas/TestNode/TestNode2/TestNode3'; - const params: ICreateByNodeTypeParams = { + const params: ICreateByNodeTypeOptions = { path: multiParentPath, name: 'TestNode', nodeType: NodeType.SPRITE, @@ -50,7 +50,7 @@ describe('Node Proxy 测试', () => { it('createByAsset - 创建带预制体的节点', async () => { - const params: ICreateByAssetParams = { + const params: ICreateByAssetOptions = { dbURL: 'db://internal/default_prefab/ui/Label.prefab', path: testNodePath, name: 'PrefabNode', @@ -63,7 +63,7 @@ describe('Node Proxy 测试', () => { }); it('createByType - 创建新节点', async () => { - const params: ICreateByNodeTypeParams = { + const params: ICreateByNodeTypeOptions = { path: testNodePath, name: 'TestNode', nodeType: NodeType.SPRITE, @@ -84,7 +84,7 @@ describe('Node Proxy 测试', () => { it('query - 查询节点基本信息', async () => { expect(createdNode).not.toBeNull(); if (createdNode) { - const params: IQueryNodeParams = { + const params: IQueryNodeOptions = { path: createdNode.path, queryChildren: false, queryComponent: true @@ -100,7 +100,7 @@ describe('Node Proxy 测试', () => { it('query - 查询节点及子节点信息', async () => { expect(createdNode).not.toBeNull(); if (createdNode) { - const params: IQueryNodeParams = { + const params: IQueryNodeOptions = { path: createdNode.path, queryChildren: true, queryComponent: false @@ -178,7 +178,7 @@ describe('Node Proxy 测试', () => { expect(result?.path).toBe(createdNode.path); // 验证更新是否生效 - const queryParams: IQueryNodeParams = { + const queryParams: IQueryNodeOptions = { path: createdNode.path, queryChildren: false, queryComponent: true @@ -203,7 +203,7 @@ describe('Node Proxy 测试', () => { expect(result).toBeDefined(); // 验证更新是否生效 - const queryParams: IQueryNodeParams = { + const queryParams: IQueryNodeOptions = { path: createdNode.path, queryChildren: false, queryComponent: true @@ -230,7 +230,7 @@ describe('Node Proxy 测试', () => { expect(result).toBeDefined(); // 验证更新是否生效 - const queryParams: IQueryNodeParams = { + const queryParams: IQueryNodeOptions = { path: createdNode.path, queryChildren: false, queryComponent: true @@ -251,7 +251,7 @@ describe('Node Proxy 测试', () => { const result = await NodeProxy.update(params); expect(result).toBeDefined(); - const queryParams: IQueryNodeParams = { + const queryParams: IQueryNodeOptions = { path: result.path, queryChildren: false, queryComponent: false, @@ -275,7 +275,7 @@ describe('Node Proxy 测试', () => { const result = await NodeProxy.update(params); expect(result).toBeDefined(); - const queryParams: IQueryNodeParams = { + const queryParams: IQueryNodeOptions = { path: createdNode.path, queryChildren: false, queryComponent: false, @@ -299,7 +299,7 @@ describe('Node Proxy 测试', () => { const result = await NodeProxy.update(params); expect(result).toBeDefined(); - const queryParams: IQueryNodeParams = { + const queryParams: IQueryNodeOptions = { path: createdNode.path, queryChildren: false, queryComponent: false, @@ -314,7 +314,7 @@ describe('Node Proxy 测试', () => { it('delete - 删除节点(不保持世界变换)', async () => { expect(createdNode).not.toBeNull(); if (createdNode) { - const params: IDeleteNodeParams = { + const params: IDeleteNodeOptions = { path: createdNode.path, keepWorldTransform: false }; @@ -324,7 +324,7 @@ describe('Node Proxy 测试', () => { expect(result?.path).toBe(createdNode.path); // 验证节点是否已被删除 - const queryParams: IQueryNodeParams = { + const queryParams: IQueryNodeOptions = { path: createdNode.path, queryChildren: false, queryComponent: true @@ -338,7 +338,7 @@ describe('Node Proxy 测试', () => { it('delete - 删除节点(保持世界变换)', async () => { // 先创建一个新节点用于删除测试 - const createParams: ICreateByNodeTypeParams = { + const createParams: ICreateByNodeTypeOptions = { path: 'NodeToDelete', name: 'NodeToDelete', nodeType: NodeType.SPHERE, @@ -349,7 +349,7 @@ describe('Node Proxy 测试', () => { expect(tempNode).toBeDefined(); // 删除该节点 - const deleteParams: IDeleteNodeParams = { + const deleteParams: IDeleteNodeOptions = { path: tempNode!.path, keepWorldTransform: true }; @@ -362,7 +362,7 @@ describe('Node Proxy 测试', () => { describe('5. 边界情况测试', () => { it('query - 查询不存在的节点应返回null', async () => { - const params: IQueryNodeParams = { + const params: IQueryNodeOptions = { path: '/NonExistentNode', queryChildren: false, queryComponent: false @@ -385,7 +385,7 @@ describe('Node Proxy 测试', () => { }); it('delete - 删除不存在的节点应返回null', async () => { - const params: IDeleteNodeParams = { + const params: IDeleteNodeOptions = { path: '/NonExistentNode', keepWorldTransform: false }; @@ -401,7 +401,7 @@ describe('Node Proxy 测试', () => { try { for (const node of allNodes) { // 删除该节点 - const deleteParams: IDeleteNodeParams = { + const deleteParams: IDeleteNodeOptions = { path: node!.path, keepWorldTransform: true }; @@ -440,7 +440,7 @@ describe('Node Proxy 测试', () => { ]; const nodeTypes = Object.values(NodeType); for (const nodeType of nodeTypes) { - const params: ICreateByNodeTypeParams = { + const params: ICreateByNodeTypeOptions = { path: '/', nodeType: nodeType, position: testPosition, @@ -509,7 +509,7 @@ describe('Node Proxy 测试', () => { describe('7. queryNodeTree - 查询节点树', () => { it('queryNodeTree - 查询整棵场景树', async () => { - const params: IQueryNodeTreeParams = {}; + const params: IQueryNodeTreeOptions = {}; const tree = await NodeProxy.queryNodeTree(params); expect(tree).toBeDefined(); expect(tree).not.toBeNull(); @@ -545,7 +545,7 @@ describe('Node Proxy 测试', () => { it('queryNodeTree - 通过 path 查询子树', async () => { // 先创建一个节点用于查询 - const createParams: ICreateByNodeTypeParams = { + const createParams: ICreateByNodeTypeOptions = { path: '/', name: 'TreeTestNode', nodeType: NodeType.EMPTY, @@ -553,7 +553,7 @@ describe('Node Proxy 测试', () => { const created = await NodeProxy.createByType(createParams); expect(created).toBeDefined(); - const params: IQueryNodeTreeParams = { path: created!.path }; + const params: IQueryNodeTreeOptions = { path: created!.path }; const subtree = await NodeProxy.queryNodeTree(params); expect(subtree).not.toBeNull(); expect(subtree!.name).toBe('TreeTestNode'); @@ -564,14 +564,14 @@ describe('Node Proxy 测试', () => { }); it('queryNodeTree - 查询不存在的路径应返回 null', async () => { - const params: IQueryNodeTreeParams = { path: '/NonExistentTreeNode' }; + const params: IQueryNodeTreeOptions = { path: '/NonExistentTreeNode' }; const result = await NodeProxy.queryNodeTree(params); expect(result).toBeNull(); }); it('queryNodeTree - 组件信息包含 type 和 extends', async () => { // 创建一个带组件的节点 - const createParams: ICreateByNodeTypeParams = { + const createParams: ICreateByNodeTypeOptions = { path: '/', name: 'CompTreeTestNode', nodeType: NodeType.SPRITE, @@ -610,7 +610,7 @@ describe('Node Proxy 测试', () => { }); it('createByType - 唯一名称不添加后缀', async () => { - const params: ICreateByNodeTypeParams = { + const params: ICreateByNodeTypeOptions = { path: parentPath, name: 'UniqueNode', nodeType: NodeType.EMPTY, @@ -623,7 +623,7 @@ describe('Node Proxy 测试', () => { }); it('createByType - 第二个同名节点添加_001后缀', async () => { - const params: ICreateByNodeTypeParams = { + const params: ICreateByNodeTypeOptions = { path: parentPath, name: 'DupNode', nodeType: NodeType.EMPTY, @@ -645,7 +645,7 @@ describe('Node Proxy 测试', () => { const totalCount = 5; const baseName = 'MultiDupNode'; for (let i = 0; i < totalCount; i++) { - const params: ICreateByNodeTypeParams = { + const params: ICreateByNodeTypeOptions = { path: parentPath, name: baseName, nodeType: NodeType.EMPTY, diff --git a/src/core/scene/test/prefab-for-editor.testcase.ts b/src/core/scene/test/prefab-for-editor.testcase.ts index 7392898b1..16a98a8bd 100644 --- a/src/core/scene/test/prefab-for-editor.testcase.ts +++ b/src/core/scene/test/prefab-for-editor.testcase.ts @@ -4,7 +4,7 @@ 后续需要迁移 */ import type { - ICreateByNodeTypeParams, + ICreateByNodeTypeOptions, ICreatePrefabFromNodeParams, IGetPrefabInfoParams, INode, @@ -91,7 +91,7 @@ describe('Prefab ForEditor 接口测试', () => { overwrite: true, }; - prefabNodeDump = await rpcPrefabRequest('createPrefabFromNode', [params]); + prefabNodeDump = await rpcPrefabRequest('createFromNode', [params]); }); it('返回有效的 INode 结构', () => { @@ -143,7 +143,7 @@ describe('Prefab ForEditor 接口测试', () => { expect(buttonNode).toBeDefined(); // 将 Button 节点转换为内部预制体 - const innerResult: any = await rpcPrefabRequest('createPrefabFromNode', [{ + const innerResult: any = await rpcPrefabRequest('createFromNode', [{ nodePath: buttonNode!.path, dbURL: innerPrefabURL, overwrite: true, @@ -167,7 +167,7 @@ describe('Prefab ForEditor 接口测试', () => { expect(nestedInstance).toBeDefined(); // 将外部节点转换为预制体(包含嵌套预制体实例) - const outerResult: any = await rpcPrefabRequest('createPrefabFromNode', [{ + const outerResult: any = await rpcPrefabRequest('createFromNode', [{ nodePath: outerNode!.path, dbURL: outerPrefabURL, overwrite: true, @@ -176,7 +176,7 @@ describe('Prefab ForEditor 接口测试', () => { outerNodePath = outerResult.path || outerResult.__path__ || outerNode!.path; // 获取外部预制体的 prefab 信息 - prefabDump = await rpcPrefabRequest('getPrefabInfo', [{ + prefabDump = await rpcPrefabRequest('getInfo', [{ nodePath: outerNodePath, } as IGetPrefabInfoParams]); }); @@ -236,7 +236,7 @@ describe('Prefab ForEditor 接口测试', () => { nodePath = testNode!.path; // 创建预制体 - const createResult: any = await rpcPrefabRequest('createPrefabFromNode', [{ + const createResult: any = await rpcPrefabRequest('createFromNode', [{ nodePath: nodePath, dbURL: prefabURL, overwrite: true, @@ -260,7 +260,7 @@ describe('Prefab ForEditor 接口测试', () => { expect(setResult).toBe(true); // 通过 getPrefabInfo 获取预制体信息(原始 dump) - const prefabDump: any = await rpcPrefabRequest('getPrefabInfo', [{ + const prefabDump: any = await rpcPrefabRequest('getInfo', [{ nodePath: nodePath, } as IGetPrefabInfoParams]); expect(prefabDump).not.toBeNull(); @@ -282,7 +282,7 @@ describe('Prefab ForEditor 接口测试', () => { it('应用修改后再修改,propertyPath 依然是 string[]', async () => { // 先应用修改 - const applyResult = await rpcPrefabRequest('applyPrefabChanges', [{ + const applyResult = await rpcPrefabRequest('applyChanges', [{ nodePath: nodePath, } as IApplyPrefabChangesParams]); expect(applyResult).toBe(true); @@ -297,7 +297,7 @@ describe('Prefab ForEditor 接口测试', () => { }); // 获取并转换 - const prefabDump: any = await rpcPrefabRequest('getPrefabInfo', [{ + const prefabDump: any = await rpcPrefabRequest('getInfo', [{ nodePath: nodePath, } as IGetPrefabInfoParams]); expect(prefabDump).not.toBeNull(); @@ -328,7 +328,7 @@ describe('Prefab ForEditor 接口测试', () => { expect(buttonNode).toBeDefined(); const innerPrefabURL = getURL('to-inner-prefab', '.prefab'); - const innerResult: any = await rpcPrefabRequest('createPrefabFromNode', [{ + const innerResult: any = await rpcPrefabRequest('createFromNode', [{ nodePath: buttonNode!.path, dbURL: innerPrefabURL, overwrite: true, @@ -352,7 +352,7 @@ describe('Prefab ForEditor 接口测试', () => { // 创建外部预制体 const outerPrefabURL = getURL('to-outer-prefab', '.prefab'); - const outerResult: any = await rpcPrefabRequest('createPrefabFromNode', [{ + const outerResult: any = await rpcPrefabRequest('createFromNode', [{ nodePath: outerNode!.path, dbURL: outerPrefabURL, overwrite: true, @@ -362,7 +362,7 @@ describe('Prefab ForEditor 接口测试', () => { const outerNodePath = outerResult.path || outerResult.__path__ || outerNode!.path; // 获取外部预制体信息 - const prefabDump: any = await rpcPrefabRequest('getPrefabInfo', [{ + const prefabDump: any = await rpcPrefabRequest('getInfo', [{ nodePath: outerNodePath, } as IGetPrefabInfoParams]); expect(prefabDump).not.toBeNull(); @@ -393,7 +393,7 @@ describe('Prefab ForEditor 接口测试', () => { expect(testNode).toBeDefined(); const prefabURL = getURL('convert-test-prefab', '.prefab'); - const createResult: any = await rpcPrefabRequest('createPrefabFromNode', [{ + const createResult: any = await rpcPrefabRequest('createFromNode', [{ nodePath: testNode!.path, dbURL: prefabURL, overwrite: true, @@ -402,7 +402,7 @@ describe('Prefab ForEditor 接口测试', () => { const nodePath = createResult.path || createResult.__path__ || testNode!.path; - const prefabDump: any = await rpcPrefabRequest('getPrefabInfo', [{ + const prefabDump: any = await rpcPrefabRequest('getInfo', [{ nodePath: nodePath, } as IGetPrefabInfoParams]); expect(prefabDump).not.toBeNull(); diff --git a/src/core/scene/test/prefab-proxy.testcase.ts b/src/core/scene/test/prefab-proxy.testcase.ts index 70bc1f613..58f7e3619 100644 --- a/src/core/scene/test/prefab-proxy.testcase.ts +++ b/src/core/scene/test/prefab-proxy.testcase.ts @@ -9,8 +9,8 @@ import type { IUnpackPrefabInstanceParams, IIsPrefabInstanceParams, IGetPrefabInfoParams, - ICreateByNodeTypeParams, - ICreateByAssetParams, + ICreateByNodeTypeOptions, + ICreateByAssetOptions, INodeInfo, IPrefabInfo, IComponentInfo @@ -78,7 +78,7 @@ describe('Prefab Proxy In Scene 测试', () => { describe('1. 预制体创建测试', () => { it('createPrefabFromNode - 创建普通节点用于转换为预制体', async () => { - const createParams: ICreateByNodeTypeParams = { + const createParams: ICreateByNodeTypeOptions = { path: '/TestPrefabNode', name: 'TestPrefabNode', nodeType: NodeType.SPRITE, @@ -100,7 +100,7 @@ describe('Prefab Proxy In Scene 测试', () => { dbURL: prefabAssetURL }; - await expect(PrefabProxy.createPrefabFromNode(invalidParams1)).rejects.toThrow(); + await expect(PrefabProxy.createFromNode(invalidParams1)).rejects.toThrow(); // 测试空资源URL const invalidParams2: ICreatePrefabFromNodeParams = { @@ -108,7 +108,7 @@ describe('Prefab Proxy In Scene 测试', () => { dbURL: '' }; - await expect(PrefabProxy.createPrefabFromNode(invalidParams2)).rejects.toThrow(); + await expect(PrefabProxy.createFromNode(invalidParams2)).rejects.toThrow(); // 测试无效的资源 URL 格式 const invalidParams3: ICreatePrefabFromNodeParams = { @@ -116,7 +116,7 @@ describe('Prefab Proxy In Scene 测试', () => { dbURL: 'invalid-url' }; - await expect(PrefabProxy.createPrefabFromNode(invalidParams3)).rejects.toThrow(); + await expect(PrefabProxy.createFromNode(invalidParams3)).rejects.toThrow(); }); it('createPrefabFromNode - 将节点转换为预制体资源', async () => { @@ -128,7 +128,7 @@ describe('Prefab Proxy In Scene 测试', () => { overwrite: true }; - testNodePrefabNode = await PrefabProxy.createPrefabFromNode(params); + testNodePrefabNode = await PrefabProxy.createFromNode(params); expect(testNodePrefabNode).toBeDefined(); expect(testNodePrefabNode?.prefab).toBeDefined(); // 最终节点名,是根据 url 的名字来的 @@ -138,7 +138,7 @@ describe('Prefab Proxy In Scene 测试', () => { describe('2. 预制体实例测试', () => { it('是否能通过 createPrefabFromNode 创建的预制体资源进程创建节点', async () => { - const createParams: ICreateByAssetParams = { + const createParams: ICreateByAssetOptions = { dbURL: prefabAssetURL, path: '', name: 'PrefabInstanceNode-CreatePrefabFromNode' @@ -158,12 +158,12 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: testNodePrefabNode.path }; - const isPrefab = await PrefabProxy.isPrefabInstance(params); + const isPrefab = await PrefabProxy.isInstance(params); expect(isPrefab).toBe(true); } // 测试普通节点 - const createParams: ICreateByNodeTypeParams = { + const createParams: ICreateByNodeTypeOptions = { path: '', name: 'TestPrefabNode-isPrefabInstance', nodeType: NodeType.SPRITE, @@ -177,7 +177,7 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: normalNode?.path as string }; - const isPrefab = await PrefabProxy.isPrefabInstance(params); + const isPrefab = await PrefabProxy.isInstance(params); expect(isPrefab).toBe(false); }); @@ -186,7 +186,7 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: '' }; - await expect(PrefabProxy.isPrefabInstance(invalidParams)).rejects.toThrow(); + await expect(PrefabProxy.isInstance(invalidParams)).rejects.toThrow(); }); @@ -197,7 +197,7 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: testNodePrefabNode.path }; - const prefabInfo: IPrefabInfo | null = await PrefabProxy.getPrefabInfo(params); + const prefabInfo: IPrefabInfo | null = await PrefabProxy.getInfo(params); expect(prefabInfo).toBeDefined(); if (prefabInfo) { expect(prefabInfo.fileId).toBeDefined(); @@ -205,7 +205,7 @@ describe('Prefab Proxy In Scene 测试', () => { } // 测试普通节点 - const createParams: ICreateByNodeTypeParams = { + const createParams: ICreateByNodeTypeOptions = { path: '', name: 'TestPrefabNode-getPrefabInfo', nodeType: NodeType.SPRITE, @@ -219,7 +219,7 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: normalNode?.path as string }; - const prefabInfo = await PrefabProxy.getPrefabInfo(params); + const prefabInfo = await PrefabProxy.getInfo(params); expect(prefabInfo).toBeNull(); }); @@ -228,7 +228,7 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: '' }; - await expect(PrefabProxy.getPrefabInfo(invalidParams)).rejects.toThrow(); + await expect(PrefabProxy.getInfo(invalidParams)).rejects.toThrow(); }); }); @@ -269,10 +269,10 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: '' }; - await expect(PrefabProxy.applyPrefabChanges(invalidParams)).rejects.toThrow(); + await expect(PrefabProxy.applyChanges(invalidParams)).rejects.toThrow(); // 测试普通节点 - const createParams: ICreateByNodeTypeParams = { + const createParams: ICreateByNodeTypeOptions = { path: '', name: 'TestPrefabNode-applyPrefabChanges', nodeType: NodeType.SPRITE, @@ -286,7 +286,7 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: normalNode.path }; - await expect(PrefabProxy.applyPrefabChanges(params)).rejects.toThrow(); + await expect(PrefabProxy.applyChanges(params)).rejects.toThrow(); } }); @@ -297,10 +297,10 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: testNodePrefabNode.path }; - const result = await PrefabProxy.applyPrefabChanges(params); + const result = await PrefabProxy.applyChanges(params); expect(result).toBe(true); - const createParams: ICreateByAssetParams = { + const createParams: ICreateByAssetOptions = { dbURL: prefabAssetURL, path: '', name: 'PrefabInstanceNode-applyPrefabChanges' @@ -328,10 +328,10 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: '' }; - await expect(PrefabProxy.revertToPrefab(invalidParams)).rejects.toThrow(); + await expect(PrefabProxy.revert(invalidParams)).rejects.toThrow(); // 测试普通节点 - const createParams: ICreateByNodeTypeParams = { + const createParams: ICreateByNodeTypeOptions = { path: '', name: 'TestPrefabNode-revertToPrefab', nodeType: NodeType.SPRITE, @@ -345,7 +345,7 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: normalNode.path }; - const done = await PrefabProxy.revertToPrefab(params); + const done = await PrefabProxy.revert(params); expect(done).toBe(false); } }); @@ -373,7 +373,7 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: path }; - const result = await PrefabProxy.revertToPrefab(params); + const result = await PrefabProxy.revert(params); expect(result).toBe(true); const node2 = await NodeProxy.query({ path: path, queryChildren: false, queryComponent: false }) as INodeInfo | null; @@ -384,7 +384,7 @@ describe('Prefab Proxy In Scene 测试', () => { it('revertToPrefab - 还原 scale 但保留 position 和 rotation overrides', async () => { // 创建新节点用于测试 const nodeName = 'PrefabRevertNode'; - const createParams: ICreateByNodeTypeParams = { + const createParams: ICreateByNodeTypeOptions = { path: '', name: nodeName, nodeType: NodeType.EMPTY, @@ -401,7 +401,7 @@ describe('Prefab Proxy In Scene 测试', () => { dbURL: revertPrefabURL, }; - const prefabNode = await PrefabProxy.createPrefabFromNode(createPrefabParams); + const prefabNode = await PrefabProxy.createFromNode(createPrefabParams); expect(prefabNode).toBeTruthy(); if (!prefabNode) return; @@ -455,7 +455,7 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: updatedPrefabNodePath, }; - const applyResult = await PrefabProxy.applyPrefabChanges(applyParams); + const applyResult = await PrefabProxy.applyChanges(applyParams); expect(applyResult).toBe(true); // 第二步:再次设置 scale 为 10(不应用) @@ -496,7 +496,7 @@ describe('Prefab Proxy In Scene 测试', () => { const queryNode = await NodeProxy.query({ path: updatedPrefabNodePath, queryChildren: false, queryComponent: false }) as INodeInfo | null; queryNode && console.log(queryNode.properties); - const revertResult = await PrefabProxy.revertToPrefab(revertParams); + const revertResult = await PrefabProxy.revert(revertParams); expect(revertResult).toBe(true); // 验证还原后的属性 @@ -523,7 +523,7 @@ describe('Prefab Proxy In Scene 测试', () => { it('revertToPrefab - 保证子节点的 path 不变', async () => { // 创建父节点 const parentNodeName = 'ParentNodeForRevert'; - const createParentParams: ICreateByNodeTypeParams = { + const createParentParams: ICreateByNodeTypeOptions = { path: '', name: parentNodeName, nodeType: NodeType.EMPTY, @@ -535,7 +535,7 @@ describe('Prefab Proxy In Scene 测试', () => { // 创建子节点 const childNodeName = 'ChildNodeForRevert'; - const createChildParams: ICreateByNodeTypeParams = { + const createChildParams: ICreateByNodeTypeOptions = { path: parentNode.path, name: childNodeName, nodeType: NodeType.EMPTY, @@ -552,7 +552,7 @@ describe('Prefab Proxy In Scene 测试', () => { dbURL: revertChildPrefabURL, }; - const prefabNode = await PrefabProxy.createPrefabFromNode(createPrefabParams); + const prefabNode = await PrefabProxy.createFromNode(createPrefabParams); expect(prefabNode).toBeTruthy(); if (!prefabNode) return; @@ -596,7 +596,7 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: prefabNodePath, }; - const revertResult = await PrefabProxy.revertToPrefab(revertParams); + const revertResult = await PrefabProxy.revert(revertParams); expect(revertResult).toBe(true); // 查询节点及其子节点,验证子节点的 path 保持不变 @@ -633,14 +633,14 @@ describe('Prefab Proxy In Scene 测试', () => { recursive: true }; - const unpackedNode: INodeInfo | null = await PrefabProxy.unpackPrefabInstance(params); + const unpackedNode: INodeInfo | null = await PrefabProxy.unpack(params); expect(unpackedNode).toBeTruthy(); if (!unpackedNode) return; expect(unpackedNode.path).toBe(testNodePrefabNode.path); // 验证解耦后不再是预制体实例 - const isPrefabAfterUnpack = await PrefabProxy.isPrefabInstance({ + const isPrefabAfterUnpack = await PrefabProxy.isInstance({ nodePath: unpackedNode.path }); expect(isPrefabAfterUnpack).toBe(false); @@ -651,13 +651,13 @@ describe('Prefab Proxy In Scene 测试', () => { const invalidParams: IUnpackPrefabInstanceParams = { nodePath: '' }; - await expect(PrefabProxy.unpackPrefabInstance(invalidParams)).rejects.toThrow(); + await expect(PrefabProxy.unpack(invalidParams)).rejects.toThrow(); }); it('unpackPrefabInstance - 非递归解耦测试', async () => { // 创建另一个预制体实例用于非递归测试 if (testNodePrefabNode) { - const createParams: ICreateByAssetParams = { + const createParams: ICreateByAssetOptions = { dbURL: prefabAssetURL, path: '/PrefabInstance2', name: 'PrefabInstanceNode2' @@ -672,7 +672,7 @@ describe('Prefab Proxy In Scene 测试', () => { recursive: false }; - const unpackedNode = await PrefabProxy.unpackPrefabInstance(params); + const unpackedNode = await PrefabProxy.unpack(params); expect(unpackedNode).toBeDefined(); } } @@ -681,7 +681,7 @@ describe('Prefab Proxy In Scene 测试', () => { it('unpackPrefabInstance - 对非预制体节点进行解包操作', async () => { // 创建普通节点(非预制体实例) const nodeName = 'NonPrefabUnpackNode'; - const createParams: ICreateByNodeTypeParams = { + const createParams: ICreateByNodeTypeOptions = { path: '', name: nodeName, nodeType: NodeType.EMPTY, @@ -697,7 +697,7 @@ describe('Prefab Proxy In Scene 测试', () => { recursive: false, }; - await expect(PrefabProxy.unpackPrefabInstance(params)).rejects.toThrow(); + await expect(PrefabProxy.unpack(params)).rejects.toThrow(); }); }); @@ -705,7 +705,7 @@ describe('Prefab Proxy In Scene 测试', () => { it('完整的预制体工作流测试', async () => { // 1. 创建节点 const nodeName = 'WorkflowNode'; - const createNodeParams: ICreateByNodeTypeParams = { + const createNodeParams: ICreateByNodeTypeOptions = { path: '', name: nodeName, nodeType: NodeType.EMPTY, @@ -726,7 +726,7 @@ describe('Prefab Proxy In Scene 测试', () => { dbURL: workflowPrefabURL, }; - const createPrefabResult = await PrefabProxy.createPrefabFromNode(createPrefabParams); + const createPrefabResult = await PrefabProxy.createFromNode(createPrefabParams); expect(createPrefabResult).toBeTruthy(); if (!createPrefabResult) return; @@ -739,7 +739,7 @@ describe('Prefab Proxy In Scene 测试', () => { overwrite: true, }; - const overwriteResult = await PrefabProxy.createPrefabFromNode(overwriteParams); + const overwriteResult = await PrefabProxy.createFromNode(overwriteParams); expect(overwriteResult).toBeTruthy(); // 4. 检查节点是否为预制体实例 @@ -747,12 +747,12 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: nodePath, }; - const isInstanceResult = await PrefabProxy.isPrefabInstance(isInstanceParams); + const isInstanceResult = await PrefabProxy.isInstance(isInstanceParams); expect(isInstanceResult).toBe(true); // 5. 检查普通节点 const anotherNodeName = 'AnotherNode'; - const anotherNodeParams: ICreateByNodeTypeParams = { + const anotherNodeParams: ICreateByNodeTypeOptions = { path: '', name: anotherNodeName, nodeType: NodeType.EMPTY, @@ -766,7 +766,7 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: anotherNode.path, }; - const isNotInstanceResult = await PrefabProxy.isPrefabInstance(isNotInstanceParams); + const isNotInstanceResult = await PrefabProxy.isInstance(isNotInstanceParams); expect(isNotInstanceResult).toBe(false); // 6. 获取预制体信息 @@ -774,7 +774,7 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: nodePath, }; - const getInfoResult = await PrefabProxy.getPrefabInfo(getInfoParams); + const getInfoResult = await PrefabProxy.getInfo(getInfoParams); expect(getInfoResult).not.toBeNull(); if (getInfoResult) { expect(typeof getInfoResult.fileId).toBe('string'); @@ -812,7 +812,7 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: nodePath, }; - const applyChangesResult = await PrefabProxy.applyPrefabChanges(applyChangesParams); + const applyChangesResult = await PrefabProxy.applyChanges(applyChangesParams); expect(applyChangesResult).toBe(true); // 9. 再次修改预制体实例 @@ -846,7 +846,7 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: nodePath, }; - const revertResult = await PrefabProxy.revertToPrefab(revertParams); + const revertResult = await PrefabProxy.revert(revertParams); expect(revertResult).toBe(true); // 验证还原后的属性 @@ -874,7 +874,7 @@ describe('Prefab Proxy In Scene 测试', () => { recursive: false, }; - const unpackResult = await PrefabProxy.unpackPrefabInstance(unpackParams); + const unpackResult = await PrefabProxy.unpack(unpackParams); expect(unpackResult).toBeDefined(); // 12. 验证不再是预制体实例 @@ -882,14 +882,14 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: nodePath, }; - const isUnpackedInstanceResult = await PrefabProxy.isPrefabInstance(isUnpackedInstanceParams); + const isUnpackedInstanceResult = await PrefabProxy.isInstance(isUnpackedInstanceParams); expect(isUnpackedInstanceResult).toBe(false); }); it('嵌套预制体操作测试', async () => { // 创建父节点 const parentNodeName = 'ParentNode'; - const parentNodeParams: ICreateByNodeTypeParams = { + const parentNodeParams: ICreateByNodeTypeOptions = { path: '', name: parentNodeName, nodeType: NodeType.EMPTY, @@ -901,7 +901,7 @@ describe('Prefab Proxy In Scene 测试', () => { // 创建子节点 const childNodeName = 'ChildNode'; - const childNodeParams: ICreateByNodeTypeParams = { + const childNodeParams: ICreateByNodeTypeOptions = { path: parentNode.path, name: childNodeName, nodeType: NodeType.EMPTY, @@ -917,7 +917,7 @@ describe('Prefab Proxy In Scene 测试', () => { dbURL: nestedPrefabURL, }; - const createPrefabResult = await PrefabProxy.createPrefabFromNode(createPrefabParams); + const createPrefabResult = await PrefabProxy.createFromNode(createPrefabParams); expect(createPrefabResult).toBeTruthy(); if (!createPrefabResult) return; @@ -926,7 +926,7 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: createPrefabResult.path, }; - const isParentInstanceResult = await PrefabProxy.isPrefabInstance(isParentInstanceParams); + const isParentInstanceResult = await PrefabProxy.isInstance(isParentInstanceParams); expect(isParentInstanceResult).toBe(true); }); }); @@ -935,19 +935,19 @@ describe('Prefab Proxy In Scene 测试', () => { it('测试不存在的节点路径', async () => { const nonExistentPath = '/NonExistentNode'; - await expect(PrefabProxy.isPrefabInstance({ nodePath: nonExistentPath })) + await expect(PrefabProxy.isInstance({ nodePath: nonExistentPath })) .rejects.toThrow(); - await expect(PrefabProxy.getPrefabInfo({ nodePath: nonExistentPath })) + await expect(PrefabProxy.getInfo({ nodePath: nonExistentPath })) .rejects.toThrow(); - await expect(PrefabProxy.applyPrefabChanges({ nodePath: nonExistentPath })) + await expect(PrefabProxy.applyChanges({ nodePath: nonExistentPath })) .rejects.toThrow(); - await expect(PrefabProxy.revertToPrefab({ nodePath: nonExistentPath })) + await expect(PrefabProxy.revert({ nodePath: nonExistentPath })) .rejects.toThrow(); - await expect(PrefabProxy.unpackPrefabInstance({ nodePath: nonExistentPath })) + await expect(PrefabProxy.unpack({ nodePath: nonExistentPath })) .rejects.toThrow(); }); @@ -966,7 +966,7 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: testNodePrefabNode?.path as string, dbURL: invalidURL }; - await expect(PrefabProxy.createPrefabFromNode(params)).rejects.toThrow(); + await expect(PrefabProxy.createFromNode(params)).rejects.toThrow(); } }); @@ -986,7 +986,7 @@ describe('Prefab Proxy In Scene 测试', () => { dbURL: duplicateURL, overwrite: false }; - const result1 = await PrefabProxy.createPrefabFromNode(params1); + const result1 = await PrefabProxy.createFromNode(params1); expect(result1).toBeTruthy(); if (!result1) return; @@ -996,20 +996,20 @@ describe('Prefab Proxy In Scene 测试', () => { dbURL: duplicateURL, overwrite: true }; - const result3 = await PrefabProxy.createPrefabFromNode(params2); + const result3 = await PrefabProxy.createFromNode(params2); expect(result3).toBeTruthy(); if (!result3) return; expect(result3.name).toBe(result1.name); // 不覆盖,成功会改名 -001 - await expect(PrefabProxy.createPrefabFromNode(params1)).rejects.toThrow(); + await expect(PrefabProxy.createFromNode(params1)).rejects.toThrow(); }); it('测试对已解包的节点进行 applyChanges 操作', async () => { // 创建节点 const nodeName = 'UnpackedNode'; - const createNodeParams: ICreateByNodeTypeParams = { + const createNodeParams: ICreateByNodeTypeOptions = { path: '', name: nodeName, nodeType: NodeType.EMPTY, @@ -1026,7 +1026,7 @@ describe('Prefab Proxy In Scene 测试', () => { dbURL: unpackedPrefabURL, }; - const prefabNode = await PrefabProxy.createPrefabFromNode(createPrefabParams); + const prefabNode = await PrefabProxy.createFromNode(createPrefabParams); expect(prefabNode).toBeTruthy(); if (!prefabNode) return; @@ -1038,7 +1038,7 @@ describe('Prefab Proxy In Scene 测试', () => { recursive: false, }; - const unpackResult = await PrefabProxy.unpackPrefabInstance(unpackParams); + const unpackResult = await PrefabProxy.unpack(unpackParams); expect(unpackResult).toBeDefined(); // 尝试对已解包的节点应用更改(应该失败) @@ -1046,13 +1046,13 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: prefabNodePath, }; - await expect(PrefabProxy.applyPrefabChanges(applyParams)).rejects.toThrow(); + await expect(PrefabProxy.applyChanges(applyParams)).rejects.toThrow(); }); it('测试多次应用和还原操作', async () => { // 创建节点 const nodeName = 'MultiOpNode'; - const createNodeParams: ICreateByNodeTypeParams = { + const createNodeParams: ICreateByNodeTypeOptions = { path: '', name: nodeName, nodeType: NodeType.EMPTY, @@ -1071,7 +1071,7 @@ describe('Prefab Proxy In Scene 测试', () => { dbURL: multiOpPrefabURL, }; - const prefabNode = await PrefabProxy.createPrefabFromNode(createPrefabParams); + const prefabNode = await PrefabProxy.createFromNode(createPrefabParams); expect(prefabNode).toBeTruthy(); if (!prefabNode) return; @@ -1095,7 +1095,7 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: prefabNodePath, }; - const applyResult = await PrefabProxy.applyPrefabChanges(applyParams); + const applyResult = await PrefabProxy.applyChanges(applyParams); expect(applyResult).toBe(true); } @@ -1112,7 +1112,7 @@ describe('Prefab Proxy In Scene 测试', () => { nodePath: prefabNodePath, }; - const revertResult = await PrefabProxy.revertToPrefab(revertParams); + const revertResult = await PrefabProxy.revert(revertParams); expect(revertResult).toBe(true); }); }); diff --git a/src/core/scene/test/script-proxy.testcase.ts b/src/core/scene/test/script-proxy.testcase.ts index 83c0189c6..7c6bb3719 100644 --- a/src/core/scene/test/script-proxy.testcase.ts +++ b/src/core/scene/test/script-proxy.testcase.ts @@ -39,18 +39,18 @@ describe('Script Proxy 测试', () => { expect(true).toBe(true); }); - it('queryScriptName', async () => { + it('queryName', async () => { let scriptName: string | null = null; if (assetInfo) { - scriptName = await ScriptProxy.queryScriptName(assetInfo.uuid); + scriptName = await ScriptProxy.queryName(assetInfo.uuid); } expect(scriptName).toBeTruthy(); }); - it('queryScriptCid', async () => { + it('queryCid', async () => { let scriptCid: string | null = null; if (assetInfo) { - scriptCid = await ScriptProxy.queryScriptCid(assetInfo.uuid); + scriptCid = await ScriptProxy.queryCid(assetInfo.uuid); } expect(scriptCid).toBeTruthy(); }); From 8a9e24008ea96fea0e824827d4c4857dfb0809e7 Mon Sep 17 00:00:00 2001 From: qgh Date: Mon, 25 May 2026 14:28:05 +0800 Subject: [PATCH 3/5] revert cocos.config.json --- tests/fixtures/projects/asset-operation/cocos.config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fixtures/projects/asset-operation/cocos.config.json b/tests/fixtures/projects/asset-operation/cocos.config.json index 2c210059c..fd502feda 100644 --- a/tests/fixtures/projects/asset-operation/cocos.config.json +++ b/tests/fixtures/projects/asset-operation/cocos.config.json @@ -1249,4 +1249,4 @@ } } } -} +} \ No newline at end of file From c2779b04f43b3b293bc3c5e30da052352ad12d1c Mon Sep 17 00:00:00 2001 From: qgh Date: Mon, 25 May 2026 14:32:05 +0800 Subject: [PATCH 4/5] update dts-snapshot.test.ts.snap --- tests/__snapshots__/dts-snapshot.test.ts.snap | 96 +++++++++---------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/tests/__snapshots__/dts-snapshot.test.ts.snap b/tests/__snapshots__/dts-snapshot.test.ts.snap index ea780a402..55b403edf 100644 --- a/tests/__snapshots__/dts-snapshot.test.ts.snap +++ b/tests/__snapshots__/dts-snapshot.test.ts.snap @@ -5268,8 +5268,8 @@ export declare interface IAssetMeta; - createByAsset(params: ICreateByAssetParams): Promise; - delete(params: IDeleteNodeParams): Promise; - query(params?: IQueryNodeParams): Promise; - queryNodeTree(params: IQueryNodeTreeParams): Promise; + createByType(params: ICreateByNodeTypeOptions): Promise; + createByAsset(params: ICreateByAssetOptions): Promise; + delete(params: IDeleteNodeOptions): Promise; + query(params?: IQueryNodeOptions): Promise; + queryNodeTree(params: IQueryNodeTreeOptions): Promise; previewSetProperty(options: ISetPropertyOptions): Promise; cancelPreviewSetProperty(options: ISetPropertyOptions): Promise; setProperty(options: ISetPropertyOptions): Promise; @@ -5593,12 +5593,12 @@ export declare interface IPrefab { instance?: IProperty; } export declare interface IPrefabService extends IServiceEvents { - createPrefabFromNode(params: ICreatePrefabFromNodeParams): Promise; - applyPrefabChanges(params: IApplyPrefabChangesParams): Promise; - revertToPrefab(params: IRevertToPrefabParams): Promise; - unpackPrefabInstance(params: IUnpackPrefabInstanceParams): Promise; - isPrefabInstance(params: IIsPrefabInstanceParams): Promise; - getPrefabInfo(params: IGetPrefabInfoParams): Promise; + createFromNode(params: ICreatePrefabFromNodeParams): Promise; + applyChanges(params: IApplyPrefabChangesParams): Promise; + revert(params: IRevertToPrefabParams): Promise; + unpack(params: IUnpackPrefabInstanceParams): Promise; + isInstance(params: IIsPrefabInstanceParams): Promise; + getInfo(params: IGetPrefabInfoParams): Promise; removePrefabInfoFromNode(node: Node_2, removeNested?: boolean): void; } export declare interface IPrefabStateInfo { @@ -5664,12 +5664,12 @@ export declare interface IQueryClassesOptions { export declare interface IQueryComponentOptions { path: string; } -export declare interface IQueryNodeParams { +export declare interface IQueryNodeOptions { path: string; queryChildren: boolean; queryComponent: boolean; } -export declare interface IQueryNodeTreeParams { +export declare interface IQueryNodeTreeOptions { path?: string; } export declare interface IRectSnapConfigData { @@ -5749,11 +5749,11 @@ export declare interface ISceneViewService { } export declare interface IScriptService extends IServiceEvents { investigatePackerDriver(): Promise; - loadScript(): Promise; - removeScript(): Promise; - scriptChange(): Promise; - queryScriptCid(uuid: string): Promise; - queryScriptName(uuid: string): Promise; + load(): Promise; + remove(): Promise; + change(): Promise; + queryCid(uuid: string): Promise; + queryName(uuid: string): Promise; isCustomComponent(classConstructor: Function): boolean; suspend(condition: Promise): void; } @@ -7141,8 +7141,8 @@ export declare interface IAssetRenameOptions extends IAssetOperationOptionsBase overwrite?: boolean; } export declare interface IAssetService extends IServiceEvents { - assetChanged(uuid: string): Promise; - assetDeleted(uuid: string): Promise; + changed(uuid: string): Promise; + deleted(uuid: string): Promise; } export declare type IAssetType = | ISupportCreateCCType @@ -7183,7 +7183,7 @@ export declare interface IBaseConfiguration extends EventEmitterMethods { remove(key: string, scope?: ConfigurationScope): Promise; save(): Promise; } -export declare interface IBaseCreateNodeParams { +export declare interface IBaseCreateNodeOptions { path: string; name?: string; workMode?: '2d' | '3d'; @@ -7307,10 +7307,10 @@ export declare interface IComponentService extends IServiceEvents { export declare interface IConfiguration { [key: string]: any; } -export declare interface ICreateByAssetParams extends IBaseCreateNodeParams { +export declare interface ICreateByAssetOptions extends IBaseCreateNodeOptions { dbURL: string; } -export declare interface ICreateByNodeTypeParams extends IBaseCreateNodeParams { +export declare interface ICreateByNodeTypeOptions extends IBaseCreateNodeOptions { nodeType: NodeType; } export declare interface ICreateMenuInfo { @@ -7356,7 +7356,7 @@ export declare type IDefaultConfig = { diyConfig: (cache: Record, flags: IFlags_2, includeModules: string[]) => void; } export declare type IDefaultConfigKeys = 'defaultConfig' | 'default2d' | 'default3d' | 'defaultNative' | 'defaultSmallGames' -export declare interface IDeleteNodeParams { +export declare interface IDeleteNodeOptions { path: string; keepWorldTransform?: boolean; } @@ -7592,11 +7592,11 @@ export declare interface INode { mountedRoot?: string; } export declare interface INodeService extends IServiceEvents { - createByType(params: ICreateByNodeTypeParams): Promise; - createByAsset(params: ICreateByAssetParams): Promise; - delete(params: IDeleteNodeParams): Promise; - query(params?: IQueryNodeParams): Promise; - queryNodeTree(params: IQueryNodeTreeParams): Promise; + createByType(params: ICreateByNodeTypeOptions): Promise; + createByAsset(params: ICreateByAssetOptions): Promise; + delete(params: IDeleteNodeOptions): Promise; + query(params?: IQueryNodeOptions): Promise; + queryNodeTree(params: IQueryNodeTreeOptions): Promise; previewSetProperty(options: ISetPropertyOptions): Promise; cancelPreviewSetProperty(options: ISetPropertyOptions): Promise; setProperty(options: ISetPropertyOptions): Promise; @@ -7681,12 +7681,12 @@ export declare interface IPrefab { instance?: IProperty; } export declare interface IPrefabService extends IServiceEvents { - createPrefabFromNode(params: ICreatePrefabFromNodeParams): Promise; - applyPrefabChanges(params: IApplyPrefabChangesParams): Promise; - revertToPrefab(params: IRevertToPrefabParams): Promise; - unpackPrefabInstance(params: IUnpackPrefabInstanceParams): Promise; - isPrefabInstance(params: IIsPrefabInstanceParams): Promise; - getPrefabInfo(params: IGetPrefabInfoParams): Promise; + createFromNode(params: ICreatePrefabFromNodeParams): Promise; + applyChanges(params: IApplyPrefabChangesParams): Promise; + revert(params: IRevertToPrefabParams): Promise; + unpack(params: IUnpackPrefabInstanceParams): Promise; + isInstance(params: IIsPrefabInstanceParams): Promise; + getInfo(params: IGetPrefabInfoParams): Promise; removePrefabInfoFromNode(node: Node_2, removeNested?: boolean): void; } export declare interface IPrefabStateInfo { @@ -7765,12 +7765,12 @@ export declare interface IQueryClassesOptions { export declare interface IQueryComponentOptions { path: string; } -export declare interface IQueryNodeParams { +export declare interface IQueryNodeOptions { path: string; queryChildren: boolean; queryComponent: boolean; } -export declare interface IQueryNodeTreeParams { +export declare interface IQueryNodeTreeOptions { path?: string; } export declare interface IRectSnapConfigData { @@ -7850,11 +7850,11 @@ export declare interface ISceneViewService { } export declare interface IScriptService extends IServiceEvents { investigatePackerDriver(): Promise; - loadScript(): Promise; - removeScript(): Promise; - scriptChange(): Promise; - queryScriptCid(uuid: string): Promise; - queryScriptName(uuid: string): Promise; + load(): Promise; + remove(): Promise; + change(): Promise; + queryCid(uuid: string): Promise; + queryName(uuid: string): Promise; isCustomComponent(classConstructor: Function): boolean; suspend(condition: Promise): void; } From 8cd3e8e805e5a6136693b4b4285122681e63ae9a Mon Sep 17 00:00:00 2001 From: qgh Date: Mon, 25 May 2026 14:56:35 +0800 Subject: [PATCH 5/5] update interface parameters --- src/core/scene/scene-process/service/node.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/scene/scene-process/service/node.ts b/src/core/scene/scene-process/service/node.ts index 1ab84800a..7bce9f48a 100644 --- a/src/core/scene/scene-process/service/node.ts +++ b/src/core/scene/scene-process/service/node.ts @@ -268,8 +268,8 @@ export class NodeService extends BaseService implements INodeServic const node = (path && path !== '/') ? NodeMgr.getNodeByPath(path) : root; if (!node) return null; return await sceneUtils.generateNodeDump(node, { - queryChildren: params?.queryChildren, - queryComponent: params?.queryComponent, + queryChildren: options?.queryChildren, + queryComponent: options?.queryComponent, }); } catch (error) { console.error(error);