Wie verschließe ich Lichter in Unity3D?

9

Zunächst einmal besitze ich Unity Pro.

Ich habe versucht, Lichter zu verschließen, wenn sie eine Weile nicht mehr angezeigt werden, um die Leistung zu verbessern. Die Hauptmethoden, auf die ich gestoßen bin, waren die Verwendung von BecameVisible () und das Testen des Kamerastumpfs.

Mein Hauptproblem war, dass ich immer noch möchte, dass das Licht eingeschaltet ist, wenn der Player einen Bereich betrachtet, der vom Licht beleuchtet wird.

Derzeit verwende ich eine Methode, mit der überprüft wird, ob sich der beleuchtete Bereich im Kegelstumpf befindet. Das Problem ist jedoch, dass sich manchmal Lichter im Kegelstumpf befinden, ohne dass der Spieler sie tatsächlich sehen kann (z. B. eine Wand zwischen ihnen und dem Spieler). Ich habe Raycasting für sie versucht, aber Sie können nie detailliert genug für den tatsächlich beleuchteten Bereich werden (das Beste, was ich herausfinden konnte, war die Verwendung von renderer.bounds.extent und renderer.bounds.center, um die maximal beleuchteten Punkte aus dem Licht zu berechnen).

Kennt jemand eine einfache Möglichkeit in Unity Pro, Lichter zu verschließen? Oder können Sie mir einen guten Weg nennen, um diese Kamera-Drehpunktmethode zu verwenden, über die ich gesprochen habe?

Timothy Williams
quelle
1
Sie können überprüfen, ob sich der Kamerastumpf und der Lichtstumpf schneiden, aber ich gehe davon aus, dass die Einheit dies bereits tut.
Archy
1
In Unity Pro sollte OcclusionCulling auch mit Lichtern umgehen.
Archy
Okay, mein Künstler hatte gesagt, dass Occlusion Culling nicht für Lichter funktionieren würde. Also würde ich wahrscheinlich einfach meine verschiedenen Lichtquellen als Okkludierte in den Okklusionsbereichen einstellen, die ich bereits eingerichtet habe?
Timothy Williams
Und so etwas wie das Überprüfen der Kamera und des leichten Kegelstumpfs kann funktionieren, obwohl ich es brauchen würde, um in 360 Grad zu arbeiten.
Timothy Williams
Occlusion Culling scheint nicht mit Lichtern zu funktionieren, trotz dessen, was der Künstler und ich versuchen. Wie genau würde ich ein Licht verschließen?
Timothy Williams

Antworten:

1

Sie können Ihr eigenes Skript schreiben, um Lichter zu verschließen. So etwas ist an der Hauptkamera angebracht:

List<Light> Lights = new List<Light>();
const float OccludeDist = 100;
void Update()
{
    foreach (Light light in Lights)
    {
        if ((transform.position - light.transform.position).sqrMagnitude > OccludeDist * OccludeDist))
        {
            light.enabled = false;
        }
        else{
            light.enabled = true;
        }
    }
}

Sie können auch überprüfen, ob der Punkt innerhalb eines Winkels auf der Y-Achse der Kamera liegt (die anderen Achsen verursachen nur Schmerzen). Seien Sie ein bisschen großzügig mit dem Winkel, vielleicht dem Zweifachen des Frustrums der Kamera, damit die Lichter nicht ausgeschaltet werden, wenn sie Bereiche in der Sicht der Kamera beleuchten. Wenn Sie diese zusätzliche Optimierung hinzufügen (die wahrscheinlich nicht erforderlich ist), stellen Sie sicher, dass Sie den Abstand als Breitphase verwenden, da dies viel kostengünstiger ist.

JPtheK9
quelle
Schön und einfach :)
29áḿíṅḡ Ⱬỏḿƀíé