import { ParticleHelper, ParticleSystem, ParticleSystemSet, Scene, Vector3 } from "@babylonjs/core"; /** * 粒子特效工具 */ export class ParticleSystemTool { /** * 保存的预制 */ psPool: Map; scene: Scene; constructor(scene: Scene) { this.scene = scene; this.psPool = new Map(); } static instance: ParticleSystemTool; static Init(scene: Scene) { ParticleSystemTool.instance = new ParticleSystemTool(scene); } static dispose() { } /** * 加载预制 * @param name * @param path * @param onSuccess */ loadPrefab(name: string, path: string, clone: boolean = true, onSuccess?: (ps: ParticleSystem) => void) { let instance = this; ParticleHelper.ParseFromFileAsync(null, path, this.scene, false).then((value: ParticleSystem) => { value.stop(); value.emitter = Vector3.Zero(); value.name += "(prefab)"; instance.psPool.set(path, value); if (clone) { let result = instance.cloneParticle(value, name); if (onSuccess) { onSuccess(result) } } else { if (onSuccess) { onSuccess(value) } } }); } /** * 异步导入粒子特效 * @param path * @param onSuccess */ importParticle(name: string, path: string, onSuccess: (ps: ParticleSystem) => void) { let instance = this; if (instance.psPool.has(path)) { let set = instance.psPool.get(path); let result = instance.cloneParticle(set, name); console.log(set.uniqueId + "克隆特效id", result.uniqueId); onSuccess(result); } else { console.log("加载特效", name); instance.loadPrefab(null, path, true, (value: ParticleSystem) => { onSuccess(value); }) // ParticleHelper.ParseFromFileAsync(null, path, this.scene, false).then((value: ParticleSystem) => { // instance.psPool.set(path, value); // let result = instance.cloneParticle(value, name); // onSuccess(result) // }); } } /** * 克隆粒子系统 * @param setPrefab * @param name */ cloneParticleSet(setPrefab: ParticleSystemSet, name: string) { let result = new ParticleSystemSet(); for (let i = 0; i < setPrefab.systems.length; i++) { result.systems.push(this.cloneParticle(setPrefab.systems[i] as ParticleSystem, name)); } return result; } /** * 粒子 * @param particle * @param name */ cloneParticle(particle: ParticleSystem, name: string) { // let root = new AbstractMesh("root_" + name, this.scene); let root = Vector3.Zero(); let result = particle.clone(name, root); return result; } }