Эмиттер - это невидимый генератор, который стоит за каждым эффектом частиц. Его компоненты решают, когда он работает, сколько частиц создаёт и где они появляются. Все они пишутся в блоке components файла частиц, рядом с компонентами частиц.
Впервые работаете с частицами? Начните с гайда Ваша первая частица, где шаг за шагом собирается рубиновое мерцание.
Что нужно каждому эмиттеру
Эмиттеру нужен один компонент времени жизни и один компонент частоты, иначе он ничего не создаст. Форма необязательна: без неё частицы появляются в центре эмиттера. Из каждой из этих групп используйте только один компонент.
Большинство числовых полей на этой странице принимают либо обычное число, либо строку Molang вроде "math.random(1, 3)". В таблицах указано, когда вычисляется поле: один раз при запуске эмиттера, на каждый цикл или на каждую частицу при её появлении.
Настройка
Эти компоненты срабатывают до того, как что-либо появится. Их можно использовать вместе с любыми другими компонентами.
| Компонент | Что делает | Главные поля |
|---|---|---|
minecraft:emitter_initialization | Выполняет Molang на эмиттере, чаще всего чтобы задать свои переменные, которые потом читают другие поля | creation_expression: выполняется один раз при запуске эмиттера. per_update_expression: выполняется при каждом обновлении |
minecraft:emitter_local_space | Для эффектов, прикреплённых к мобу: выбрать, двигаются ли частицы вместе с мобом или остаются там, где появились | position, rotation, velocity (все true или false, по умолчанию false) |
Задание переменных
emitter_initialization - то самое место, где можно один раз выбрать случайное число и поделиться им со всеми частицами:
"minecraft:emitter_initialization": {
"creation_expression": "variable.ruby_hue = math.random(0.2, 0.4);"
}Теперь каждая частица этого эмиттера может читать variable.ruby_hue, например в своём оттенке.
Локальное пространство
По умолчанию частицы появляются у эмиттера, а дальше живут в мире сами по себе. Если моб уходит, его старые частицы остаются позади, как след.
position: trueзаставляет частицы двигаться вместе с мобом. Используйте это для свечения, которое должно оставаться вокруг него.rotation: trueещё и поворачивает их вместе с мобом. Работает только вместе сposition: true.velocity: trueдобавляет скорость моба к каждой новой частице, поэтому искры от бегущего моба летят вперёд.
"minecraft:emitter_local_space": {
"position": true,
"rotation": true
}Только для прикреплённых эффектов
Локальное пространство ничего не делает для эффектов, запущенных через /particle или скриптом в какой-то точке мира. Оно важно, только когда эффект проигрывает моб или прикрепляемая модель (attachable).
Частота
Частота решает, сколько частиц появляется и как быстро. Выберите один компонент.
| Компонент | Что делает | Главные поля |
|---|---|---|
minecraft:emitter_rate_instant | Создаёт группу частиц в один момент, как вспышку | num_particles (по умолчанию 10, на каждый цикл) |
minecraft:emitter_rate_steady | Создаёт частицы одну за другой в ровном темпе | spawn_rate: частиц в секунду (по умолчанию 1). max_particles: максимум живых одновременно (по умолчанию 50) |
minecraft:emitter_rate_manual | Сам ничего не создаёт. Игра создаёт частицы по одной, когда они ей нужны | max_particles (по умолчанию 50) |
Instant: вспышка
"minecraft:emitter_rate_instant": {
"num_particles": 12
}Если эмиттер зациклен, вспышка повторяется в начале каждого цикла.
Steady: поток
"minecraft:emitter_rate_steady": {
"spawn_rate": 20,
"max_particles": 40
}Здесь создаётся 20 частиц в секунду, но новые перестают добавляться, пока живы 40 штук. max_particles - это защитный лимит: держите его невысоким, потому что сотни частиц могут тормозить слабые телефоны.
Manual: для событий
emitter_rate_manual используют встроенные эффекты, которые игра создаёт по одной частице, например брызги дождя. В своих эффектах вы будете использовать его в основном для маленьких эффектов, которые другие эффекты запускают событием типа particle (см. события). Для всего, что вы запускаете сами, используйте instant или steady.
Время жизни
Время жизни решает, как долго работает эмиттер. Выберите один компонент, а потом при необходимости добавьте события времени жизни.
| Компонент | Что делает | Главные поля |
|---|---|---|
minecraft:emitter_lifetime_once | Срабатывает один раз и удаляется | active_time: сколько секунд создаёт частицы (по умолчанию 10) |
minecraft:emitter_lifetime_looping | Работает, делает паузу, снова работает, пока его что-нибудь не удалит | active_time: секунд работы (по умолчанию 10). sleep_time: секунд паузы между циклами (по умолчанию 0) |
minecraft:emitter_lifetime_expression | Включается и выключается по Molang, который проверяется каждый кадр | activation_expression: создаёт частицы, пока это не 0 (по умолчанию 1). expiration_expression: удаляет эмиттер, как только это не 0 (по умолчанию 0) |
minecraft:emitter_lifetime_events | Вызывает ваши события в определённые моменты жизни эмиттера | creation_event, expiration_event, timeline, travel_distance_events, looping_travel_distance_events |
Once
Лучший выбор для разового эффекта из команды или скрипта:
"minecraft:emitter_lifetime_once": {
"active_time": 1
}С emitter_rate_instant вспышка происходит в самом начале, поэтому active_time может быть коротким.
Looping
"minecraft:emitter_lifetime_looping": {
"active_time": 2,
"sleep_time": 3
}Этот эффект мерцает 2 секунды, отдыхает 3 и повторяется. Используйте зацикливание для эффектов, прикреплённых к мобу или запущенных из контроллера анимаций: там игра сама удалит эмиттер, когда моб или состояние исчезнут.
Expression
Отлично подходит для эффектов, которые следуют за мобом и сами включаются и выключаются:
"minecraft:emitter_lifetime_expression": {
"activation_expression": "query.ground_speed > 0.1",
"expiration_expression": 0
}Этот эффект мерцает, только пока моб идёт, и никогда не удаляется сам. Запросы вроде query.ground_speed читают данные моба, к которому прикреплён эффект.
События
emitter_lifetime_events ссылается на имена из блока events того же файла. Каждое поле принимает одно имя события или список имён.
"minecraft:emitter_lifetime_events": {
"creation_event": "flash",
"expiration_event": "pop",
"timeline": {
"0.5": "twinkle",
"1.0": ["twinkle", "chime"]
},
"travel_distance_events": {
"4.0": "dust"
},
"looping_travel_distance_events": [
{ "distance": 1.0, "effects": ["dust"] }
]
}| Поле | Срабатывает |
|---|---|
creation_event | Когда эмиттер запускается |
expiration_event | Когда эмиттер заканчивает работу. Не ждёт, пока исчезнут его частицы |
timeline | В указанные моменты, в секундах. Повторяется на каждом цикле |
travel_distance_events | Один раз, когда эмиттер в сумме сдвинулся на столько блоков |
looping_travel_distance_events | Снова и снова, каждый раз, когда эмиттер сдвигается на столько блоков. Идеально для следов или шлейфа за снарядом |
Форма
Форма решает, где появляется каждая частица и куда она направлена. Именно вдоль этого направления её толкает particle_initial_speed. Выберите один компонент.
| Компонент | Где появляются частицы | Главные поля |
|---|---|---|
minecraft:emitter_shape_point | Все в одной точке | offset, direction |
minecraft:emitter_shape_sphere | Внутри шара или на его поверхности | radius (по умолчанию 1), offset, surface_only, direction |
minecraft:emitter_shape_box | Внутри коробки или на её поверхности | half_dimensions, offset, surface_only, direction |
minecraft:emitter_shape_disc | На плоском круге или на его краю | radius (по умолчанию 1), plane_normal, offset, surface_only, direction |
minecraft:emitter_shape_custom | Там, где скажет ваш Molang | offset, direction |
minecraft:emitter_shape_entity_aabb | Внутри коробки вокруг моба, к которому прикреплён эффект | surface_only, direction |
Общие поля форм
| Поле | Что делает |
|---|---|
offset | Смещает точку появления от эмиттера, как [x, y, z] в блоках. Вычисляется на каждую частицу, поэтому Molang здесь может разбросать их |
direction | Куда направлены новые частицы. "outwards" (от центра, по умолчанию), "inwards" (к центру) или своё [x, y, z] |
surface_only | true создаёт частицы только на поверхности формы, а не внутри. По умолчанию false |
Формы point и custom принимают только направление [x, y, z], потому что у них нет центра, от которого можно направлять.
Точка (point)
"minecraft:emitter_shape_point": {
"offset": [0, 0.5, 0],
"direction": [0, 1, 0]
}Каждая частица появляется на полблока выше эмиттера и направлена прямо вверх.
Сфера (sphere)
"minecraft:emitter_shape_sphere": {
"radius": 0.5,
"surface_only": true,
"direction": "outwards"
}Полый шар из искр, который разлетается в стороны. Попробуйте "inwards" с коротким временем жизни, чтобы получить эффект «накопления силы».
Коробка (box)
"minecraft:emitter_shape_box": {
"offset": [0, 0.5, 0],
"half_dimensions": [0.5, 0.5, 0.5],
"direction": [0, 1, 0]
}half_dimensions отмеряется от центра, поэтому 0.5 с каждой стороны заполняет ровно один блок. Хорошо подходит для эффекта на весь блок, например для светящейся руды.
Диск (disc)
"minecraft:emitter_shape_disc": {
"radius": 1.5,
"plane_normal": "y",
"surface_only": true,
"direction": "outwards"
}plane_normal - ось, куда смотрит диск. "y" (по умолчанию) кладёт его плашмя, как коврик, а "x" и "z" ставят вертикально, как стену. Можно указать и своё [x, y, z]. Этот пример создаёт на земле кольцо, которое расходится в стороны: красивый эффект приземления.
Своя форма (custom)
"minecraft:emitter_shape_custom": {
"offset": [
"math.random(-0.1, 0.1)",
"math.random(0, 2)",
"math.random(-0.1, 0.1)"
],
"direction": [0, 1, 0]
}В своей форме вы сами вычисляете точку как [x, y, z]. Здесь каждая частица появляется на случайной высоте до 2 блоков, но по бокам остаётся близко к центру: получается тонкий столб искр, похожий на луч света. Каждое значение заново вычисляется для каждой частицы.
Коробка сущности (entity box)
"minecraft:emitter_shape_entity_aabb": {
"surface_only": false,
"direction": [0, 0.2, 0]
}Здесь используется собственный хитбокс моба (его коробка столкновений), поэтому один и тот же эффект без изменений подходит и курице, и рубиновому голему. Если эффект не прикреплён к мобу, частицы вылетают из точки эмиттера.
Полный эмиттер
Соберём по одному компоненту из каждой группы. Эта аура работает по кругу, пока рядом есть моб, и держится на нём:
"minecraft:emitter_local_space": {
"position": true,
"rotation": false
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1
},
"minecraft:emitter_rate_steady": {
"spawn_rate": 8,
"max_particles": 20
},
"minecraft:emitter_shape_entity_aabb": {
"surface_only": true,
"direction": [0, 1, 0]
}Добавьте сторону частиц (время жизни, внешний вид и движение) из раздела Компоненты частиц и запускайте эффект из анимации моба, как показано в гайде Ваша первая частица.