Aviso:
Esta respuesta está desactualizada. Unity ahora admite partículas de luz puntuales de forma nativa Por favor, vea esta respuesta para más detalles.
Dejaré esto aquí para cualquier persona curiosa, o que use versiones antiguas de Unity, o que necesite más control manual que el que ofrece el método nativo; solo tenga en cuenta que es probable que el soporte nativo sea mucho más eficiente y escalable que el enfoque presentado a continuación.
No estoy seguro de por qué tantas respuestas afirman que esto es difícil o imposible. Manejar unas pocas docenas de luces de puntos dinámicos es bastante convencional para una tubería de renderizado diferido moderna que se ejecuta en PC.
Aquí hay un ejemplo rápido que preparé:
Utilizo este script para generar dinámicamente suficientes luces para mis partículas máximas (asegúrese de ajustar la configuración del sistema de partículas para que el máximo sea razonable: el valor predeterminado de 1000 no hará que su tarjeta gráfica sea muy feliz), y luego las actualiza para seguir el activo partículas:
[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);
}
}
}
Editar: puede crear un prefabricado creando primero un objeto de juego (en este caso, Crear -> Luz -> Luz de punto), configurándolo con el nombre / parámetros / scripts / niños que desee, luego arrastrándolo desde su Jerarquía a su explorador de proyectos. Esto guarda el objeto como un activo que puede reutilizar en múltiples escenas y guiones, con un cierto grado de herencia. Puede eliminar la copia en su escena y el activo permanecerá en su carpeta de Activos para que se haga referencia cuando sea necesario.
Asegúrese de que lightPrefab tenga un rango relativamente pequeño y no esté proyectando sombras, para darle el mayor margen de rendimiento para todo lo que sucede en su escena. No necesita hacer que el lightPrefab sea verde (o el color de sus luciérnagas): lo recogerá del color de las partículas.
Sin embargo, es posible que tenga un mejor control sobre el vuelo de las luciérnagas si hace que cada uno tenga su propio GameObject, con un quad vallado y una luz adjunta con un script de movimiento / parpadeo personalizado, ya que obtener un recorrido convincente requiere más arte del sistema de partículas que Lo sé. ;)