Берегись:
Этот ответ устарел. Unity теперь поддерживает точечные световые частицы. Пожалуйста, смотрите этот ответ для более подробной информации.
Я оставлю сообщение здесь для любого любопытного, или использующего старые версии Unity, или нуждающегося в большем количестве ручного управления, чем предлагает нативный метод - просто отметьте, что нативная поддержка, вероятно, будет гораздо более эффективной и масштабируемой, чем подход, представленный ниже.
Я не уверен, почему так много ответов утверждают, что это сложно или невозможно. Обработка нескольких десятков динамических точечных источников света довольно обычна для современного конвейера отложенного рендеринга, работающего на ПК.
Вот быстрый пример, который я приготовил:
Я использую этот сценарий для динамического появления достаточного количества света для моих максимальных частиц (убедитесь, что вы настроили параметры системы частиц так, чтобы максимальное значение было разумным - значение по умолчанию 1000 не сделает вашу видеокарту очень счастливой), а затем обновляет их, чтобы следовать активным частицы:
[RequireComponent(typeof(ParticleSystem))]
public class ParticleLights : MonoBehaviour {
public Light lightPrefab;
ParticleSystem _system;
ParticleSystem.Particle[] _particles;
Light[] _lights;
void Start () {
_system = GetComponent<ParticleSystem>();
_particles = new ParticleSystem.Particle[_system.maxParticles];
_lights = new Light[_system.maxParticles];
for(int i = 0; i < _lights.Length; i++)
{
_lights[i] = (Light)Instantiate(lightPrefab);
_lights[i].transform.parent = transform;
}
}
void Update () {
int count = _system.GetParticles(_particles);
for(int i = 0; i < count; i++)
{
_lights[i].gameObject.SetActive(true);
_lights[i].transform.localPosition = _particles[i].position;
// Looks like the GetCurrentColor function was added in 5.3.
// You can use other methods in earlier Unity versions.
_lights[i].color = _particles[i].GetCurrentColor(_system);
}
for (int i = count; i < _particles.Length; i++)
{
_lights[i].gameObject.SetActive(false);
}
}
}
Редактировать: вы можете создать префаб , сначала создав игровой объект (в данном случае «Создать» -> «Свет» -> «Точечный свет»), установив в нем нужное имя / параметры / scripts / children, а затем перетащив его из иерархии в Ваш исследователь проекта. Это сохраняет объект в качестве актива, который вы можете повторно использовать в нескольких сценах и сценариях со степенью наследования. Вы можете удалить копию в вашей сцене, и актив останется в папке «Ресурсы», к которому можно будет обращаться при необходимости.
Убедитесь, что lightPrefab имеет относительно небольшой диапазон и не использует теневую трансляцию, чтобы обеспечить максимальный запас производительности для всего, что происходит в вашей сцене. Вам не нужно делать сам LightPrefab зеленым (или цветом ваших светлячков) - он будет подбирать его по цвету частиц.
Тем не менее, вы можете обнаружить, что у вас есть лучший контроль над полетом светлячков, если вы сделаете каждый из них своим собственным GameObject с квадратом с билбордом и источником света, прикрепленным с помощью специального сценария движения / бликинга, поскольку для получения убедительного блуждания требуется больше мастерства системы частиц, чем Я знаю. ;)