Источник частиц: время, вместимость и видимость
Эмиссия, OneShot, пауза, границы, координаты и стоимость отрисовки.
Сначала определите задачу: изменить вместимость системы, моменты рождения частиц, ход симуляции или отображение геометрии. Время источника настраивается отдельно от сил ParticleProcessMaterial и материала поверхности меша.
Вместимость и эмиссия
| Свойство | Смысл | Практическое следствие |
|---|---|---|
Amount | Вместимость системы, не менее 1. | Изменение перевыделяет данные частиц в текущей реализации RenderingDevice. Не анимируйте его как дешёвый регулятор плотности. |
AmountRatio | Доля рождения от этой вместимости; используйте 0–1. | Меняет участие в рождении, не уменьшая выделенную вместимость Amount. Это не команда стереть все живые частицы. |
Emitting | Испускаются ли новые частицы. | False не равно пустому изображению и не равно паузе симуляции. |
Lifetime | Время жизни/цикла в секундах, положительное. | Влияет на расписание рождения и длительность существования частиц. |
Для обычной непрерывной эмиссии с полным ratio, равномерным временем и SpeedScale 1 отношение Amount / Lifetime даёт полезную номинальную оценку частиц в секунду. Всплеск, изменённый ratio, случайные интервалы, собственный шейдер и другой масштаб времени меняют её смысл. Не считайте это точным числом частиц на экране.
Время всплеска и завершение
OneShotвыполняет один цикл вместо повторения. Подходит для попаданий и подбора предметов; при необходимости подключайте Finished до запуска.Explosiveness = 0распределяет рождения по циклу;1собирает их в начале. Промежуточные значения сжимают интервал рождения.Randomnessменяет моменты эмиссии. Это не тот же параметр, что случайность скорости/масштаба в ParticleProcessMaterial.Restart()явно начинает новый цикл и очищает старое состояние. Он может намеренно прервать эффект; ожидание Finished — решение для жизненного цикла/пула, а не обязательное условие каждого повторного запуска.
Нативная Entity отслеживает активный интервал one-shot по Lifetime и Explosiveness. Это не делает Emitting точным запросом «все частицы мертвы». В проверенном взрывном эффекте эмиссия уже выключена, пока частицы видны. Непрерывный эффект после ручной остановки исчезает без one-shot-уведомления Finished.
Повторное Emitting true во время активного one-shot может отменить уведомление о завершении этого цикла. Для явного повторения используйте Restart. UseFixedSeed и Seed помогают повторять настройку; keepSeed у Restart сохраняет текущее зерно. Побитовая детерминированность между устройствами не обещается.
Ограничение времени в 1.0.0: после длительной паузы SpeedScale = 0 и возврата к 1 проверенный one-shot может выдать Finished, пока GPU-частицы ещё видны. Таймер Entity умножает накопленное время на текущий масштаб скорости; это не GPU-подтверждение истечения жизни. Не возвращайте эффект с меняющимся временем в пул только по этому сигналу. Фиксированная скорость простого one-shot исключает именно этот случай паузы/возобновления; при изменении времени отдельно проверьте политику жизненного цикла.
Время симуляции — не FPS рендеринга
| Параметр | Назначение | Ограничение |
|---|---|---|
SpeedScale | Масштаб хода симуляции; ноль приостанавливает обычное продвижение. | Живые частицы могут отображаться. Движение камеры и локального источника меняет картинку. |
Preprocess | Продвинуть начальную симуляцию, чтобы непрерывный эффект появился уже заполненным. | Дополнительная работа может дать скачок времени загрузки; это не бесплатный готовый кадр. |
FixedFps | Частота шагов симуляции. | Не ограничивает FPS всей игры и не заменяет SpeedScale. |
Interpolate | Сгладить отображение между фиксированными шагами. | Не добавляет шаги столкновений и не гарантирует корректность быстрых коллизий. |
FractDelta | Учесть дробный момент рождения внутри шага. | Не заменяет достаточную частоту симуляции эффекта. |
InterpToEnd | Сместить состояние частиц к концу их жизни. | Отличается от случайности расписания и интерполяции фиксированного шага. |
Пример ParticleBurst из создания эффекта подтверждает SpeedScale 0 стабильными пикселями. Остальные параметры шага/предварительной симуляции здесь сверены по исходникам; бенчмарк и визуальное сравнение каждой комбинации не заявлены.
Граница видимости не является столкновением частиц
VisibilityAabb — граница отсечения всего источника. Если она вне кадра, эффект может исчезнуть целиком, хотя отдельные симулируемые частицы находились бы на экране. Коробка не обрезает каждую частицу отдельно и не создаёт столкновения со своими стенками.
Охватите всю ожидаемую траекторию и размер отображаемого меша, включая движение источника, гравитацию и длину шлейфов. CaptureAabb сообщает текущие активные границы: это полезное наблюдение работающего эффекта, не доказательство для всех будущих кадров. Перепроверяйте после изменения скорости, времени жизни и формы рождения. Избыточная граница ухудшает отсечение.
LocalCoords определяет, следуют ли позиции частиц трансформации источника или находятся в мировом пространстве. Выберите режим до подбора границ: визуально похожему движению может понадобиться другой охват.
Отображение и стоимость
DrawPass1–4 выбирают меши отображения частиц, а не материал симуляции. Дополнительные проходы и подробные меши увеличивают работу рисования. Большие полупрозрачные карточки могут стоить дорого из-за overdraw даже при небольшом Amount. Общий ParticleProcessMaterial означает общие настройки: создайте или дублируйте ресурс для независимых параметров эффектов.
Для вырезанной формы и полупрозрачного дыма настройте прозрачность, текстуру и цвет вершин материала поверхности. Сортировка частиц помогает в отдельных наложениях, но не делает прозрачность всех эффектов и поверхностей независимой от порядка. См. Ограничения графики.
CollisionBaseSize задаёт размер для столкновений частиц, не масштаб меша и не VisibilityAabb. Для столкновений нужна собственная настройка: наличие рядом обычного игрового физического тела не доказывает поддержку. SubEmitter не означает «создать дочернюю Entity для каждой частицы»; используйте настройку sub-emitter, если нужна эта возможность.
Настраивайте в полезном порядке
- Покажите один простой эффект с известной камерой, материалом и разумными границами.
- Задайте движение, время жизни и пространство координат.
- Настройте вместимость и плотность, затем распределение всплеска во времени.
- Замените тестовую геометрию ассетами эффекта и настройте цвет/alpha поверхности.
- Измерьте характерное число перекрывающихся эффектов, а не один изолированный источник. Проверьте устройство, рендерер и движение перед снижением частоты симуляции.
Проверки runtime для этой статьи — остановка эмиссии, завершение one-shot, перезапуск, пауза, координаты и AABB/draw pass сопутствующего GPU-примера. Изменение плотности AmountRatio, стоимость Preprocess, сочетания фиксированного шага/интерполяции, коллизии, sub-emitters, шлейфы и экспорт проверяются отдельно.