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 = new Map(); public async getPet(name: string): Promise { 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(); } }