161 lines
4.9 KiB
TypeScript
161 lines
4.9 KiB
TypeScript
/**
|
|
* 数据管理器
|
|
* 统一管理所有数据类
|
|
*/
|
|
import { BaseData } from "./BaseData";
|
|
import { LoginData } from "./LoginData";
|
|
import { PlayerData } from "./PlayerData";
|
|
import { AccountData } from "./AccountData";
|
|
import { MetaData } from "./MetaData";
|
|
import { NetTimeData } from "./NetTimeData";
|
|
import { ThemeData } from "./ThemeData";
|
|
import { WalletData } from "./WalletData";
|
|
import { ShopData } from "./ShopData";
|
|
import { OrderData } from "./OrderData";
|
|
import { GirlData } from "./GirlData";
|
|
import { EnvData } from "./EnvData";
|
|
import { GlobalData } from "./GlobalData";
|
|
import { AiCharacterData } from "./AiCharacterData";
|
|
import { logger } from "db://assets/Scripts/Main/Common/Logger";
|
|
|
|
/**
|
|
* 集中定义数据ID,避免写错字符串
|
|
*/
|
|
export enum DataId {
|
|
Login = "login", // 登录数据
|
|
Player = "player", // 玩家数据
|
|
Account = "account", // 账号数据
|
|
Meta = "meta", // 元数据
|
|
NetTime = "netTime", // 网络时间数据
|
|
Theme = "theme", // 主题数据
|
|
Wallet = "wallet", // 钱包数据
|
|
Shop = "shop", // 商城数据
|
|
Order = "order", // 订单数据
|
|
Girl = "girl", // 技师数据
|
|
GirlBrief = "girlBrief", // 技师的简要数据
|
|
GirlDetail = "girlDetail", // 技师的详细数据
|
|
GirlUnlock = "girlUnlock", // 技师的解锁数据
|
|
GirlChat = "girlChat", // 技师的聊天数据
|
|
GirlFavorability = "girlFavorability", // 技师的好感度数据
|
|
GirlRank = "girlRank", // 技师的排行榜数据
|
|
GirlRecommend = "girlRecommend", // 技师的推荐数据
|
|
GirlOther = "girlOther", // 技师的其他数据
|
|
Env = "env", // 环境数据
|
|
Global = "global", // 全局数据
|
|
AiCharacter = "aiCharacter", // Ai角色配置
|
|
}
|
|
|
|
/** 构造器类型 */
|
|
type DataCtor<T extends BaseData = BaseData> = new () => T;
|
|
|
|
export class DataManager {
|
|
private static _I: DataManager | null = null;
|
|
public static get I(): DataManager {
|
|
if (!DataManager._I) DataManager._I = new DataManager();
|
|
return DataManager._I;
|
|
}
|
|
|
|
// 数据实例缓存
|
|
private _dataMap: Map<string, BaseData> = new Map();
|
|
|
|
// 数据ID到构造器的映射
|
|
private _config: Map<string, DataCtor> = new Map();
|
|
|
|
private constructor() {}
|
|
|
|
/**
|
|
* 初始化:注册 数据ID → 构造器
|
|
*/
|
|
public init(): void {
|
|
logger.log("[DataManager] 数据管理器初始化");
|
|
this.registerAll();
|
|
}
|
|
|
|
/**
|
|
* 注册 数据ID → 构造器
|
|
*/
|
|
private registerAll(): void {
|
|
this.register(DataId.Login, LoginData);
|
|
this.register(DataId.Player, PlayerData);
|
|
this.register(DataId.Account, AccountData);
|
|
this.register(DataId.Meta, MetaData);
|
|
this.register(DataId.NetTime, NetTimeData);
|
|
this.register(DataId.Theme, ThemeData);
|
|
this.register(DataId.Wallet, WalletData);
|
|
this.register(DataId.Shop, ShopData);
|
|
this.register(DataId.Order, OrderData);
|
|
this.register(DataId.Girl, GirlData);
|
|
this.register(DataId.Env, EnvData);
|
|
this.register(DataId.Global, GlobalData);
|
|
this.register(DataId.AiCharacter, AiCharacterData);
|
|
}
|
|
|
|
/**
|
|
* 注册一个数据ID及其对应的构造器
|
|
*/
|
|
private register<T extends BaseData>(dataId: string, ctor: DataCtor<T>): void {
|
|
if (this._config.has(dataId)) {
|
|
logger.warn(`[DataManager] 重复注册数据ID: ${dataId},将覆盖旧构造器`);
|
|
}
|
|
this._config.set(dataId, ctor);
|
|
}
|
|
|
|
/**
|
|
* 获取数据(已存在则直接返回;否则按配置自动实例化并缓存)
|
|
*/
|
|
public getDataById<T extends BaseData = BaseData>(dataId: string): T | null {
|
|
// 先从缓存取
|
|
const cached = this._dataMap.get(dataId) as T | undefined;
|
|
if (cached) return cached;
|
|
|
|
// 缓存没有→ 查找构造器
|
|
const Ctor = this._config.get(dataId) as DataCtor<T> | undefined;
|
|
if (!Ctor) {
|
|
logger.warn(`[DataManager] 未找到 dataId 的构造器配置: ${dataId}`);
|
|
return null;
|
|
}
|
|
|
|
// 动态创建 & init & 缓存
|
|
const instance = new Ctor();
|
|
// 若你的 BaseData.init 接受 dataId,可传入
|
|
instance.init?.(dataId);
|
|
this._dataMap.set(dataId, instance);
|
|
return instance;
|
|
}
|
|
|
|
/**
|
|
* 移除数据
|
|
*/
|
|
public removeData(dataId: string): boolean {
|
|
const data = this._dataMap.get(dataId);
|
|
if (data) {
|
|
data.destroy?.();
|
|
this._dataMap.delete(dataId);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* 重置所有数据
|
|
*/
|
|
public resetAllData(): void {
|
|
this._dataMap.forEach((data) => data.reset?.());
|
|
}
|
|
|
|
/**
|
|
* 清空所有数据
|
|
*/
|
|
public clearAllData(): void {
|
|
this._dataMap.forEach((data) => data.clear?.());
|
|
}
|
|
|
|
/**
|
|
* 销毁所有数据
|
|
*/
|
|
public destroyAllData(): void {
|
|
this._dataMap.forEach((data) => data.destroy?.());
|
|
this._dataMap.clear();
|
|
}
|
|
}
|