Framework.ResMgr资源管理
This commit is contained in:
291
client/assets/scripts/Framework/ResMgr/ResMgrExample.ts
Normal file
291
client/assets/scripts/Framework/ResMgr/ResMgrExample.ts
Normal file
@@ -0,0 +1,291 @@
|
||||
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("========================================");
|
||||
}
|
||||
Reference in New Issue
Block a user