For the complete documentation index, see llms.txt. This page is also available as Markdown.

Системы частиц

Particle_System_Component рисует детерминированные 2D-эффекты частиц. Движение частиц аналитически семплируется из дескриптора, seed и времени вместо того, чтобы продвигать и хранить преобразование для каждой частицы каждый кадр.

Быстрый старт

Добавьте компонент и запустите один из встроенных пресетов:

particles := entity.add_component(Particle_System_Component);
particles.play(Particle_System_Desc.preset_explosion());

play проверяет и копирует дескриптор, сбрасывает детерминированное зерно и время начала, а также включает компонент. Вызовите restart() чтобы снова воспроизвести активный дескриптор:

particles.restart();

Вызовите stop() чтобы отключить эффект. Пустой Particle_System_Component без дескриптора остается неактивным, пока не будет вызван play() , поэтому его добавление никогда не запускает сначала невидимый эффект по умолчанию.

Пресеты однократного выброса отключают свой компонент после максимально возможного времени жизни частицы. Непрерывные пресеты остаются включенными, пока вы не отключите или не удалите компонент.

Пресеты

Каждый вызов пресета возвращает новый дескриптор, который можно безопасно настроить:

desc := Particle_System_Desc.preset_smoke();
desc.color_over_lifetime = Particle_System_Desc.over_lifetime_v4(
    {0.4, 0.15, 0.7, 0.8},
    {0.05, 0.01, 0.1, 0}
);
desc.spawn_position_radius = 0.3;
particles.play(desc);

Активный desc дескриптор компонента доступен только для чтения. get_desc() возвращает копию значения, которую можно безопасно настроить и передать обратно в play(); поэтому запущенные частицы никогда не увидят частично примененное изменение дескриптора.

Встроенные пресеты:

  • preset_default

  • preset_shotgun

  • preset_firework

  • preset_explosion

  • preset_sparks

  • preset_smoke

  • preset_dust

  • preset_fountain

  • preset_embers

  • preset_snow

  • preset_rain

  • preset_confetti

  • preset_magic_aura

Локальное и мировое пространство симуляции

Установите simulation_space в зависимости от того, как уже созданные частицы должны реагировать, когда эмиттер перемещается:

Оба режима используют один и тот же детерминированный аналитический семплер. Они различаются только по объему данных времени выполнения, необходимому для восстановления источника частицы:

  • Локальное пространство поддерживает состояние эмиттера постоянного размера. Только что созданная система в локальном пространстве не выделяет почастичного состояния симуляции.

  • Мировое пространство хранит одну небольшую запись о рождении на каждый повторно используемый слот частицы: положение эмиттера в момент рождения и индекс жизни. Положение, скорость, вращение, размер и цвет по-прежнему вычисляются аналитически.

Это делает локальное пространство состоянием O(1), а мировое пространство — состоянием O(desc.get_particle_count()) состояние. Переключение существующего компонента в мировом пространстве на локальное пространство очищает количество слотов, хотя управляемый массив может сохранить свою предыдущую емкость для повторного использования.

Однократный и непрерывный выброс

Однократный выброс запускает нужное количество частиц сразу:

Непрерывный выброс планирует нужное количество частиц в секунду:

Рассматривайте emission, prewarm, а также auto_disable_when_finished как одну конфигурацию жизненного цикла при изменении пресета. Пресеты возвращают полные дескрипторы, и присваивание нового emission не сбрасывает ни одно из двух других полей. В частности, фоновые пресеты, такие как preset_magic_aura() уже имеют prewarm = true; явно очистите его перед изменением на однократный выброс, иначе play() отклонит дескриптор.

Движок автоматически вычисляет минимальный безопасный пул повторно используемых слотов:

Используйте desc.get_particle_count() чтобы проверить получившееся число частиц для однократного выброса или число слотов для непрерывного режима. Вместимость непрерывного режима не является настройкой автора: скорость выброса и время жизни уже определяют максимальное число одновременно допустимых частиц.

prewarm аналитически продвигает непрерывный график на один полный цикл пула, создавая у фоновых эффектов вид уже запущенного состояния без симуляции предыдущих кадров. Предзагрузка в мировом пространстве не имеет более ранней траектории эмиттера для просмотра, поэтому она намеренно предполагает, что до активации эмиттер был неподвижен в своей текущей позиции.

Общие поля дескриптора

Для диапазонов и значений по времени жизни используются вспомогательные конструкторы:

size_over_lifetime содержит полную ширину и высоту в мировом пространстве. Указание обоих измерений намеренно позволяет растягивать следы и прямоугольные частицы. Чтобы сохранить исходное соотношение сторон спрайта, укажите его визуальную высоту:

Основные поля дескриптора:

  • spawn_offset, spawn_rect_size, а также spawn_position_radius: где возникают частицы относительно эмиттера.

  • direction и direction_spread_degrees: базовое направление движения и случайный угловой разброс. Семплер нормализует направление.

  • speed, gravity, а также friction: аналитические параметры движения.

  • lifetime, fade_in_seconds, а также fade_out_seconds: продолжительность жизни и огибающая непрозрачности.

  • color_over_lifetime: интерполяция цвета RGBA. Затухания умножают интерполированную альфу вместо того, чтобы заменять ее.

  • initial_rotation_degrees и angular_velocity_degrees: диапазон вращения и диапазон угловой скорости.

  • face_direction: ориентирует каждую частицу вдоль ее текущей скорости вместо применения угловой скорости.

  • size_over_lifetime: независимые полная ширина/высота на протяжении жизни частицы.

  • sprite: отрисовываемая текстура.

  • seed_salt: стабильное для каждого дескриптора разнообразие, смешиваемое с зерном активации.

layer и z_offset находятся Particle_System_Component и управляют порядком отрисовки.

Проверка

play() и restart() использует assert для недопустимых дескрипторов, чтобы ошибки программиста проявлялись в месте их возникновения. Редакторы и другие инструменты создания контента могут выполнять проверку без запуска эффекта:

validation_error() возвращает ту же ошибку напрямую или пустую строку, когда дескриптор корректен. Недопустимые значения никогда молча не ограничиваются.

Детерминизм и интерполяция

Каждая выборка определяется зерном системы частиц, индексом слота, индексом жизни и текущим временем. Отрисовка не изменяет состояние симуляции. Текущие и предыдущие аналитические выборки передаются интерполированному рендереру квадов, включая положение, размер и вращение, поэтому частицы остаются плавными между фиксированными обновлениями симуляции.

Позиции рождения в мировом пространстве захватываются во время общего пути обновления, а не во время отрисовки. Отрисовка берет выборки не позже последнего завершенного обновления позиции рождения, поэтому время запуска и повторного включения не может показать новый допустимый слот до того, как существует его источник. Это сохраняет совместимость эффекта с предсказанием и повторной симуляцией, избегая при этом изменений состояния только для рендеринга.

Последнее обновление