Сигнальная ракета в Unity

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

Для реалистичного сигнального дыма необходима соответствующая текстура с альфа-каналом. Я взял её здесь.

Создаём материал с этой текстурой — он пригодится при настройке партиклов.

Тут можно будет поиграть с прозрачностью и цветом.
Тут можно будет поиграть с прозрачностью и цветом.

Для обозначения траектории я сделал в Blender анимацию, которая, по моему представлению, показывает, как должна лететь ракета. В случае, если нужна более сложная реализация траектории, этот вариант не подойдёт. Например, если вы делаете FPS-шутер, где нужно стрелять из ракетницы в любом направлении, логику снаряда нужно описывать отдельно — согласно вашей механике.

Выгружаем FBX из Blender в Unity. Объект вытаскиваем на сцену — это основа нашего будущего префаба. Назначаем ему компонент Animator и создаём для него пустой Animator Controller. Внутри этого контроллера создаём новое пустое состояние и указываем для него анимацию из FBX-файла.

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

Переходим к эффектам. Создаём дочерний пустой объект у кубика. В него добавляем компоненты Particle System и Light.

Для Particle System назначаем материал дыма, а настройки делаем примерно как на скриншотах.

Тут можно поиграть с параметрами времени жизни, скорости, или размером. Это всё очень интересно может влиять на эффект

Свет делаем ярче, и настраиваем желаемый цвет

Сигнальная ракета в Unity

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

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

Привожу его код ниже. Его нужно повесить на родительский объект, указать время жизни и объект с эффектом (он нужен, чтобы постепенно снижать яркость света).

public class SignalFlare : MonoBehaviour { [SerializeField] GameObject effectObject; [Tooltip("Время жизни сигнальной ракеты в секундах")] public float lifeTime = 15f; private float lightIntensity; private float timer; private Light lightSource; void Start() { timer = lifeTime; lightSource = effectObject.GetComponent<Light>(); lightIntensity = lightSource.intensity; } void Update() { timer -= Time.deltaTime; if (timer <= 0f) { Destroy(gameObject); } lightSource.intensity = timer / lifeTime * lightIntensity; } }

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

Всем спасибо за внимание! Подписывайтесь, чтобы регулярно читать о разработке моего аркадного авиасимулятора. Я ещё и в телеге есть :)

6
2
1
6 комментариев