* refactor(arch): 移除全局变量,使用 ServiceToken 模式 - 创建 PluginServiceRegistry 类,提供类型安全的服务注册/获取 - 添加 ProfilerServiceToken 和 CollisionLayerConfigToken - 重构所有 __PROFILER_SERVICE__ 全局变量访问为 getProfilerService() - 重构 __PHYSICS_RAPIER2D__ 全局变量访问为 CollisionLayerConfigToken - 在 Core 类添加 pluginServices 静态属性 - 添加 getService.ts 辅助模块简化服务获取 这是 ServiceToken 模式重构的第一阶段,移除了最常用的两个全局变量。 后续可继续应用到其他模块(Camera/Audio 等)。 * refactor(arch): 改进 ServiceToken 设计,移除重复常量 - tokens.ts: 从 engine-core 导入 createServiceToken(符合规范) - tokens.ts: Token 使用接口 IProfilerService 而非具体类 - 移除 AssetPickerDialog 和 ContentBrowser 中重复的 MANAGED_ASSET_DIRECTORIES - 统一从 editor-core 导入 MANAGED_ASSET_DIRECTORIES * fix(type): 修复 IProfilerService 接口与实现类型不匹配 - 将 ProfilerData 等数据类型移到 tokens.ts 以避免循环依赖 - ProfilerService 显式实现 IProfilerService 接口 - 更新使用方使用 IProfilerService 接口类型而非具体类 * refactor(type): 移除类型重导出,改进类型安全 - 删除 ProfilerService.ts 中的类型重导出,消费方直接从 tokens.ts 导入 - PanelDescriptor 接口添加 titleZh 属性,移除 App.tsx 中的 as any - 改进 useDynamicIcon.ts 的类型安全,使用正确的 Record 类型 * refactor(arch): 为模块添加 ServiceToken 支持 - Material System: 创建 tokens.ts,定义 IMaterialManager 接口和 MaterialManagerToken - Audio: 创建预留 tokens.ts 文件,为未来 AudioManager 服务扩展做准备 - Camera: 创建预留 tokens.ts 文件,为未来 CameraManager 服务扩展做准备 遵循"谁定义接口,谁导出 Token"原则,统一服务访问模式
59 lines
1.9 KiB
TypeScript
59 lines
1.9 KiB
TypeScript
/**
|
|
* ProfilerService Hook
|
|
*
|
|
* 通过 ServiceToken 获取 ProfilerService 实例。
|
|
* Get ProfilerService instance via ServiceToken.
|
|
*/
|
|
|
|
import { useEffect, useState } from 'react';
|
|
import { Core } from '@esengine/ecs-framework';
|
|
import { ProfilerServiceToken, type IProfilerService } from '../services/tokens';
|
|
|
|
/**
|
|
* 获取 ProfilerService 实例的 Hook
|
|
* Hook to get ProfilerService instance
|
|
*
|
|
* 使用 ServiceToken 从 Core.pluginServices 获取服务,
|
|
* 提供类型安全的服务访问。
|
|
*
|
|
* Uses ServiceToken to get service from Core.pluginServices,
|
|
* providing type-safe service access.
|
|
*
|
|
* @returns ProfilerService 实例,如果未注册则返回 undefined
|
|
*/
|
|
export function useProfilerService(): IProfilerService | undefined {
|
|
const [service, setService] = useState<IProfilerService | undefined>(() => {
|
|
try {
|
|
return Core.pluginServices.get(ProfilerServiceToken);
|
|
} catch {
|
|
// Core 可能还没有初始化
|
|
// Core might not be initialized yet
|
|
return undefined;
|
|
}
|
|
});
|
|
|
|
useEffect(() => {
|
|
// 定期检查服务是否可用(处理服务延迟注册的情况)
|
|
// Periodically check if service is available (handles delayed service registration)
|
|
const checkService = () => {
|
|
try {
|
|
const newService = Core.pluginServices.get(ProfilerServiceToken);
|
|
if (newService !== service) {
|
|
setService(newService);
|
|
}
|
|
} catch {
|
|
// Core 可能还没有初始化
|
|
// Core might not be initialized yet
|
|
if (service !== undefined) {
|
|
setService(undefined);
|
|
}
|
|
}
|
|
};
|
|
|
|
const interval = setInterval(checkService, 1000);
|
|
return () => clearInterval(interval);
|
|
}, [service]);
|
|
|
|
return service;
|
|
}
|