In diesem kurzen Video zeige ich euch, wie ich in Unity einen dynamischen Defocus Effekt erstellt habe, der nur die Objekte in der Mitte des Kamerabildes fokussiert und die anderen unscharf darstellt.
Für dieses Tutorial ist keine Deutsche Tonspur verfügbar. Unten kannst du das Video mit Englischer Tonspur und Untertiteln auf Deutsch, Englisch und in weiteren Sprachen ansehen. Unter dem Video findest du die ins Deutsche übersetzte Transkription.
Videotranskript
Hallo zusammen! In diesem kurzen Video zeige ich euch, wie ich in Unity einen dynamischen Defocus Effekt erstellt habe, der nur die Objekte in der Mitte des Kamerabildes fokussiert und die anderen unscharf darstellt.
Im Moment zeige ich euch den finalen Effekt mit absichtlich übertriebener Unschärfe, aber dieser Effekt ist anpassbar, und gleich zeige ich euch, wie das funktioniert.

Das Video und das Skript wurden mit Unity 2022 und der Universal Rendering Pipeline erstellt.
Um das Skript korrekt zu verwenden, müsst ihr der Main Camera eine Volume Komponente hinzufügen, damit ihr auf die Sub-Komponente Depth of Field zugreifen könnt.

Ihr müsst den Modus der Defocus Komponente auf Bokeh ändern, da dieser Modus es ermöglicht, die Entfernung des Fokuspunktes und weitere Effekte festzulegen, wodurch das Endergebnis realistischer wird.

Aktiviert nun gezielt die Parameter Focus Distance und Aperture.

Für Focus Distance können wir den Standardwert beibehalten, da wir diesen Wert während des Spiels über ein C# Skript verändern werden.
Zum Parameter Aperture ist wichtig zu wissen, dass je niedriger dieser Wert ist, desto stärker der selektive Fokuseffekt ausfällt, da die Schärfentiefe geringer wird.
Um euch das Anfangsbeispiel zu zeigen, bei dem der Effekt absichtlich übertrieben wurde, habe ich den Wert auf 2.4 gesetzt. Natürlich müsst ihr nach einigen Tests einen für euer Projekt passenden Wert festlegen.
Bevor ich euch den Code zur Implementierung des Skripts zeige, erkläre ich kurz, wie es funktioniert.
Das Skript projiziert einen unsichtbaren Strahl namens Raycast von der Kamera in die Mitte des Bildausschnitts in der virtuellen Szene.
Wenn der Strahl ein Objekt mit einer Collider Komponente trifft, berechnet er die Entfernung dieses Objekts zur Kamera und schreibt diesen Wert in das Feld Focus Distance der Depth of Field Sub-Komponente.
Der Vorgang ist sehr einfach, aber es ist wichtig zu beachten, dass Objekte zur Erkennung eine Collider Komponente besitzen müssen. Diese kann auch auf Trigger Modus gesetzt werden, wenn ihr verhindern möchtet, dass diese Objekte die Bewegung des Charakters blockieren.

Schauen wir uns nun das sehr einfache C# Skript an, das ich Dynamic Defocus genannt habe.
Damit das Skript korrekt funktioniert, müsst ihr die Module Rendering und Rendering Universal importieren.

Die privaten Variablen, die ich definiert habe, dienen nur dazu, auf die Volume Komponente und deren Depth of Field Sub-Komponente zuzugreifen, damit wir deren Parameter ändern können.

Konkret werden die Variablen Volume und Depth of Field in der Start Funktion des Skripts initialisiert.

Innerhalb der Update Funktion, die bei jedem Frame automatisch ausgeführt wird, wird der Raycast Strahl projiziert.

Das kollidierende Objekt wird in die Variable hit geschrieben, aber es kann sein, dass kein Objekt vorhanden ist, zum Beispiel wenn der Benutzer auf den Hintergrund oder auf einen Bereich der Szene schaut, in dem sich keine Objekte mit Collider Komponente befinden.
Aus diesem Grund muss vor dem Zuweisen des Distance Wertes der hit Variable an den Parameter Focus Distance der Depth of Field Komponente überprüft werden, dass der Collider von hit nicht null ist.
Der Name des vom Strahl erfassten Objekts kann abgerufen werden, indem man auf die Collider Komponente der hit Variable zugreift und von dort auf das Game Object und schließlich auf dessen Namen.
Nachdem ihr das Skript gespeichert habt, führt einige Tests in eurem Projekt durch und passt den Wert des Parameters Aperture an, bis ihr das gewünschte Ergebnis erzielt.
Ich hoffe, dieses kurze Video war hilfreich! Bis bald!