|
|
|
import { ParticleHelper, ParticleSystem, ParticleSystemSet, Scene, Vector3 } from "@babylonjs/core";
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 粒子特效工具
|
|
|
|
*/
|
|
|
|
export class ParticleSystemTool {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 保存的预制
|
|
|
|
*/
|
|
|
|
psPool: Map<string, ParticleSystem>;
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|