Files
Max-Cocos-Demo/assets/games/scripts/pets/PetManager.ts
2025-11-26 22:57:07 +08:00

56 lines
1.9 KiB
TypeScript

import ResManager from "@max-studio/core/res/ResManager";
import { Singleton } from "@max-studio/core/Singleton";
import { instantiate, Prefab } from "cc";
import { BasePet } from "./BasePet";
import { releaseDressSocketNode } from "./PetUtils";
export class PetManager extends Singleton {
private petPrefabCache: Map<string, Prefab> = new Map();
public async getPet(name: string): Promise<BasePet> {
let asset: Prefab = null;
if (this.petPrefabCache.has(name)) {
asset = this.petPrefabCache.get(name);
if (asset == null) {
console.error(`宠物预制体缓存为空 ${name}`);
return null;
}
asset.addRef();
} else {
const loadInfo = await ResManager.getInstance().loadAsset({
bundle: "pet-spine",
path: name,
type: Prefab,
});
if (loadInfo.err) {
console.error(`加载宠物预制体失败 ${name}`, loadInfo.err);
return null;
}
asset = loadInfo.asset;
this.petPrefabCache.set(name, asset);
}
const basePet = instantiate(asset).getOrAddComponent(BasePet);
basePet.setInfo({ name: name });
return basePet;
}
public releasePet(pet: BasePet) {
const petName = pet.getInfo().name;
pet.takeOff();
pet.node.removeFromParent();
pet.node.destroy();
if (this.petPrefabCache.has(petName)) {
const prefab = this.petPrefabCache.get(petName);
ResManager.getInstance().releaseAsset(prefab);
if (prefab.refCount == 0) {
this.petPrefabCache.delete(petName);
console.log(`释放宠物预制体成功 ${petName}`);
}
}
}
protected onRelease(): void {
releaseDressSocketNode();
}
}