Найти тему

Unity 2D. Ruby's Adventure. Part 27

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

Давайте попробуем создать эффект дыма для сломанного робота. Мы создадим систему частиц, каждая частица в которой будет иметь изображение из спрайта. Атлас спрайтов для частиц находится в папке Art > Sprites > VFX и называется ParticlesSheet. Установите для него тип спрайта - Multiply (множественный), оставьте PPU равным 100.

Откройте редактор спрайтов, чтобы нарезать разные спрайты. Атлас спрайтов состоит из 4 столбцов и 4 строк. После этого нажмите кнопку Slice и не забудьте подтвердить изменения кнопкой Apply вверху окна редактора спрайтов:

Нарезка спрайтов
Нарезка спрайтов

Чтобы создать новый эффект из системы частиц:

Кликните кнопку «+» в верхней части окна иерархии и выберите Effects > Particle System.

Создание нового эффекта
Создание нового эффекта

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

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

В инспекторе вы можете увидеть, что система частиц состоит из нескольких разделов, которые определяют вид системы и ее частиц. По умолчанию первый раздел развернут, а остальные свернуты. Клик мышкой на светло-сером заголовке раздела разворачивает и сворачивает этот раздел.

Давайте начнем с замены белых точек на дымовые спрайты. В разделе «Texture Sheet Animation» (анимация листа текстуры) установите галочку слева от названия раздела, чтобы включить его и откройте раздел, нажав на его название.

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

Для этого установите режим «Sprites». Затем нажмите кнопку "+" справа в появившемся поле, чтобы увеличить количество полей до двух:

Настройка анимации текстур
Настройка анимации текстур

Перетащите мышкой два дымовых спрайта из атласа ParticlesSheet в эти поля:

Задание спрайтов
Задание спрайтов

Обратите внимание, что на сцене белые точки изменятся на выбранные спрайты.

Теперь щелкните маленькую стрелку вниз справа от свойства Start Frame, выберите Random Between Two Constants:

Настройка кадров анимации
Настройка кадров анимации

Введите в появившиеся поля значения 0 и 2. Для определения изображения для каждой частицы система сгенерирует случайное число от 0 до 2 (либо 0, либо 1) и использует спрайт из списка под соответствующим номером.

Настройка кадров анимации
Настройка кадров анимации

Обратите внимание, что система автоматически изменит двойку на чуть меньшее дробное значение, чтобы двойка не входила в значения генерации.

Нажмите на более светлый прямоугольник рядом со свойством Frame Over Time (кадр с течением времени), которое показывает, как кадр будет меняться с течением времени (от кадра 0 до 1 ). Нам вообще не нужна анимация, поэтому щелкните правой кнопкой мыши правую красную точку на графике и выберите «Delete key»:

Настройка кадров анимации
Настройка кадров анимации

Теперь на сцены вы увидите, что частицы используют тот или иной дымовой спрайт случайным образом при создании.

Следующий шаг — изменить настройки их создания, потому что сейчас они разбросаны слишком далеко друг от друга и под большим углом.

Откройте раздел Shape. На сцене вы увидите конус, который ограничивает область создания частиц. Установите Radius на 0, так как нам нужно, чтобы все частицы генерировались из одной точки. Значение автоматически изменится на 0.0001, так как совсем нулем оно быть не может, и Unity устанавливает его на минимальное.

Измените угол на 5, чтобы частицы располагались кучнее:

Настройки формы системы частиц
Настройки формы системы частиц

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

В главном разделе в верхней части системы частиц измените следующие параметры.

  • Start Lifetime (начальное время жизни) - время жизни частицы. Как долго частица будет находится на экране, прежде чем будет уничтожена системой частиц. Если вы уменьшите масштаб на сцене, то увидите, что все частицы исчезают в одном и том же месте, так как генерируются с одинаковой скоростью и одинаковым временем жизни.
Уничтожение частиц
Уничтожение частиц

Щелкните маленькую стрелку вниз справа от Start Lifetime и выберите Random Between Two Constants. Введите значения 1.5 и 3. Теперь у всех частиц разное время жизни и исчезать они будут не одинаково:

Настройка времени жизни частиц
Настройка времени жизни частиц
  • Start size (начальный размер) - размер создаваемой частицы. Сейчас установлено одно число, поэтому все частицы имеют одинаковый размер. Добавьте немного случайности, выбрав Random Between Two Constants и задав значения 0.3 и 0.5. Частицы теперь меньше и разного размера:
Настройка размеров частиц
Настройка размеров частиц
  • Start speed (начальная скорость) - скорость, с которой частицы начинают двигаться при создании. Опять выберите Random Between Two Constants и установите значения на 0.5 и 1:
Настройка скорости частиц
Настройка скорости частиц

Частицы начинают больше походить на дым. Но это все равно выглядит странно, потому что когда у частиц заканчивается время жизни, они просто исчезают, а нужно чтобы они становились прозрачнее с течением жизни и в конце просто пропадали. Таким образом, частица не просто резко исчезнет, ​​а это процесс будет происходить как будто постепенно.

Включите раздел Color over Lifetime (цвет с течением жизни) и разверните его. Чтобы было удобнее просматривать все разделы, помните, что открытые разделы можно закрыть, щелкнув по их заголовку.

Кликните на белый квадрат рядом, чтобы открыть редактор градиентов:

Редактор градиентов
Редактор градиентов

Этот градиент показывает, как меняется цвет частицы в течение ее жизни. Нижняя стрелка на белом прямоугольнике — это цвет, а верхняя стрелка — прозрачность (называемая «альфа» в терминологии игрового дизайна).

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

Редактор градиентов
Редактор градиентов

Сейчас частица останется полностью белой (можно считать это белой подложкой для спрайта, так как сам спрайт у нас черный) и ее прозрачность не изменяется. Выберите верхнюю правую стрелку и измените альфа-канал с 255 на 0:

Изменение прозрачности
Изменение прозрачности

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

Включите и откройте раздел Size Over Lifetime. Нажмите на поле «Size» и посмотрите на кривую, которая появится внизу инспектора:

Кривая изменения размера
Кривая изменения размера

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

Давайте изменим это, перетащив первую точку на 1, а последнюю точку на 0. Чтобы дым выглядел хорошо, нам нужно сделать кривую ровной примерно до середины, а затем добавить крутой спад. Для удобства настройки такой линии используйте касательную, которая появляется рядом с каждой точкой.

Настройка кривой изменения размера
Настройка кривой изменения размера

Теперь, когда дым выглядит достаточно правдоподобно, пришло время добавить его роботу.

Но прежде давайте вспомним, что у спрайта есть свойство Order In Layer, при помощи которого вы можете изменить порядок отрисовки спрайта. У системы частиц тоже есть это свойство, что позволяет вам сделать ее поверх других спрайтов. Это свойство находится в разделе Renderer. Поэтому когда вы будете настраивать положение системы частиц не забудьте установить это значение правильно:

Свойство Order In Layer
Свойство Order In Layer

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

Создание префаба
Создание префаба

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

Перенос префаба
Перенос префаба

Разместите дым так, чтобы казалось, что он выходит из головы робота:

Расположение эффекта
Расположение эффекта

Сохраните префаб и попробуйте сыграть в игру. Обнаружится две проблемы:

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

Исправить движение дыма довольно просто. Если вы посмотрите в основной раздел системы частиц, то увидите параметр Simulation Space, для которого установлено значение Local. Измените это на World:

Настройка эффекта дыма
Настройка эффекта дыма

Чтобы остановить дым, когда робота починят, откройте скрипт EnemyController и добавьте публичную переменную smokeEffect типа ParticleSystem и сохраните скрипт:

Скрипт врага
Скрипт врага

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

Настройка префаба
Настройка префаба

Мы сразу используем тип переменной ParticleSystem, а не Gameobject, хотя как говорилось ранее, префаб это заранее подготовленный GameObject. Это упрощает использование переменной в коде, так как избавляет нас от необходимости выполнять GetComponent. Если общедоступная перменная является типом Component или Script вместо GameObject , то Unity автоматически обращается и сохраняет в переменную компонент того типа, каким она объявлена.

Также такой способ позволяет избежать ошибки, когда вы попытаетесь перетащить в поле smokeEffect какой-то другой объект, Unity разрешит поместить в этот слот только объект типа ParticleSystem.

В метод Fix скрипта EnemyController добавьте строку:

smokeEffect.Stop();

Скрипт врага
Скрипт врага

Сохраните скрипт и запустите игру. Теперь дым развевается в противоположную сторону от движения и прекратится, когда вы почините робота.

В качестве примечания - почему используется Stop , а не просто уничтожение системы частиц методом Destroy, как мы это делали раньше, например, с шестеренкой?

Когда вы задаетесь каким-то вопросом, лучший способ выяснить "почему" — это попробовать. Закомментируйте smokeEffect.Stop() и добавьте новую строку (комментарий - способ сделать строку нерабочей с помощью "//" вначале строки):

Destroy(smokeEffect.gameObject).

Сыграйте в игру и почините робота. Вы увидите, что дым мгновенно исчезает. Когда система частиц разрушается, она уничтожает все частицы, с которыми в данный момент она работала, даже те, которые были созданы только что.

Метод Stop, просто останавливает систему частиц, запрещая ей создавать новые частицы. Частицы, которые уже были созданы, могут закончить свое существование в обычном режиме. Это выглядит намного естественнее, чем просто исчезновение всех частиц одновременно. Поэтому удалите строку с методом Destroy и раcкомментируйте метод Stop.

Вот так починка робота будет выглядеть теперь: