import { JsonAsset } from "cc"; import { ResManager } from "@max-studio/core/res/ResManager"; import { singleton, Singleton } from "@max-studio/core/Singleton"; import LogUtils from "@max-studio/core/utils/LogUtils"; import { ConfigParseUtils } from "./ConfigParseUtils"; import { PetConfigData, parsePetConfigData } from "./PetConfigData"; /** * PetConfig配置管理器 * * ⚠️ 此文件由配置表生成器自动生成,请勿手动修改! * 如需修改,请编辑对应的Excel配置文件,然后重新生成 */ @singleton() export class PetConfigManager extends Singleton { private configList: readonly PetConfigData[] = []; private configMap = new Map(); private isLoaded = false; protected async onInit(): Promise { await this.loadConfig(); } private async loadConfig(): Promise { try { const asset = await ResManager.getInstance().loadAsset( "generated/data/PetConfig", JsonAsset, "configs", ); this.parseConfig(asset.json); this.isLoaded = true; } catch (err) { LogUtils.error( "PetConfigManager", "加载 PetConfig 配置失败:", err, ); } } private parseConfig(data: any[]): void { this.configList = Object.freeze( data.map((item) => { const config = parsePetConfigData(item); const frozenConfig = ConfigParseUtils.deepFreeze(config); return ConfigParseUtils.createReadonlyProxy( frozenConfig, "PetConfigData配置", ); }), ); this.configMap.clear(); for (const config of this.configList) { this.configMap.set(config.id, config); } // 深度冻结配置映射,防止运行时修改 ConfigParseUtils.deepFreeze(this.configMap); } public getConfig(id: number): PetConfigData | null { if (!this.isLoaded) { LogUtils.warn( "PetConfigManager", "PetConfig 配置尚未加载完成,请等待加载完成", ); return null; } return this.configMap.get(id) || null; } public getAllConfigs(): PetConfigData[] { if (!this.isLoaded) { LogUtils.warn( "PetConfigManager", "PetConfig 配置尚未加载完成,请等待加载完成", ); return []; } return [...this.configList]; } public isConfigLoaded(): boolean { return this.isLoaded; } }