Tag/Nachtwechsel mit Abdunklung


Hier möchte ich die Möglichkeit eines Tag- und Nachtwechsels vorstellen, der relativ simpel ist, jedoch auch die Dunkelheit in der Nacht runterfährt. Das Ganze ist ein extra Actor so das im Levelblueprint nichts eingefügt oder geändert werden muss.

Hier möchte ich die Möglichkeit eines Tag- und Nachtwechsels vorstellen, der relativ simpel ist, jedoch auch die Dunkelheit in der Nacht runterfährt. Das Ganze ist ein extra Actor so das im Levelblueprint nichts eingefügt oder geändert werden muss.


Hierzu benötigen wir folgende Komponenten im Level.

11544-001-ben%C3%B6tigte-komponenten-png

Diese sind in der Regel beim Erstellen von einem neuen Level vorhanden, falls nicht, eben halt einfügen.


Nun kümmern wir uns ersteinmal um das Directional Light. Hier müssen wir zwei Einstellungen ändern.

Zum einen müssen wir es Movable machen.

11545-002-directional-light-setting-01-png


Zudem müssen wir unter den Schatteneinstellungen "Castt Static Shadows" ausschalten. Also hier einfach den Haken entfernen.

11546-003-directional-light-shadow-png


Bei der Sky Sphere erhöhen wir den Wert für die Sterne. Hier habe ich jetzt den Wert 3 gewählt, was vielleicht etwas viel ist, aber man kann da gerne etwas experimentieren was nun gut aussehen könnte. Falls noch nicht vorhanden muss ebenfalls das Directional Light unter dem Directional Light Actor ausgewählt werden.

11547-004-sky-sphere-default-png


Unter Sky Light müssen wir nichts ändern. Kommen nun also zum nächsten Schritt, das Erstellen des Actors. Diesen benennen wir nun in DayNightCycle, oder irgendetwas passendes was in euer Konzept passt.

&thumbnail=1


Für unser Vorhaben benötigen wir sechs Variablen in unserem Actor.


11549-006-variablen-anlegen-png


Zum einen DeltaTimeLength als Float und NightTime als Boolean.

Zudem kommt noch LightSource hinzu, diese ist als Dierectional Light Object Refferenz deklariert und wird mit Instance Editable versehen.

SkySphere wird als SkySphere Object Refferenz deklariert, ebenfalls Instanze Editable.

SkyLight wird als Sky Light Object Refferenz deklariert, ebenfalls Instanze Editable.

Zum Schluss noch DaySpeed als Float und Instanze Editable.


Wenn ihr gut seid und Ordnung wahren wollt packt ihr die letzten 4 Variablen noch in Category Setup. Dient der Übersicht.


Nun kümmern wir uns um DeltaTimeLength. Man könnte das Set von DeltaTimeLength auch weg lassen und die Nodes direkt mit dem Pin nach dem unten gezeigten Multiplikator verbinden, was aber etwas unübersichtlicher ist. Und für das Tutorial habe ich mich halt hierfür entschieden damit man auch etwas erkennen kann.


Also wir ziehen die Variable DeltaTimeLength nun in unser BP, verbinden den Exec Pin mit Event Tick. Dann ziehen wir DaySpeed in das BP und wählen Get. Als nächstes kommt noch ein Multiplyer float*float hinzu. Wir gehen nun vom Event Tick Delta Second in den oberen Pin vom Multiplikator und mit Day Speed in den unteren. Den Output verbinden wir mit Set Delta Time Length. Das sollte etwa so aussehen.

11550-007-deltatimelength-bp-png


Der Tag- und Nachtwechsel wird bei der Unreal Engine durch die Rotation der Lichtquelle dargestellt. Deswegen müssenwir dafür sorgen dass diese sich dreht.


Wir fügen also einen AddActorLocalRotation hinzu. Hier wird der Exec-Pin mit dem von Set Delta Time Length verbunden. Target verbinden wir mit der Variable LightSource, denn schließlich soll diese ja gedreht werden.

11551-008-rotaion-pitch-bp-png


Wir möchten nur den Pitch verbinden, deswegen klicken wir mit rechts auf den Pin von Delta Rotation und wählen Split Struct Pin. Nun sieht es aus wie im oberen Bild und wir können die Variable Delta Time Length mit Delta Rotation Y(Pitch) verbinden.

11552-addactorlocalrotationsplit-png


Damit die Sonne nun auch ihre Bahnen zieht müssen wir noch die Sky Sphere updaten. Das machen wir wie folgt.


Wir suchen uns die Node "UpdateSunDirection" raus und packen diese in unser BP. Als Target benutzen wir nun logischerweise unsere Sky Spherevariable, denn wir wollen die SkySphere ja schließlich updaten.

11553-009-update-sun-direction-bp-png


Nun können wir das Ganze schon einmal zwischen Compilieren und in die Levelansicht gehen. Dort packen wir unseren DayNight Actor in den Level rein. Positionen sind absolut unwichtig, da dieser eh nicht sichtbar ist.


Was wir dann schon einmal tun können, ist die Variablen füllen. Wir klicken gehen also unsere vier editierbaren Variablen durch und wählen entsprechende Objekte aus den Listen aus. Für Day Speed habe ich hier jetzt mal 20 gewählt, was ziemlich schnell ist und vielleicht nicht mit einer VR-Brille unbedingt ausprobiert werden sollte </p><p><a href=11554-actor-fill-png


Soweit sollte ein einfacher Tag und Nachtwechsel bereits funktionieren. Wem das also reicht, der kann hier getrost aufhören.


Aber wir wollen ja noch erkennen ob Nacht ist und das Licht entsprechend abdunkeln. Im Übrigen kann man folgende Funktionen nicht nur zum Abdunkeln verwenden. Dadurch das man weiß, ob Tag oder Nacht ist, kann man auch andere Ereignisse auslösen, wie zum Beispiel Vampire die Nachts unterwegs sind und alles Mögliche. Wenn man es noch etwas mehr erweitert kann man sogar nicht nur Tag und Nacht unterscheiden, sondern auch gewisse Tagesabschnitte. Der Einfachheit halber habe ich mich aber nur für die Unterscheidung von Tag und Nacht entschieden.


Fangen wir also an.


Als erstes bauen wir die Node "GetActorRotation" ein. Mit diesem fragen wir ab um wie viel Grad ein Actor gerade gedreht ist. Als Target verbinden wir diesen mit der Light Source Variablen. Auch hier brauchen wir im Ausgang nur den Pitchwert. Deswegen mit rechter Maustaste auf den Ausgangspin und Split Struct Pin auswählen, wie bereits oben beschrieben. Dahinter setzen wir ein Node mit der Bezeichnung "InRange (float)". Hier verbinden wir den Pitchausgang von "GetActorRotation" mit Value im "InRange" Eingang. Zusätzlich lassen wir den Min-Wert bei 0 und den Max-Wert setzen wir auf 180. Das entspricht den Werten für Sonnenuntergang und Sonnenaufgang. Alles was dazwischen ist bedeutet also es ist Nacht. Als Rückgabe gibt es einen Boolschen Wert den wir an die Variable Night Time weiter geben.

11555-010-trennung-dn-bp-png


Als nächstes fügen wir die beiden Funktionen "DayLightning" und "NightLightning" hinzu.

11556-011-functions-lightning-png


Beiden Funktionen fügen wir jeweils ein Input vom Typ Float hinzu. Diese nennen wir DeltaTime.


11557-013-function-inputs-png


Fangen wir nun mit der Funktion Night Lighting an. Leider war das BP etwas unübersichtlich, weswegen ich nur einen Gesamtscreenshot habe. Ich versuche es aber möglichst gut zu erklären.


Fangen wir mit der Deltatime an. Diese teilen wir mit eienm Dividor float/float durch 64. Dies macht einen sanfteren Übergang. Je geringer der Wert um so härter ist der Übergang.


Nun fügern wir eine Node ein mit der Bezeichnung FInertp To. Den Ausgang des Divisors verbinden wir nun mit Delta Time Input. Nun ziehen wir die Lightsource-Variable in das BP als Get. Diese verbinden wir nun mit Current. Alles dazwischen wird, wenn ihr alles richtig gemacht habe, automatisch eingefügt. Dann fügen wir die Funktionsnode Set Intensity ein. Wir verbinden Return Value mit New Intensity. Zudem verbinden wir Target mit Light Component, im Screenshot hinter Light Source. Dies regelt die Lichtstärke von Direct Light im Level.


Dasselbe machen wir nun noch einmal mit dem Sky light. Wir fügen also erneut eine Node FInterp To ein, verbinden Delta Time mit dem Divisor und als Current nehmen wir diesmal jedoch die Variable Sky Light. Zum Schluss fügen wir auch hier noch ein Set Intensity ein und Verbinden Target mit Light Component aus dem Sky Light und Return Value mit New Intensity.


Nun müssen wir natürlich noch sagen in welchen Bereich die Werte gehen sollen. Dazu setzen wir den Wert von Target auf 0,1 und Interp Speed auf 3. Hier darf auch gerne etwas experimentiert werden.


Beim FInterp vom Sky Light setzen wir Target auf 0,01 und Speed auf 5. Das sollte erstmal reichen.

11558-014-finction-night-ligght-png


Das schöne ist nun Day Lighting sieht fast genau so aus. Ihr könnt also alle Nodes, bis auf die Funktionseingangsnode natürlich, markieren, kopieren und in die Day Lightning Funktion einfügen.


Hier müsst ihr dann lediglich die Werte in den FInterp ändern. Und zwar, das Erste mit Target 3 und Interp Speed 4. Das Zweite bekommt als Target 0,5 und Interp Speed 8.

11559-015-day-light-png


Natürlich müssen wir das Ganze dann noch in inseren Event Graph einbinden.


Hierzu geht man von dem boolschen Set Night Time ab und verzweigt mit einem Branch. Über True wird dan Night Lighting angebunden(true =es ist Nacht) und unter False die Funktion Day Lighting.


Die Eingänge der beiden Funktionen, Delta Time werden und jeweils mit Delta Time Length verbunden.

11560-016-branch-daynight-png


Am Ende sollte der Eventgraph vollständig so aussehen.

&thumbnail=1


Nicht das Compilieren vergessen und schon habt ihr einen recht flexiblen Tag- Nachtzyklus der relativ leicht erweiterbar ist, zum experimentieren einlädt und das Levelblueprint schont.


Viel Spaß damit.

Über den Autor

Mal etwas mehr über mich.


Obwohl ich schon zu Zeiten des C64 mit Assembler angefangen habe, C (ohne ++) weiter gemacht habe und am Ende dann C# für mich entdeckt habe, bin ich nun bei der Unreal Engine und BP gelandet. Trotzdem würde ich mich eher als Anfänger bezeichnen, denn irgendwie lernt man beim Programmieren nie aus. Optimieren kann man immer und ständig jenseits einer "Hello World" - Anwendung.


Bei Artist, nun ja. Anfänger ist eigentlich übertrieben. Leider komme ich bei der Spieleprogrammierung nicht drumherum. Mir fehlt an der Stelle einfach etwas die Kreativität der bildlichen Vorstellungskraft und vor allem der geschickte Umgang mit der Maus in einer 3D-Umgebung.

Tomarr Urgestein

Kommentare