Dritta:
Questa risposta è obsoleta. L'unità ora supporta le particelle di luce puntiforme in modo nativo. Si prega di consultare questa risposta per tutti i dettagli.
Lascerò questo post qui per chiunque sia curioso, o utilizzi vecchie versioni di Unity o necessiti di un maggiore controllo manuale rispetto al metodo nativo, basta notare che il supporto nativo sarà probabilmente molto più efficiente e scalabile rispetto all'approccio presentato di seguito.
Non sono sicuro del motivo per cui così tante risposte affermano che questo è difficile o impossibile. Gestire alcune dozzine di luci dinamiche a punti è piuttosto convenzionale per una moderna pipeline di rendering differita in esecuzione su PC.
Ecco un breve esempio che ho preparato:
Uso questo script per generare dinamicamente abbastanza luci per le mie particelle massime (assicurati di regolare le impostazioni del tuo sistema particellare in modo che il massimo sia ragionevole - il valore predefinito di 1000 non renderà molto felice la tua scheda grafica), e quindi le aggiorna per seguire l'attivo particelle:
[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);
}
}
}
Modifica: puoi creare un prefabbricato creando prima un oggetto di gioco (in questo caso, Crea -> Luce -> Punto luce), impostandolo con il nome / parametri / script / figli che desideri, quindi trascinandolo dalla tua Gerarchia in il tuo esploratore di progetti. Ciò consente di salvare l'oggetto come risorsa che è possibile riutilizzare su più scene e script, con un certo grado di eredità. È possibile eliminare la copia nella scena e la risorsa rimarrà nella cartella Risorse a cui fare riferimento quando necessario.
Assicurati che lightPrefab abbia una gamma relativamente piccola e non offra ombre, per darti il massimo spazio per le prestazioni per tutto ciò che accade nella tua scena. Non è necessario rendere LightPrefab stesso verde (o il colore delle tue lucciole): lo raccoglierà dal colore delle particelle.
Potresti scoprire che hai un migliore controllo sul volo delle lucciole se fai di ognuno il suo GameObject, con un quadrante cartellone e una luce attaccata con uno script di movimento / blinkig personalizzato, poiché ottenere un vagare convincente richiede più abilità nel sistema particellare che Lo so. ;)