Wie kann ich Partikel zum Leuchten bringen und ihre Umgebung beleuchten?

22

Ich versuche gerade, einen Glühwürmcheneffekt auf einem dunklen Wald zu erzielen. Der Pegel ist sehr schwach und der Player ist eine der wenigen Lichtquellen. Damit der Spieler das Level besser sieht, versuche ich, leuchtende Glühwürmchen zufällig auf der Karte erscheinen zu lassen. Eine Möglichkeit ist die Verwendung eines Partikelsystems. Aber ich kann die Partikel nicht dazu bringen, Licht in die Umgebung zu werfen. Gibt es eine Möglichkeit, dies zu tun?

DarkDestry
quelle
3
Das eigentliche Problem hierbei ist, dass "Licht teuer ist". Es ist möglicherweise besser, einige Fixpunktleuchten zu platzieren, die den Bereich ausreichend beleuchten, die Leuchten in eine Lichtkarte zu backen und dann anhand der Partikel zu erklären, woher die Lichtquelle kommt, als Dutzende schrecklich teurer dynamischer Leuchten zu verwenden.
Draco18s
@ Draco18s Es wird nicht Dutzende von Glühwürmchen geben. Sie werden nur in der Ansicht des Players angezeigt. Es ist von oben nach unten und als solches leicht zu kontrollieren. Und zu jeder Zeit sollten es nur weniger als 10 Glühwürmchen sein. Ich nehme nicht an, dass 10 dynamisches Punktlicht teuer ist.
DarkDestry
In Unity können standardmäßig nur zwei aktive dynamische Lichter gleichzeitig die Geometrie beleuchten (obwohl dies bei einer 2D-Konfiguration möglicherweise anders ist). Sie können dies natürlich erhöhen, aber denken Sie daran, dass +1 Licht x2 Auswirkung auf Draw Calls ist.
Draco18s
2
@ Draco18s Dies gilt möglicherweise für den Forward-Rendering-Pfad, aber wie in den Dokumenten "Bei Verwendung der verzögerten Schattierung gibt es keine Begrenzung für die Anzahl der Lichter , die ein Objekt beeinflussen können" angegeben - Viele kleine Lichter, die nur einen kleinen Teil von beeinflussen Der Bildschirm ist genau die Art von Use-Case-verzögerten Rendering-Pfaden, die sich durch eine effiziente Handhabung auszeichnen. (Zu einem typischen Preis von einem Draw Call pro Unique Light anstelle eines Multiplikators wie beim Forward Rendering)
DMGregory
Das ist ein guter Punkt. Ich vergesse die meiste Zeit über die verschiedenen Renderpfade.
Draco18s

Antworten:

7

Licht emittierende Partikel sind jetzt in Unity 5.5 integriert.

Aktivieren Sie einfach die Option „Lichter“ im Partikelinspektor, geben Sie einen Verweis auf eine vorgefertigte Lichtquelle ein (sowohl Punkt- als auch Punktlichter funktionieren), und ändern Sie das Verhältnis auf 1.

Bildbeschreibung hier eingeben

Und voilà, Teilchen, die Licht aussenden: ! [Bildbeschreibung hier eingeben

Es stellt sich heraus, dass dies ein ziemlich optimiertes Setup ist, das auf meinem Rig mit 1500 + fps läuft, selbst bei maximalem Licht in den Hunderten.

Edit: Nach einiger Beobachtung scheint es mir, dass die Partikellichter zwischen Per-Fragment-Beleuchtung und Vertex-Beleuchtung umschalten (vermutlich zur Optimierung?). Dies kann zu kleinen Mengen visueller Artefakte führen, wenn die maximale Lichtstärke zu hoch eingestellt ist.

Edit2: Wie von DMGregory herausgestellt, sind die Artefakte ein Nebenprodukt von Vorwärts-Rendering-Optimierungen. Eine verzögerte Beleuchtung löst das Problem. Schöneres GIF hinzugefügt

eclmist
quelle
1
Das sind gute Neuigkeiten! :) Diese Antwort wäre noch besser, wenn sie eine schrittweise Anleitung zur Einrichtung dieser Funktion mit den neuen Funktionen des Partikelsystems enthalten würde.
DMGregory
1
Das Verhalten der Scheitelpunktbeleuchtung, das Sie sehen, klingt ein bisschen wie einige der Optimierungen, die Unity beim Forward-Rendering anwendet. Sehen Sie dasselbe Verhalten, wenn Sie den zurückgestellten Pfad verwenden?
DMGregory
Du hast recht! Die Artefakte sind bei Verwendung des verzögerten Renderpfads nicht mehr vorhanden.
Eclmist
31

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: Beispiel von Leuchtkäfern mit Lichtern

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. ;)

DMGregory
quelle
Eigentlich ... obwohl ich gesagt habe, dass ich kein Shadowcasting für die Glühwürmchen verwenden soll, habe ich nur versucht, es in meiner Beispielszene einzuschalten, und es hat keine Probleme verursacht. Die Art und Weise, wie die Schatten herumschwingen, während die Glühwürmchen Objekte passieren, ist wirklich cool und könnte zu einer gespenstischen Atmosphäre beitragen. Ihre Laufleistung kann abhängig von der Komplexität Ihrer Szene und Ihrer Zielhardware variieren. Das Profil ist also sicher, aber dies kann ein Fall von vorzeitiger Optimierung meinerseits sein. :)
DMGregory
Wie erstellt man ein leichtes Fertighaus?
DarkDestry
Aus irgendeinem Grund bezieht sich ParticleSystem.Particle auch auf das Legacy-Partikel. Es gibt keine GetCurrentColor- oder GetCurrentSize-Methode dafür.
DarkDestry
@ DarkDestry Ich habe der Antwort zum Erstellen von Fertighäusern einen Hinweis hinzugefügt. Was die fehlenden Funktionen betrifft, könnte dies ein Versionsproblem sein - ich arbeite in 5.3, in früheren Versionen von Unity könnten Sie dies auf eine andere Weise tun. Lassen Sie uns Details zur Implementierung im Chat besprechen , indem wir den von Hamza Hasan freundlicherweise erstellten Raum verwenden.
DMGregory
Ein leichtes Fertighaus ist also dasselbe wie ein normales Fertighaus. War verwirrt, als es als leichtes Fertighaus erwähnt wird.
DarkDestry
3

Vor Jahren, als dynamische Lichter noch erschwinglich waren, verwendeten wir einfach einen Partikeleffekt auf einer 2D-Plakatwand mit additiver Mischung. Es würde die Szene in Richtung Weiß aufhellen. Wenn Sie es mit der richtigen Tiefe der Glühwürmchen zeichnen, erhalten Sie eine fast korrekte Sortierung. Additives Alpha muss im Vergleich zum Alpha-Blending nicht sortiert werden, wenn es sich selbst überzeichnet. Es wird nicht die ganze Szene beleuchten, aber es wird den Bereich um die Glühwürmchen beleuchten. Sie könnten dann alle paar Sekunden ein dynamisches Licht nehmen und eines der Glühwürmchen auswählen, um die Szene tatsächlich zu beleuchten, wenn Sie es benötigen.

Zu Glüheffekten gibt es bereits eine Frage und Antwort. Wie kann in Unity für 2D-Spiele eine solche Beleuchtung erzielt werden?

Steven
quelle
0

Leider habe ich nicht viel Erfahrung mit Unity in seiner aktuellen Form (ich habe vor vielen Jahren damit gespielt), sodass ich nicht genau weiß, mit welchen Funktionssätzen Sie in der Engine arbeiten müssen.

Unabhängig davon, mit welchem ​​Motor Sie arbeiten, sollten Sie dynamische Lichter vermeiden, wann immer Sie können. Sie sind sehr rechenintensiv und erhöhen die Komplexität der Szene auf exponentielle Weise. Wie bei den meisten 3D-Renderings üblich, gibt es jedoch viele Möglichkeiten, ähnliche Effekte durch Schummeln zu erzielen.

Ein möglicher Weg, einen ähnlichen Effekt zu erzielen, besteht darin, eine vorgefertigte Glühtextur auf das Terrain unter Ihren Glühwürmchen abzubilden (unter der Annahme eines Y = Auf- / Ab-Koordinatensystems), wobei die X- und Z-Positionen die Position des Glühens auf dem Terrain und den Y-Versatz steuern vom Gelände aus, das das Alpha der Textur steuert (heller = näher am Gelände)

Diese Methode hat natürlich mehrere Nachteile. Sie werden keine Schatten werfen, da kein Licht verwendet wird, und Sie werden keine andere Geometrie der Welt (Requisiten, Laub usw.) beeinflussen.

JonBee
quelle
-2

Verwenden Sie es Lightam Ursprung des Feuers und spielen Sie mit seiner Schriftgröße, damit es den Effekt des Brennens erzeugt. Und benutze dein Partikelsystem :)

Hamza Hasan
quelle
Es gibt kein Feuer in der Szene. Ich habe seltene Teilchen in und außerhalb der Existenz. Es gibt überhaupt keine feste Position für die Partikel. Bitte lesen Sie die Frage.
DarkDestry
Also, was ist der Deal? Sie können Licht an Ihre Partikel-Fertigteile anbringen, anstatt an vordefinierten Positionen
Hamza Hasan
Die Frage ist, wie das geht. Ich benutze das Partikelsystem der Einheit. Und ich sehe dort kein Fertighaus. Es sei denn, Sie fordern mich auf, ein Fertighaus zu erstellen, das ein Licht und eine Skriptbasis hat
DarkDestry
Sie haben also Particle GameObject in der Szene. Hängen Sie ein Licht an dasselbe Spielobjekt an und fertigen Sie es an, indem Sie das Spielobjekt in den Unity File Explorer ziehen.
Hamza Hasan
Ich habe ein Partikelsystem-Spielobjekt in der Szene. Kein Teilchen.
DarkDestry