Day-Night-Cycle für Unity3d - Einfach umgesetzt

in unity3d •  7 years ago  (edited)

Heute möchte ich euch gerne einen automatischen Tag-Nacht-Wechsel vorstellen. Alles was ihr dazu braucht, sind 2 verschiedene Skyboxen (eine für den Tag und eine für die Nacht) und folgendes Script.

sunnight_01.PNG

Zuerst müsst ihr ein Directional Light in eure Szene einfügen und mit dem Tag "Sun" versehen. Das Taggen ist nicht unbedingt notwendig, aber ich habe mir angewöhnt GameObjecte mit passenden Tags zu versehen. Zusammenpassende GameObjekte erhalten dann natürlich das gleiche Tag.

Nun Positioniere ich das Directional Light auf Y (Hier in meinem Fall auf y=1890) Warum ich hier einen so hohen Wert genommen habe, frage ich mich gerade beim schreiben dieser Zeilen selbst. ;)
Anschließend hängt ihr ein leeres GameObjekt an das Directional Light mit den Positionen x und y = 0. z verschiebt ihr ein wenig in den negativen Bereich. Hier bei mir -3,77. (Alle Werte könnt ihr natürlich für euch anpassen. Das sollte an der Funktionsweise nichts verändern.

daynight_02.PNG

night_03.PNG

night04.PNG

Nun fügt ihr folgendes Script dem Directional Light zu.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NightSunZyklus : MonoBehaviour {

    [SerializeField]
    private bool _daySwitch;  // Variable um den TagNachtWechsel einzuleiten
    public float Speed;   //Geschwindigkeit der Rotation der Sonne
    public GameObject Hoehenmesser;   //Angehangenes GameObjekt am Directional Light
    public Light Sun;    //Directional Light Sun
    public Material SkyOne;  //Skybox für den Tag
    public Material SkyTwo; //Skybox für die Nacht


    void Update()
    {
         if (Hoehenmesser.transform.position.y <  1890.0F) /*Wenn ihr die y Position des Directional Lights verändert habt,   müsst ihr das hier anpassen. Prüft an welcher Stelle die "Sonne" sich befindet*/
        {
            if (!_daySwitch)
            {
                LightOff();
            }
            
        }
        else
        {
            if (_daySwitch)
            {
                LightOn();
            }
        }
    }

//hier wird der Rotation des Lichts durchgeführt
    void LateUpdate () {
        transform.Rotate(Vector3.right, Speed * Time.deltaTime);
    }

//Umschalten auf Nachtmodus
    void LightOff()
    {
        Sun.intensity = 0.025F;
        RenderSettings.skybox = SkyTwo;
        _daySwitch = true;
        Speed = 1F;
    }

//Umschalten auf Tagmodus
    void LightOn()
    {
        Sun.intensity = 1.5F;
        RenderSettings.skybox = SkyOne;
        _daySwitch = false;
        Speed = 0.05F;
    }
    

}

Mit der Werten der Variablen Speed und dem Sun.intensity müsst ihr etwas rumprobieren, bis das zu euren Anforderungen passt. Ich habe hier den Tag deutlich länger gemacht als die Nacht. Man will schließlich nicht die ganze Zeit im dunkeln spielen ;)


Ihr dürft das ganze natürlich frei nutzen, ändern und verwenden.
Wer Änderungen und/oder Verbesserungen zu o.g. Script hat, darf mir die natürlich gerne mitteilen.
Wer das Script nutzt darf mich gerne in seinen Credits als BroPowerGames aufführen. XD
BroPower_1920x1080_001.png

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

@trollolex, schau mal! :)

das is richtig cool sieht super aus!

Dankeschön....

Top!!!
☺☺☺

Danke 😊

einfache Implementation, gut gezeigt :)
finde nur leider, dass die Nacht im Video nicht so gut rüber kommt o: hast zwar erwähnt dass sie kurz ist, aber wirklich deutlich sehen tu ich sie gar nicht.. (gucks aber auch vom Smartphone aus, weiß nicht ob die Farben am PC vielleicht anders sind)

Die sieht man da auch nicht. Das ist der Sonnenaufgang. Ich wollte nur zeigen, wie sich die Sonne bewegt. 😉

achso - wegen des Titels und des Codes in dem ja die Skybox durch ne Nachtszene ersetzt wird, dachte ich die gehört da rein und war dann verwundert :D

Klar der Tag Nacht Wechsel konmt da auch. Aber eben nicht in dem kurzen Video. Hätte ich vielleicht etwas länger laufen lassen sollen. Und früher beginnen. Dann hätte man den Skyboxwechsel auch gesehen. Da habe ich nicht drüber nachgedacht. Fürs nächste mal 😬
Danke für den Konstruktive Einwand. 👍😉