Files
esengine/packages/core/src/Core.ts

693 lines
19 KiB
TypeScript
Raw Normal View History

import { TimerManager } from './Utils/Timers/TimerManager';
import { ITimer } from './Utils/Timers/ITimer';
import { Timer } from './Utils/Timers/Timer';
import { Time } from './Utils/Time';
import { PerformanceMonitor } from './Utils/PerformanceMonitor';
import { PoolManager } from './Utils/Pool/PoolManager';
import { DebugManager } from './Utils/Debug';
import { ICoreConfig, IECSDebugConfig } from './Types';
import { createLogger } from './Utils/Logger';
import { SceneManager } from './ECS/SceneManager';
import { IScene } from './ECS/IScene';
import { ServiceContainer } from './Core/ServiceContainer';
2025-10-11 09:26:36 +08:00
import { PluginManager } from './Core/PluginManager';
import { IPlugin } from './Core/Plugin';
import { WorldManager } from './ECS/WorldManager';
2025-10-13 23:17:10 +08:00
import { DebugConfigService } from './Utils/Debug/DebugConfigService';
import { createInstance } from './Core/DI/Decorators';
/**
*
*
*
* - TimerPerformancePool等
* - SceneManager
* -
* -
*
* @example
* ```typescript
* // 初始化并设置场景
* Core.create({ debug: true });
* Core.setScene(new GameScene());
*
* // 游戏循环(自动更新全局服务和场景)
* function gameLoop(deltaTime: number) {
2025-06-12 09:42:35 +08:00
* Core.update(deltaTime);
* }
*
* // 使用定时器
* Core.schedule(1.0, false, null, (timer) => {
* console.log("1秒后执行");
* });
*
* // 切换场景
* Core.loadScene(new MenuScene()); // 延迟切换
* Core.setScene(new GameScene()); // 立即切换
*
* // 获取当前场景
* const currentScene = Core.scene;
* ```
*/
export class Core {
/**
*
*
* true时
*/
public static paused = false;
/**
*
2025-10-10 21:52:43 +08:00
*
* null表示Core尚未初始化或已被销毁
*/
2025-10-10 21:52:43 +08:00
private static _instance: Core | null = null;
/**
* Core专用日志器
*/
private static _logger = createLogger('Core');
/**
*
*
* ECS实体系统功能
*/
public static entitySystemsEnabled: boolean;
/**
*
*
*
*/
public readonly debug: boolean;
/**
*
*
*
*/
private _serviceContainer: ServiceContainer;
/**
*
*
*
*/
public _timerManager: TimerManager;
2022-03-12 23:49:14 +08:00
/**
*
*
*
*/
public _performanceMonitor: PerformanceMonitor;
/**
*
*
*
*/
public _poolManager: PoolManager;
2025-06-17 00:32:16 +08:00
/**
*
*
2025-06-17 00:32:16 +08:00
*
*/
public _debugManager?: DebugManager;
2025-06-17 00:32:16 +08:00
/**
*
*
*
*/
private _sceneManager: SceneManager;
/**
* World管理器
*
* World实例
*/
private _worldManager: WorldManager;
2025-10-11 09:26:36 +08:00
/**
*
*
*
*/
private _pluginManager: PluginManager;
2025-06-17 00:32:16 +08:00
/**
* Core配置
*/
private _config: ICoreConfig;
/**
*
*
2025-06-17 00:32:16 +08:00
* @param config - Core配置对象
*/
2025-06-17 00:32:16 +08:00
private constructor(config: ICoreConfig = {}) {
Core._instance = this;
2025-06-17 00:32:16 +08:00
// 保存配置
this._config = {
debug: true,
enableEntitySystems: true,
...config
};
// 初始化服务容器
this._serviceContainer = new ServiceContainer();
// 初始化定时器管理器
this._timerManager = new TimerManager();
this._serviceContainer.registerInstance(TimerManager, this._timerManager);
// 初始化性能监控器
this._performanceMonitor = new PerformanceMonitor();
this._serviceContainer.registerInstance(PerformanceMonitor, this._performanceMonitor);
2025-06-17 00:32:16 +08:00
// 在调试模式下启用性能监控
if (this._config.debug) {
this._performanceMonitor.enable();
}
// 初始化对象池管理器
this._poolManager = new PoolManager();
this._serviceContainer.registerInstance(PoolManager, this._poolManager);
// 初始化场景管理器
this._sceneManager = new SceneManager(this._performanceMonitor);
this._serviceContainer.registerInstance(SceneManager, this._sceneManager);
2025-10-11 10:36:59 +08:00
// 设置场景切换回调,通知调试管理器
this._sceneManager.setSceneChangedCallback(() => {
if (this._debugManager) {
this._debugManager.onSceneChanged();
}
});
// 初始化World管理器
this._worldManager = new WorldManager(this._config.worldManagerConfig);
this._serviceContainer.registerInstance(WorldManager, this._worldManager);
2025-10-11 09:26:36 +08:00
// 初始化插件管理器
this._pluginManager = new PluginManager();
this._pluginManager.initialize(this, this._serviceContainer);
this._serviceContainer.registerInstance(PluginManager, this._pluginManager);
Core.entitySystemsEnabled = this._config.enableEntitySystems ?? true;
this.debug = this._config.debug ?? true;
2025-06-17 00:32:16 +08:00
// 初始化调试管理器
2025-06-17 00:32:16 +08:00
if (this._config.debugConfig?.enabled) {
2025-10-13 23:17:10 +08:00
const configService = new DebugConfigService();
configService.setConfig(this._config.debugConfig);
this._serviceContainer.registerInstance(DebugConfigService, configService);
this._serviceContainer.registerSingleton(DebugManager, (c) =>
createInstance(DebugManager, c)
2025-10-10 21:52:43 +08:00
);
2025-10-13 23:17:10 +08:00
this._debugManager = this._serviceContainer.resolve(DebugManager);
2025-06-17 00:32:16 +08:00
}
this.initialize();
}
/**
*
*
* @returns
*/
public static get Instance() {
return this._instance;
}
/**
*
*
*
*
* @returns
2025-10-10 21:52:43 +08:00
* @throws Core实例未创建
*
* @example
* ```typescript
* // 注册自定义服务
* Core.services.registerSingleton(MyService);
*
* // 解析服务
* const myService = Core.services.resolve(MyService);
* ```
*/
public static get services(): ServiceContainer {
if (!this._instance) {
throw new Error('Core实例未创建请先调用Core.create()');
}
return this._instance._serviceContainer;
}
/**
* World管理器
*
* World实例
*
* @returns WorldManager实例
* @throws Core实例未创建
*
* @example
* ```typescript
* // 创建多个游戏房间
* const wm = Core.worldManager;
* const room1 = wm.createWorld('room_001');
* room1.createScene('game', new GameScene());
* room1.start();
* ```
*/
public static get worldManager(): WorldManager {
if (!this._instance) {
throw new Error('Core实例未创建请先调用Core.create()');
}
return this._instance._worldManager;
}
/**
* Core实例
*
*
*
* @param config - Core配置boolean表示debug模式
* @returns Core实例
*
* @example
* ```typescript
* // 方式1使用配置对象
* Core.create({
* debug: true,
* enableEntitySystems: true,
* debugConfig: {
* enabled: true,
* websocketUrl: 'ws://localhost:9229'
* }
* });
*
* // 方式2简单模式向后兼容
* Core.create(true); // debug = true
* ```
*/
public static create(config: ICoreConfig | boolean = true): Core {
if (this._instance == null) {
// 向后兼容如果传入boolean转换为配置对象
const coreConfig: ICoreConfig = typeof config === 'boolean'
? { debug: config, enableEntitySystems: true }
: config;
this._instance = new Core(coreConfig);
} else {
this._logger.warn('Core实例已创建返回现有实例');
}
return this._instance;
}
/**
*
*
* @param scene -
* @returns
*
* @example
* ```typescript
* Core.create({ debug: true });
*
* // 创建并设置场景
* const gameScene = new GameScene();
* Core.setScene(gameScene);
* ```
*/
public static setScene<T extends IScene>(scene: T): T {
if (!this._instance) {
Core._logger.warn('Core实例未创建请先调用Core.create()');
throw new Error('Core实例未创建');
}
return this._instance._sceneManager.setScene(scene);
}
2025-08-12 09:39:07 +08:00
/**
*
*
* @returns null
2025-08-12 09:39:07 +08:00
*/
public static get scene(): IScene | null {
if (!this._instance) {
return null;
}
return this._instance._sceneManager.currentScene;
}
/**
* ECS流式API
*
* @returns ECS API实例null
*
* @example
* ```typescript
* // 使用流式API创建实体
* const player = Core.ecsAPI?.createEntity('Player')
* .addComponent(Position, 100, 100)
* .addComponent(Velocity, 50, 0);
*
* // 查询实体
* const enemies = Core.ecsAPI?.query(Enemy, Transform);
*
* // 发射事件
* Core.ecsAPI?.emit('game:start', { level: 1 });
* ```
*/
public static get ecsAPI() {
if (!this._instance) {
return null;
2025-08-12 09:39:07 +08:00
}
return this._instance._sceneManager.api;
2025-08-12 09:39:07 +08:00
}
/**
*
*
* @param scene -
*
* @example
* ```typescript
* // 延迟切换场景(在下一帧生效)
* Core.loadScene(new MenuScene());
* ```
*/
public static loadScene<T extends IScene>(scene: T): void {
if (!this._instance) {
Core._logger.warn('Core实例未创建请先调用Core.create()');
return;
}
this._instance._sceneManager.loadScene(scene);
}
2025-06-12 09:42:35 +08:00
/**
*
*
2025-06-12 09:42:35 +08:00
*
*
*
2025-06-12 09:42:35 +08:00
* @param deltaTime -
*
2025-06-12 09:42:35 +08:00
* @example
* ```typescript
* // 初始化
* Core.create({ debug: true });
* Core.setScene(new GameScene());
*
* // Laya引擎集成
2025-06-12 09:42:35 +08:00
* Laya.timer.frameLoop(1, this, () => {
* const deltaTime = Laya.timer.delta / 1000;
* Core.update(deltaTime); // 自动更新全局服务和场景
2025-06-12 09:42:35 +08:00
* });
*
* // Cocos Creator集成
2025-06-12 09:42:35 +08:00
* update(deltaTime: number) {
* Core.update(deltaTime); // 自动更新全局服务和场景
2025-06-12 09:42:35 +08:00
* }
* ```
*/
public static update(deltaTime: number): void {
if (!this._instance) {
Core._logger.warn('Core实例未创建请先调用Core.create()');
2025-06-12 09:42:35 +08:00
return;
}
2025-06-12 09:42:35 +08:00
this._instance.updateInternal(deltaTime);
}
/**
*
*
*
*
* @param timeInSeconds -
* @param repeats - false
* @param context - null
* @param onTime -
* @returns
2025-10-10 21:52:43 +08:00
* @throws Core实例未创建或onTime回调未提供
*
* @example
* ```typescript
* // 一次性定时器
* Core.schedule(1.0, false, null, (timer) => {
* console.log("1秒后执行一次");
* });
*
* // 重复定时器
* Core.schedule(0.5, true, null, (timer) => {
* console.log("每0.5秒执行一次");
* });
* ```
*/
2025-08-12 09:39:07 +08:00
public static schedule<TContext = unknown>(timeInSeconds: number, repeats: boolean = false, context?: TContext, onTime?: (timer: ITimer<TContext>) => void): Timer<TContext> {
2025-10-10 21:52:43 +08:00
if (!this._instance) {
throw new Error('Core实例未创建请先调用Core.create()');
}
2025-08-12 09:39:07 +08:00
if (!onTime) {
throw new Error('onTime callback is required');
}
return this._instance._timerManager.schedule(timeInSeconds, repeats, context as TContext, onTime);
}
2025-06-17 00:32:16 +08:00
/**
*
*
2025-06-17 00:32:16 +08:00
* @param config
*/
public static enableDebug(config: IECSDebugConfig): void {
if (!this._instance) {
Core._logger.warn('Core实例未创建请先调用Core.create()');
2025-06-17 00:32:16 +08:00
return;
}
if (this._instance._debugManager) {
this._instance._debugManager.updateConfig(config);
2025-06-17 00:32:16 +08:00
} else {
2025-10-13 23:17:10 +08:00
const configService = new DebugConfigService();
configService.setConfig(config);
this._instance._serviceContainer.registerInstance(DebugConfigService, configService);
this._instance._serviceContainer.registerSingleton(DebugManager, (c) =>
createInstance(DebugManager, c)
2025-10-10 21:52:43 +08:00
);
2025-10-13 23:17:10 +08:00
this._instance._debugManager = this._instance._serviceContainer.resolve(DebugManager);
2025-06-17 00:32:16 +08:00
}
// 更新Core配置
this._instance._config.debugConfig = config;
}
/**
*
*/
public static disableDebug(): void {
if (!this._instance) return;
if (this._instance._debugManager) {
this._instance._debugManager.stop();
delete this._instance._debugManager;
2025-06-17 00:32:16 +08:00
}
// 更新Core配置
if (this._instance._config.debugConfig) {
this._instance._config.debugConfig.enabled = false;
}
}
/**
*
*
2025-06-17 00:32:16 +08:00
* @returns null
*/
2025-08-12 09:39:07 +08:00
public static getDebugData(): unknown {
if (!this._instance?._debugManager) {
2025-06-17 00:32:16 +08:00
return null;
}
return this._instance._debugManager.getDebugData();
2025-06-17 00:32:16 +08:00
}
/**
*
*
2025-06-17 00:32:16 +08:00
* @returns
*/
public static get isDebugEnabled(): boolean {
return this._instance?._config.debugConfig?.enabled || false;
}
2025-10-11 09:26:36 +08:00
/**
*
*
* @param plugin -
* @throws Core实例未创建或插件安装失败
*
* @example
* ```typescript
* Core.create({ debug: true });
*
* // 安装插件
* await Core.installPlugin(new MyPlugin());
* ```
*/
public static async installPlugin(plugin: IPlugin): Promise<void> {
if (!this._instance) {
throw new Error('Core实例未创建请先调用Core.create()');
}
await this._instance._pluginManager.install(plugin);
}
/**
*
*
* @param name -
* @throws Core实例未创建或插件卸载失败
*
* @example
* ```typescript
* await Core.uninstallPlugin('my-plugin');
* ```
*/
public static async uninstallPlugin(name: string): Promise<void> {
if (!this._instance) {
throw new Error('Core实例未创建请先调用Core.create()');
}
await this._instance._pluginManager.uninstall(name);
}
/**
*
*
* @param name -
* @returns undefined
*
* @example
* ```typescript
* const myPlugin = Core.getPlugin('my-plugin');
* if (myPlugin) {
* console.log(myPlugin.version);
* }
* ```
*/
public static getPlugin(name: string): IPlugin | undefined {
if (!this._instance) {
return undefined;
}
return this._instance._pluginManager.getPlugin(name);
}
/**
*
*
* @param name -
* @returns
*
* @example
* ```typescript
* if (Core.isPluginInstalled('my-plugin')) {
* console.log('Plugin is installed');
* }
* ```
*/
public static isPluginInstalled(name: string): boolean {
if (!this._instance) {
return false;
}
return this._instance._pluginManager.isInstalled(name);
}
/**
*
*
*
*/
protected initialize() {
// 核心系统初始化
Core._logger.info('Core initialized', {
debug: this.debug,
entitySystemsEnabled: Core.entitySystemsEnabled,
debugEnabled: this._config.debugConfig?.enabled || false
});
}
/**
2025-06-12 09:42:35 +08:00
*
*
2025-06-12 09:42:35 +08:00
* @param deltaTime -
*/
2025-06-12 09:42:35 +08:00
private updateInternal(deltaTime: number): void {
if (Core.paused) return;
// 开始性能监控
const frameStartTime = this._performanceMonitor.startMonitoring('Core.update');
2025-06-12 09:42:35 +08:00
// 更新时间系统
Time.update(deltaTime);
2021-04-20 15:46:18 +08:00
// 更新FPS监控如果性能监控器支持
2025-08-12 09:39:07 +08:00
if ('updateFPS' in this._performanceMonitor && typeof this._performanceMonitor.updateFPS === 'function') {
this._performanceMonitor.updateFPS(Time.deltaTime);
}
2023-03-14 14:03:41 +08:00
// 更新所有可更新的服务
2025-10-10 21:52:43 +08:00
const servicesStartTime = this._performanceMonitor.startMonitoring('Services.update');
this._serviceContainer.updateAll(deltaTime);
this._performanceMonitor.endMonitoring('Services.update', servicesStartTime, this._serviceContainer.getUpdatableCount());
// 更新对象池管理器
this._poolManager.update();
// 更新默认场景(通过 SceneManager
this._sceneManager.update();
// 更新额外的 WorldManager
this._worldManager.updateAll();
// 结束性能监控
this._performanceMonitor.endMonitoring('Core.update', frameStartTime);
}
/**
* Core实例
*
*
*/
public static destroy(): void {
if (!this._instance) return;
// 停止调试管理器
if (this._instance._debugManager) {
this._instance._debugManager.stop();
}
2025-10-10 21:52:43 +08:00
// 清理所有服务
this._instance._serviceContainer.clear();
Core._logger.info('Core destroyed');
2025-10-10 21:52:43 +08:00
// 清空实例引用允许重新创建Core实例
this._instance = null;
}
}