tldr: вот пример с анимированной непрозрачностью, размером и некоторыми переключателями. Переключение максимального возраста, кажется, ждет, пока все текущие частицы исчезнут, хотя в docs .
1 нет ни слова об этом. Потрошение системы частиц
Система частиц основана на ShaderParticleEngine , поэтому модификация не будет такой, как THREE.js'ish.
Из того, что я могу сказатьparticle-system
создает и хранит SPE.Emitter
. Вы можете получить к ним доступ здесь:
let particleSystem = this.el.component['particle-system']
let emitterGroup = particleSystem.particleGroup.emitters
Изменение значений - например, если у вас есть один излучатель:
emitterGroup[0].disable() // disables the emitter
emitterGroup[0].opacity.value = 0.1 // sets the opacity
2. Задание для рамочных пользовательских компонентов
Я бы создал пользовательский компонент, который при любом изменении будет перебирать группу эмиттеров и изменять атрибуты:
AFRAME.registerComponent('particle-controller', {
schema: {
opacity: {default: 1}
},
init: function() {
let system = this.el.components['particle-system']
this.emitterGroup = system.particleGroup.emitters
},
update: function() {
this.setValueInEmitters(this.emitterGroup, 'opacity', this.data.opacity)
},
// may come in handy when changing more key-value pairs
setValueInEmitters(group, prop, value) {
for (let i = 0; i < group.length; i++) {
group[i].prop.value = value
}
}
})
Схема может бытьподается парами ключ-значение или тому подобное, чтобы сделать компонент более универсальным.
3. Почему setAttribute такой тяжелый
Собирая из исходного кода , любое изменение удаляет старую группу частиц и создает новую с нуля.