56 lines
1.9 KiB
TypeScript
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();
|
|
}
|
|
}
|