Kopf hoch:
Diese Antwort ist veraltet. Unity unterstützt jetzt Punktlichtpartikel nativ. Bitte lesen Sie diese Antwort für weitere Details.
Ich werde dies hier für alle veröffentlichen, die neugierig sind, alte Versionen von Unity verwenden oder mehr manuelle Kontrolle benötigen, als die native Methode bietet. Beachten Sie jedoch, dass die native Unterstützung wahrscheinlich viel effizienter und skalierbarer ist als der im Folgenden vorgestellte Ansatz.
Ich bin mir nicht sicher, warum so viele Antworten behaupten, dies sei schwierig oder unmöglich. Die Verarbeitung einiger Dutzend dynamischer Punktlichter ist für eine moderne Pipeline für verzögertes Rendern, die auf einem PC ausgeführt wird, ziemlich konventionell .
Hier ist ein kurzes Beispiel, das ich mir ausgedacht habe:
Ich verwende dieses Skript, um dynamisch genug Licht für meine maximalen Partikel zu erzeugen (stellen Sie sicher, dass Sie Ihre Partikelsystemeinstellungen so anpassen, dass das Maximum angemessen ist - die Standardeinstellung 1000 macht Ihre Grafikkarte nicht sehr glücklich), und aktualisieren Sie sie dann, um der aktiven zu folgen Partikel:
[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);
}
}
}
Bearbeiten: Sie können ein Fertighaus erstellen, indem Sie zuerst ein Spielobjekt erstellen (in diesem Fall Erstellen -> Licht -> Punktlicht ), es mit dem gewünschten Namen / Parametern / Skripten / Kindern einrichten und dann aus Ihrer Hierarchie in ziehen Ihr Projekt-Explorer. Dadurch wird das Objekt als Asset gespeichert, das Sie in mehreren Szenen und Skripten mit einem gewissen Grad an Vererbung wiederverwenden können. Sie können die Kopie in Ihrer Szene löschen und das Asset verbleibt in Ihrem Assets-Ordner, auf das bei Bedarf verwiesen wird.
Stellen Sie sicher, dass das lightPrefab über eine relativ geringe Reichweite verfügt und kein Shadowcasting ausführt, um Ihnen den größtmöglichen Spielraum für alle Vorgänge in Ihrer Szene zu bieten. Sie müssen das lightPrefab nicht selbst grün machen (oder die Farbe Ihrer Glühwürmchen) - es nimmt sie von der Farbe der Partikel auf.
Sie werden vielleicht feststellen, dass Sie den Flug der Glühwürmchen besser kontrollieren können, wenn Sie jedes einzelne GameObject mit einem Billboard-Quad und einer Leuchte mit einem benutzerdefinierten Bewegungs- / Blink-Skript erstellen, da ein überzeugender Streifzug mehr Kunst erfordert als ein Partikelsystem Ich kenne. ;)