如何实现停止Incisor粒子系统发射新粒子但让现有粒子完成动画
如何实现停止Incisor粒子系统发射新粒子但让现有粒子完成动画
我之前在用Incisor粒子系统时也碰到过一模一样的问题——直接调用playbackController.stop()确实会立刻掐断所有粒子,完全不是我们想要的“让现有粒子自然收尾”的效果。不过别担心,我们可以通过控制发射器的状态来实现预期行为,而不是直接停止整个播放控制器。
核心思路很简单:关掉发射器的新粒子生成功能,但让播放控制器继续运行,直到现有粒子走完它们的生命周期自然消失。给你修改后的代码示例:
class ProjectMain { init() { let particles = nc.addParticleSystem(nc.particleSystemDefinitions.Fountain, nc.mainScene, "MyParticles"); particles.playbackController.play(); nc.waitThen(1, this, "stopParticles"); } stopParticles() { // 禁用发射器,停止产生新粒子 particles.emitter.enabled = false; // 可选:如果需要在所有粒子消失后彻底停止播放控制器,可添加这段监听 const checkRemainingParticles = () => { if (particles.activeParticleCount === 0) { particles.playbackController.stop(); clearInterval(checkInterval); } }; const checkInterval = setInterval(checkRemainingParticles, 100); } }
关键细节说明:
- 禁用发射器:通过
particles.emitter.enabled = false关闭粒子发射逻辑,这样不会有新粒子生成,但已经存在的粒子会继续执行它们的动画(比如移动、透明度变化、消失等),直到走完预设的生命周期。 - 可选的收尾处理:如果希望所有粒子消失后彻底停止播放控制器,可以定时检查
activeParticleCount(假设Incisor提供这个属性),当粒子数为0时再调用stop()。如果不需要严格终止播放控制器,这一步可以省略——没有新粒子发射后,系统会自动处于空闲状态,不会有性能损耗。
如果你的Incisor版本里没有emitter.enabled属性,也可以尝试设置发射器的发射速率为0:particles.emitter.emitRate = 0,能达到同样的效果。
备注:内容来源于stack exchange,提问作者Eric Lubin
相关产品推荐
相关产品推荐

