diff --git a/packages/core/src/ECS/Core/ArchetypeSystem.ts b/packages/core/src/ECS/Core/ArchetypeSystem.ts index 39424591..c00ef43c 100644 --- a/packages/core/src/ECS/Core/ArchetypeSystem.ts +++ b/packages/core/src/ECS/Core/ArchetypeSystem.ts @@ -1,6 +1,6 @@ import { Entity } from '../Entity'; -import { ComponentType } from './ComponentStorage'; -import { BitMask64Data, BitMask64Utils, ComponentTypeManager } from "../Utils"; +import { ComponentType, ComponentRegistry } from './ComponentStorage'; +import { BitMask64Data, BitMask64Utils } from "../Utils"; import { BitMaskHashMap } from "../Utils/BitMaskHashMap"; /** @@ -266,10 +266,18 @@ export class ArchetypeSystem { /** * 生成原型ID + * 使用ComponentRegistry确保与Entity.componentMask使用相同的bitIndex */ private generateArchetypeId(componentTypes: ComponentType[]): ArchetypeId { - let entityBits = ComponentTypeManager.instance.getEntityBits(componentTypes); - return entityBits.getValue(); + let mask = BitMask64Utils.clone(BitMask64Utils.ZERO); + for (const type of componentTypes) { + if (!ComponentRegistry.isRegistered(type)) { + ComponentRegistry.register(type); + } + const bitMask = ComponentRegistry.getBitMask(type); + BitMask64Utils.orInPlace(mask, bitMask); + } + return mask; } /** diff --git a/packages/core/src/ECS/Core/QuerySystem.ts b/packages/core/src/ECS/Core/QuerySystem.ts index ea0c8148..ffeb8b5f 100644 --- a/packages/core/src/ECS/Core/QuerySystem.ts +++ b/packages/core/src/ECS/Core/QuerySystem.ts @@ -5,7 +5,6 @@ import { BitMask64Utils, BitMask64Data } from '../Utils/BigIntCompatibility'; import { createLogger } from '../../Utils/Logger'; import { getComponentTypeName } from '../Decorators'; import { Archetype, ArchetypeSystem } from './ArchetypeSystem'; -import { ComponentTypeManager } from "../Utils"; import { ReactiveQuery, ReactiveQueryConfig } from './ReactiveQuery'; import { QueryCondition, QueryConditionType, QueryResult } from './QueryTypes'; diff --git a/packages/core/src/ECS/Utils/ComponentTypeManager.ts b/packages/core/src/ECS/Utils/ComponentTypeManager.ts deleted file mode 100644 index 3214e53b..00000000 --- a/packages/core/src/ECS/Utils/ComponentTypeManager.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { Bits } from './Bits'; -import { getComponentTypeName } from '../Decorators'; -import { ComponentType } from "../../Types"; - -/** - * 组件类型管理器 - * 负责管理组件类型的注册和ID分配 - * 支持无限数量的组件类型(通过自动扩展 BitMask) - */ -export class ComponentTypeManager { - private static _instance: ComponentTypeManager; - private _componentTypes = new Map(); - private _typeNames = new Map(); - private _nextTypeId = 0; - - /** - * 获取单例实例 - */ - public static get instance(): ComponentTypeManager { - if (!ComponentTypeManager._instance) { - ComponentTypeManager._instance = new ComponentTypeManager(); - } - return ComponentTypeManager._instance; - } - - private constructor() {} - - /** - * 获取组件类型的ID - * @param componentType 组件类型构造函数 - * @returns 组件类型ID - */ - public getTypeId(componentType: ComponentType): number { - let typeId = this._componentTypes.get(componentType); - - if (typeId === undefined) { - typeId = this._nextTypeId++; - this._componentTypes.set(componentType, typeId); - this._typeNames.set(typeId, getComponentTypeName(componentType)); - } - - return typeId; - } - - /** - * 获取组件类型名称 - * @param typeId 组件类型ID - * @returns 组件类型名称 - */ - public getTypeName(typeId: number): string { - return this._typeNames.get(typeId) || 'Unknown'; - } - - /** - * 创建包含指定组件类型的Bits对象 - * @param componentTypes 组件类型构造函数数组 - * @returns Bits对象 - */ - public createBits(...componentTypes: ComponentType[]): Bits { - const bits = new Bits(); - - for (const componentType of componentTypes) { - const typeId = this.getTypeId(componentType); - bits.set(typeId); - } - - return bits; - } - - /** - * 获取实体的组件位掩码 - * @param components 组件数组 - * @returns Bits对象 - */ - public getEntityBits(components: ComponentType[]): Bits { - const bits = new Bits(); - - for (const component of components) { - const typeId = this.getTypeId(component); - bits.set(typeId); - } - - return bits; - } - - /** - * 重置管理器(主要用于测试) - */ - public reset(): void { - this._componentTypes.clear(); - this._typeNames.clear(); - this._nextTypeId = 0; - } - - /** - * 获取已注册的组件类型数量 - */ - public get registeredTypeCount(): number { - return this._componentTypes.size; - } -} \ No newline at end of file diff --git a/packages/core/src/ECS/Utils/index.ts b/packages/core/src/ECS/Utils/index.ts index c063b73d..3aa716b5 100644 --- a/packages/core/src/ECS/Utils/index.ts +++ b/packages/core/src/ECS/Utils/index.ts @@ -4,7 +4,6 @@ export { EntityProcessorList } from './EntityProcessorList'; export { IdentifierPool } from './IdentifierPool'; export { Matcher } from './Matcher'; export { Bits } from './Bits'; -export { ComponentTypeManager } from './ComponentTypeManager'; export { BitMask64Utils, BitMask64Data } from './BigIntCompatibility'; export { SparseSet } from './SparseSet'; export { ComponentSparseSet } from './ComponentSparseSet'; \ No newline at end of file diff --git a/packages/core/src/Utils/Debug/EntityDataCollector.ts b/packages/core/src/Utils/Debug/EntityDataCollector.ts index bfb42275..14e860ec 100644 --- a/packages/core/src/Utils/Debug/EntityDataCollector.ts +++ b/packages/core/src/Utils/Debug/EntityDataCollector.ts @@ -1,7 +1,6 @@ import { IEntityDebugData } from '../../Types'; import { Entity } from '../../ECS/Entity'; import { Component } from '../../ECS/Component'; -import { ComponentTypeManager } from '../../ECS/Utils/ComponentTypeManager'; import { getComponentInstanceTypeName, getSystemInstanceTypeName } from '../../ECS/Decorators'; import { IScene } from '../../ECS/IScene'; @@ -722,20 +721,7 @@ export class EntityDataCollector { properties: Record; }> { return components.map((component: Component) => { - let typeName = getComponentInstanceTypeName(component); - - if (!typeName || typeName === 'Object' || typeName === 'Function') { - try { - const typeManager = ComponentTypeManager.instance; - const componentType = component.constructor as any; - const typeId = typeManager.getTypeId(componentType); - typeName = typeManager.getTypeName(typeId); - } catch (error) { - typeName = 'UnknownComponent'; - } - } - - // 提取实际的组件属性 + const typeName = getComponentInstanceTypeName(component); const properties: Record = {}; try { diff --git a/packages/core/tests/ECS/Core/MinimalSystemInit.test.ts b/packages/core/tests/ECS/Core/MinimalSystemInit.test.ts index b244aa5c..e1993a44 100644 --- a/packages/core/tests/ECS/Core/MinimalSystemInit.test.ts +++ b/packages/core/tests/ECS/Core/MinimalSystemInit.test.ts @@ -3,7 +3,7 @@ import { Entity } from '../../../src/ECS/Entity'; import { Component } from '../../../src/ECS/Component'; import { EntitySystem } from '../../../src/ECS/Systems/EntitySystem'; import { Matcher } from '../../../src/ECS/Utils/Matcher'; -import { ComponentTypeManager } from '../../../src/ECS/Utils/ComponentTypeManager'; +import { ComponentRegistry } from '../../../src/ECS/Core/ComponentStorage'; // 简单的测试组件 class HealthComponent extends Component { @@ -34,7 +34,7 @@ describe('MinimalSystemInit - 最小化系统初始化测试', () => { let scene: Scene; beforeEach(() => { - ComponentTypeManager.instance.reset(); + ComponentRegistry.reset(); scene = new Scene(); }); @@ -52,7 +52,7 @@ describe('MinimalSystemInit - 最小化系统初始化测试', () => { entity.addComponent(new HealthComponent(100)); console.log('[Test] Entity created with HealthComponent'); - console.log('[Test] ComponentTypeManager registered types:', ComponentTypeManager.instance.registeredTypeCount); + console.log('[Test] ComponentRegistry registered types:', ComponentRegistry.getRegisteredCount()); // 2. 验证QuerySystem能查询到实体 const queryResult = scene.querySystem.queryAll(HealthComponent); diff --git a/packages/core/tests/ECS/Core/MultiSystemInit.test.ts b/packages/core/tests/ECS/Core/MultiSystemInit.test.ts index 9a962e12..a14e6476 100644 --- a/packages/core/tests/ECS/Core/MultiSystemInit.test.ts +++ b/packages/core/tests/ECS/Core/MultiSystemInit.test.ts @@ -3,7 +3,7 @@ import { Entity } from '../../../src/ECS/Entity'; import { Component } from '../../../src/ECS/Component'; import { EntitySystem } from '../../../src/ECS/Systems/EntitySystem'; import { Matcher } from '../../../src/ECS/Utils/Matcher'; -import { ComponentTypeManager } from '../../../src/ECS/Utils/ComponentTypeManager'; +import { ComponentRegistry } from '../../../src/ECS/Core/ComponentStorage'; // 测试组件 class PositionComponent extends Component { @@ -71,7 +71,7 @@ describe('MultiSystemInit - 多系统初始化测试', () => { let scene: Scene; beforeEach(() => { - ComponentTypeManager.instance.reset(); + ComponentRegistry.reset(); scene = new Scene(); }); @@ -91,7 +91,7 @@ describe('MultiSystemInit - 多系统初始化测试', () => { entity.addComponent(new HealthComponent(100)); console.log('[Test] Entity created with Position, Velocity, Health'); - console.log('[Test] ComponentTypeManager registered types:', ComponentTypeManager.instance.registeredTypeCount); + console.log('[Test] ComponentRegistry registered types:', ComponentRegistry.getRegisteredCount()); // 2. 验证QuerySystem能查询到实体 const movementQuery = scene.querySystem.queryAll(PositionComponent, VelocityComponent); diff --git a/packages/core/tests/ECS/Core/SystemInitialization.test.ts b/packages/core/tests/ECS/Core/SystemInitialization.test.ts index 3237ec19..6b26fd1b 100644 --- a/packages/core/tests/ECS/Core/SystemInitialization.test.ts +++ b/packages/core/tests/ECS/Core/SystemInitialization.test.ts @@ -3,7 +3,6 @@ import { Entity } from '../../../src/ECS/Entity'; import { Component } from '../../../src/ECS/Component'; import { EntitySystem } from '../../../src/ECS/Systems/EntitySystem'; import { Matcher } from '../../../src/ECS/Utils/Matcher'; -import { ComponentTypeManager } from '../../../src/ECS/Utils/ComponentTypeManager'; /** * System初始化测试套件