La tête haute:
Cette réponse est dépassée. Unity prend désormais en charge les particules de lumière ponctuelle de manière native. Veuillez consulter cette réponse pour plus de détails.
Je laisserai cela ici pour toute personne curieuse, ou utilisant d'anciennes versions de Unity, ou ayant besoin de plus de contrôle manuel que la méthode native n'offre - notez simplement que le support natif est probablement beaucoup plus efficace et évolutif que l'approche présentée ci-dessous.
Je ne sais pas pourquoi tant de réponses affirment que c'est difficile ou impossible. La gestion de quelques dizaines de lumières ponctuelles dynamiques est assez classique pour un pipeline de rendu différé moderne fonctionnant sur PC.
Voici un exemple rapide que j'ai concocté:
J'utilise ce script pour générer dynamiquement suffisamment de lumières pour mes particules maximales (assurez-vous d'ajuster les paramètres de votre système de particules afin que le maximum soit raisonnable - la valeur par défaut de 1000 ne rendra pas votre carte graphique très heureuse), puis les met à jour pour suivre l'actif particules:
[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);
}
}
}
Modifier: vous pouvez créer un préfabriqué en créant d'abord un objet de jeu (dans ce cas, Créer -> Lumière -> Lumière ponctuelle), en le configurant avec le nom / paramètres / scripts / enfants que vous voulez, puis en le faisant glisser de votre hiérarchie vers votre explorateur de projets. Cela enregistre l'objet en tant qu'actif que vous pouvez réutiliser sur plusieurs scènes et scripts, avec un certain degré d'héritage. Vous pouvez supprimer la copie dans votre scène et l'actif restera dans votre dossier Assets pour être référencé en cas de besoin.
Assurez-vous que le lightPrefab a une plage relativement petite et n'est pas un shadowcasting, pour vous donner la marge la plus performante pour tout ce qui se passe dans votre scène. Vous n'avez pas besoin de rendre le lightPrefab lui-même vert (ou la couleur de vos lucioles) - il le ramassera de la couleur des particules.
Vous constaterez peut-être que vous avez un meilleur contrôle sur le vol des lucioles si vous créez chacun son propre GameObject, avec un quadruple panneau d'affichage et une lumière attachée avec un script de mouvement / clignotement personnalisé, car obtenir une déambulation convaincante prend plus de talent pour le système de particules que Je sais. ;)