在不移除粒子的情况下重启 SKEmitterNode
Restart SKEmitterNode without removing particles
我为枪口照明弹设置了粒子效果。我目前使用的是低 numParticlesToEmit 以将发射器限制为短脉冲,并在我想开始新的粒子爆发时对发射器执行 resetSimulation()。
我遇到的问题是 resetSimulation() 会移除屏幕上的所有粒子,而且我经常需要在之前的粒子正常消失之前创建新的粒子爆发,以便它们及早被擦除。
有没有干净的方法再次启动发射器而不擦除屏幕上已经存在的粒子?
通常粒子系统有一个 SKEmitter 缺少的特性:持续时间。这控制系统发出多长时间。我在 SKEmitter
中看不到这个,尽管在 SCNParticleSystems
中
没关系,解决方法:
SKEmitter 有 numParticlesToEmit
property and a particleBirthRate
。结合起来,这些决定了粒子系统在关闭前发射多长时间。
使用这些作为发射控制,可以创建以您想要的方式发射的粒子脉冲,例如枪口闪光或爆炸。
我不确定它是否在达到此限制时自行删除。如果没有,您将不得不创建某种删除功能。因为获得所需效果(屏幕上有多个枪口闪光)的方法是 copy()
SKEmitter
。这非常有效,所以不用担心开销。
SKEmitters 上有一个 targetNode
假设将粒子移动到另一个节点,这样当您重置发射器时,之前的粒子仍然存在。不幸的是,据我所知,这仍然存在漏洞,除非其他人已经弄清楚如何让它工作而我只是错过了它。请记住这一点,以防他们修复它。
嗨,为了帮助未来的读者,我用来计算发射器持续时间的代码是这样的:
let duration = Double(emitter.numParticlesToEmit) / Double(emitter.particleBirthRate) + Double(emitter.particleLifetime + emitter.particleLifetimeRange/2)
它非常适合我
分机:
extension SKEmitterNode {
var emitterDuration: Double {
return Double(numParticlesToEmit) / Double(particleBirthRate) + Double(particleLifetime + particleLifetimeRange/2)
}
}
我为枪口照明弹设置了粒子效果。我目前使用的是低 numParticlesToEmit 以将发射器限制为短脉冲,并在我想开始新的粒子爆发时对发射器执行 resetSimulation()。
我遇到的问题是 resetSimulation() 会移除屏幕上的所有粒子,而且我经常需要在之前的粒子正常消失之前创建新的粒子爆发,以便它们及早被擦除。
有没有干净的方法再次启动发射器而不擦除屏幕上已经存在的粒子?
通常粒子系统有一个 SKEmitter 缺少的特性:持续时间。这控制系统发出多长时间。我在 SKEmitter
中看不到这个,尽管在 SCNParticleSystems
没关系,解决方法:
SKEmitter 有 numParticlesToEmit
property and a particleBirthRate
。结合起来,这些决定了粒子系统在关闭前发射多长时间。
使用这些作为发射控制,可以创建以您想要的方式发射的粒子脉冲,例如枪口闪光或爆炸。
我不确定它是否在达到此限制时自行删除。如果没有,您将不得不创建某种删除功能。因为获得所需效果(屏幕上有多个枪口闪光)的方法是 copy()
SKEmitter
。这非常有效,所以不用担心开销。
SKEmitters 上有一个 targetNode
假设将粒子移动到另一个节点,这样当您重置发射器时,之前的粒子仍然存在。不幸的是,据我所知,这仍然存在漏洞,除非其他人已经弄清楚如何让它工作而我只是错过了它。请记住这一点,以防他们修复它。
嗨,为了帮助未来的读者,我用来计算发射器持续时间的代码是这样的:
let duration = Double(emitter.numParticlesToEmit) / Double(emitter.particleBirthRate) + Double(emitter.particleLifetime + emitter.particleLifetimeRange/2)
它非常适合我
分机:
extension SKEmitterNode {
var emitterDuration: Double {
return Double(numParticlesToEmit) / Double(particleBirthRate) + Double(particleLifetime + particleLifetimeRange/2)
}
}