Files
pixelheros/assets/script/game/initialize/Initialize.ts
walkpan bcef8fbc64 perf(talent): 优化天赋系统的图集预加载与缓存逻辑
将天赋图集预加载从天赋界面初始化时提前至游戏公共资源加载阶段,新增全局单例缓存机制替换组件自身的静态缓存,移除冗余的异步加载代码与未使用的导入语句,修正TalentItemComp的初始默认天赋类型为Attack
2026-05-11 16:08:20 +08:00

199 lines
7.4 KiB
TypeScript

/*
* @Author: dgflash
* @Date: 2021-11-11 17:45:23
* @LastEditors: dgflash
* @LastEditTime: 2022-08-17 12:38:59
*/
import { Node } from "cc";
import { UICallbacks } from "../../../../extensions/oops-plugin-framework/assets/core/gui/layer/Defines";
import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops";
import { AsyncQueue, NextFunction } from "../../../../extensions/oops-plugin-framework/assets/libs/collection/AsyncQueue";
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { UIID } from "../common/config/GameUIConfig";
import { LoadingViewComp } from "./view/LoadingViewComp";
import { smc } from "../common/SingletonModuleComp";
import { WxCloudApi } from "../wx_clound_client_api/WxCloudApi";
import { mLogger } from "../common/Logger";
import { gameDataSync } from "../common/GameDataSync";
/**
* 游戏进入初始化模块
* 1、热更新
* 2、加载默认资源
*/
@ecs.register(`Initialize`)
export class Initialize extends ecs.Entity {
LoadingView!: LoadingViewComp;
debugMode: boolean = false; // 是否启用调试模式
protected init() {
var queue: AsyncQueue = new AsyncQueue();
// 加载自定义资
this.loadCustom(queue);
// 加载多语言包
this.loadLanguage(queue);
// 加载公共资源
this.loadCommon(queue);
// 加载游戏内容加载进度提示界面
this.onComplete(queue);
queue.play();
}
/** 加载自定义内容(可选) */
private loadCustom(queue: AsyncQueue) {
queue.push(async (next: NextFunction, params: any, args: any) => {
try {
// 加载多语言对应字体
oops.res.load("language/font/" + oops.language.current, async () => {
// 统一的数据加载流程
await this.loadGameDataUnified();
next();
});
//加载精灵配置表
// oops.res.load("config/game/heros", next);
} catch (error) {
mLogger.error(this.debugMode, 'Initialize', "[Initialize]: 自定义内容加载失败:", error);
next(); // 即使失败也要继续,不阻塞游戏启动
}
});
}
/** 加载化语言包(可选) */
private loadLanguage(queue: AsyncQueue) {
queue.push((next: NextFunction, params: any, args: any) => {
// 设置默认语言
let lan = oops.storage.get("language");
// if (lan == null) {
if (lan == null || lan == "") {
lan = "zh";
oops.storage.set("language", lan);
}
// 设置语言包路径
oops.language.pack.json = oops.config.game.languagePathJson;
oops.language.pack.texture = oops.config.game.languagePathTexture;
// 加载语言包资源
oops.language.setLanguage(lan, next);
});
}
/** 加载公共资源(必备) */
private loadCommon(queue: AsyncQueue) {
queue.push((next: NextFunction, params: any, args: any) => {
// 顺便在这里预加载 SMC 需要的公共图集
smc.preloadCommonAssets();
oops.res.loadDir("common", next);
});
}
/**
* 统一的游戏数据加载流程
* 微信客户端:使用云端数据
* 非微信客户端:使用本地调试数据
*/
private async loadGameDataUnified() {
try {
mLogger.log(this.debugMode, 'Initialize', "[Initialize]: 开始统一数据加载流程...");
if (gameDataSync.isWxClient()) {
// 微信客户端:加载云端数据
mLogger.log(this.debugMode, 'Initialize', "[Initialize]: 检测到微信客户端,使用云端数据");
await this.loadFromCloud();
} else {
// 非微信客户端:使用本地调试数据
mLogger.log(this.debugMode, 'Initialize', "[Initialize]: 非微信客户端,使用本地调试数据");
await this.loadFromLocalDebug();
}
} catch (error) {
mLogger.log(this.debugMode, 'Initialize', "[Initialize]: 统一数据加载失败:", error);
// 失败时使用默认数据 游戏需要退出
}
}
/**
* 从云端加载数据(微信客户端)
*/
private async loadFromCloud() {
try {
// 1. 初始化微信云环境
this.initWxCloudEnv();
// 2. 登录并获取云端数据
const loginResult = await WxCloudApi.login();
const response = loginResult.result;
if (response && response.code === 200) {
mLogger.log(this.debugMode, 'Initialize', "[Initialize]: 云端登录成功");
const cloudData = response.data;
if (cloudData && cloudData.openid) {
smc.openid = cloudData.openid;
}
// 将 login 获取的 game_data 封装为统一下发格式,交给 gameDataSync 对比与合并
const formattedCloudData = {
openid: cloudData?.openid || '',
data: cloudData?.game_data || {}
};
gameDataSync.syncWithCloudData(formattedCloudData);
} else {
mLogger.log(this.debugMode, 'Initialize', "[Initialize]: 云端登录失败:", response?.msg);
// 登录失败时使用本地数据
gameDataSync.syncWithCloudData(null);
}
} catch (error) {
mLogger.log(this.debugMode, 'Initialize', "[Initialize]: 云端数据加载异常:", error);
// 异常时使用本地数据兜底
gameDataSync.syncWithCloudData(null);
}
}
/**
* 从本地调试数据加载(非微信客户端)
*/
private async loadFromLocalDebug() {
try {
// 用本地调试数据覆盖客户端数据
gameDataSync.syncWithCloudData(null);
} catch (error) {
mLogger.log(this.debugMode, 'Initialize', "[Initialize]: 本地调试数据加载异常:", error);
}
}
/**
* 初始化微信云环境
*/
private initWxCloudEnv() {
try {
// 请替换为您的实际云环境ID
const cloudEnvId = "cloud1-6gknw0qk911036d8"; // TODO: 配置您的云环境ID
WxCloudApi.init(cloudEnvId);
mLogger.log(this.debugMode, 'Initialize', "[Initialize]: 微信云环境初始化完成");
} catch (error) {
mLogger.log(this.debugMode, 'Initialize', "[Initialize]: 微信云环境初始化失败:", error);
}
}
/** 加载完成进入游戏内容加载界面 */
private onComplete(queue: AsyncQueue) {
queue.complete = () => {
var uic: UICallbacks = {
onAdded: (node: Node, params: any) => {
var comp = node.getComponent(LoadingViewComp) as ecs.Comp;
this.add(comp);
}
};
// 界面管理 - 打开游戏内容资源加载进度提示界面
oops.gui.open(UIID.Loading, null, uic);
};
}
}