Files
rougelike-demo/client/assets/scripts/Framework/ResMgr/ResMgrExample.ts

292 lines
7.7 KiB
TypeScript
Raw Normal View History

2025-12-14 22:40:00 +08:00
import { ResMgr } from "./ResMgr";
import { ResPath } from "./ResConfig";
import { Prefab, SpriteFrame, AudioClip, instantiate, Node } from 'cc';
/**
* ResMgr 使
*/
// ========== 示例1: 加载单个资源 ==========
/**
* UI预制体
*/
export async function loadUIPrefab(): Promise<void> {
try {
console.log("========== 加载UI预制体 ==========");
// 加载预制体
const prefab = await ResMgr.getInstance().load(
'resources',
'prefabs/ui/LoginUI',
Prefab
);
console.log("预制体加载成功:", prefab.name);
// 实例化预制体
const node = instantiate(prefab);
console.log("预制体实例化成功");
} catch (error) {
console.error("加载UI预制体失败:", error);
}
}
/**
*
*/
export async function loadSprite(): Promise<void> {
try {
console.log("========== 加载图片资源 ==========");
// 加载精灵帧
const spriteFrame = await ResMgr.getInstance().load(
'resources',
'textures/ui/icon_player',
SpriteFrame
);
console.log("图片加载成功:", spriteFrame.name);
} catch (error) {
console.error("加载图片失败:", error);
}
}
/**
*
*/
export async function loadAudio(): Promise<void> {
try {
console.log("========== 加载音频资源 ==========");
// 加载音频片段
const audioClip = await ResMgr.getInstance().load(
'resources',
'audio/music/bg_music',
AudioClip
);
console.log("音频加载成功:", audioClip.name);
} catch (error) {
console.error("加载音频失败:", error);
}
}
// ========== 示例2: 预加载资源 ==========
/**
*
*/
export async function preloadLevel(): Promise<void> {
try {
console.log("========== 预加载关卡资源 ==========");
// 预加载多个资源
const resources = [
'prefabs/enemy/Enemy1',
'prefabs/enemy/Enemy2',
'prefabs/effect/Explosion'
];
for (const path of resources) {
await ResMgr.getInstance().preload(
'resources',
path,
Prefab,
(finished, total) => {
const progress = (finished / total * 100).toFixed(0);
console.log(`预加载 ${path}: ${progress}%`);
}
);
}
console.log("关卡资源预加载完成");
} catch (error) {
console.error("预加载失败:", error);
}
}
// ========== 示例3: 加载目录 ==========
/**
* UI图标
*/
export async function loadAllUIIcons(): Promise<void> {
try {
console.log("========== 加载UI图标目录 ==========");
// 加载整个目录
const sprites = await ResMgr.getInstance().loadDir(
'resources',
ResPath.UI_TEXTURE + '/icons',
SpriteFrame
);
console.log(`加载了 ${sprites.length} 个UI图标`);
// 遍历所有图标
sprites.forEach((sprite, index) => {
console.log(`图标 ${index + 1}: ${sprite.name}`);
});
} catch (error) {
console.error("加载目录失败:", error);
}
}
// ========== 示例4: 资源释放 ==========
/**
*
*/
export function releaseUnusedResources(): void {
console.log("========== 释放资源 ==========");
// 释放单个资源
ResMgr.getInstance().release('resources', 'prefabs/ui/LoginUI');
// 释放目录资源
ResMgr.getInstance().releaseDir('resources', 'textures/ui/icons');
console.log("资源释放完成");
}
// ========== 示例5: 完整的资源管理流程 ==========
/**
*
*/
export class GameSceneResourceManager {
private loadedPrefabs: Map<string, Prefab> = new Map();
/**
* -
*/
async onEnterScene(): Promise<void> {
console.log("========== 进入游戏场景 ==========");
try {
// 1. 预加载场景资源
await this.preloadSceneResources();
// 2. 加载玩家预制体
const playerPrefab = await ResMgr.getInstance().load(
'resources',
'prefabs/actor/Player',
Prefab
);
this.loadedPrefabs.set('Player', playerPrefab);
// 3. 加载敌人预制体
const enemies = await ResMgr.getInstance().loadDir(
'resources',
'prefabs/enemy',
Prefab
);
enemies.forEach(prefab => {
this.loadedPrefabs.set(prefab.name, prefab);
});
console.log("场景资源加载完成");
} catch (error) {
console.error("场景资源加载失败:", error);
}
}
/**
*
*/
private async preloadSceneResources(): Promise<void> {
// 预加载特效预制体
const effectResources = [
'prefabs/effect/Hit',
'prefabs/effect/Explosion'
];
for (const path of effectResources) {
await ResMgr.getInstance().preload(
'resources',
path,
Prefab
);
}
// 预加载音频
const audioResources = [
'audio/effect/hit',
'audio/effect/explosion'
];
for (const path of audioResources) {
await ResMgr.getInstance().preload(
'resources',
path,
AudioClip
);
}
}
/**
*
*/
getPrefab(name: string): Prefab | undefined {
return this.loadedPrefabs.get(name);
}
/**
* -
*/
onLeaveScene(): void {
console.log("========== 离开游戏场景 ==========");
// 清空预制体缓存
this.loadedPrefabs.clear();
// 释放场景相关资源
ResMgr.getInstance().releaseDir('resources', 'prefabs/actor');
ResMgr.getInstance().releaseDir('resources', 'prefabs/enemy');
ResMgr.getInstance().releaseDir('resources', 'prefabs/effect');
console.log("场景资源释放完成");
console.log(`缓存大小: ${ResMgr.getInstance().getCacheSize()}`);
}
}
// ========== 测试函数 ==========
/**
*
*/
export async function testResMgr(): Promise<void> {
console.log("========================================");
console.log(" 开始测试 ResMgr 资源管理器");
console.log("========================================");
// 测试1: 加载单个资源
await loadUIPrefab();
await loadSprite();
// 测试2: 预加载资源
await preloadLevel();
// 测试3: 加载目录
await loadAllUIIcons();
// 查看缓存大小
console.log(`当前缓存资源数量: ${ResMgr.getInstance().getCacheSize()}`);
// 测试4: 释放资源
releaseUnusedResources();
console.log(`释放后缓存资源数量: ${ResMgr.getInstance().getCacheSize()}`);
console.log("========================================");
console.log(" ResMgr 测试完成");
console.log("========================================");
}