Time of Day - Blueprint

  • Hey!
    Ihr habt das Tutorial vielleicht schon auf meinem Channel gesehen, hier aber auf Deutsch! :D
    Im Anhang mal ein Screenshot vom Blueprint.


    Blueprint:
    Platziert ein DirectionalLight
    Stellt es auf Moveable.
    Öffnet den LevelBlueprint
    Erstellt eine float Variable SunSpeed (Mit einem Speed von 2 dauert eine Komplettrotation der Sonne so 3 1/2 Min)
    Platziert das Event Tick und verbindet es mit AddActorLocalRotation
    Das Target von AddActorLocalRotation ist euer DirectionalLight (eure Sonne). z.b. DirectionalLight1
    Verbindet AddActorLocalRotation mit UpdateSunDirection
    Target von UpdateSunDirection ist die Skybox (euer Himmel) z.b. BP_Sky_sphere
    Als nächstes platziert ihr die Variable SunSpeed und verbindet sie zu einem float*float.
    In den Zweiten Eingang von float*float kommen die DeltaSeconds von Tick (deltaSeconds = Zeit die seit dem letzten Frame(Bild) vergangen ist)
    Das float*float verbindet ihr dann in ein MakeRot und zwar in entweder den Pitch oder Yaw aber ich bevorzuge Pitch, da Yaw nicht so toll funktioniert
    Letzten Endes die ReturnValue von MakeRot in die DeltaRotation von AddActorLocalRotation


    Compile, Play, Fertig :D


    C++:
    ACHTUNG: Funktioniert (noch) nicht mit der Standard SkySphere von UE4
    Geht in euer Projekt und fügt einen neuen Code hinzu.
    Wählt "Alle Anzeigen" und wählt "Actor->Light"
    Gebt einen Namen ein, fertig. Auf in VS 2013


    Geht in die erstellte Header Datei und fügt folgenden Code hinein:


    Und folgendes in eure CPP Datei:



    Kompatiblität mit SkySphere:
    Kopiert euch (wenn ihr wollt) die SkySphere in euer Projekt.
    Ihr findet sie in: "4.2\Engine\Content\EngineSky" (alles Kopieren zu eurem Projekt)
    Jetzt öffnet die Kopierte SkySphere in eurem Projekt.
    Schaut in "ConstructionScript" und "UpdateSunDirection" (im Graph Menü)
    Löscht dort alle Nodes die heißen "DirectionalLightComponent"
    Wählt "DirectionalLightComponent" in der Variablen Liste aus und ändert den Typ auf "Light" (oder euer eigenes Licht, z.B. "MyToDLight")
    Jetzt platziert ihr überall wo eine "DirectionalLightComponent" Node war, die neue veränderte Node und verbindet sie wie vorher.
    Jetzt Compile klicken und Speichern.
    Löscht die alte SkySphere aus dem Level und Platziert die neue.
    Wählt sie aus und im "Details" Menü wählt ihr bei "DirectionalLightComponent" euer Directional Light.
    Jetzt müsste alles gehen :)


    (ACHTUNG: Es gibt ein Problem mit meinem Code, das ich gerade nocht fixe! Es wird einen Fehler geben der sagt "Accessed None from LightComponent". Außerdem wird sich die Position der Sonne auf der SkySphere nicht ändern.
    Ich arbeite noch daran!)

  • Vorschlag für die C++ Variante, verwende vielleicht besser ein Timer anstatt das Tick Event.


    Tick sollte man m.E. so wenig wie möglich (wenn auch soviel wie nötig haha) verwenden.
    Nebenbei hat das auch noch praktische Vorteile wie z.B. das einfache Pausieren insbesondere wann man noch andere Timer verwendet.


    Gruß Shura

  • Ich weiß schon das man Tick nicht benutzen sollte (oder halt so selten wie möglich).
    Schau mal in den Thread "Delay mit C++"
    Da hatte ich diesen Code vorgeschlagen bekommen:

    Code
    GetWoldTimerManager.SetTimer(this, &NAMESPACE::FUNCTIONNAME, Zeit, bLooping)


    Den hab ich so eingebaut:

    Code
    GetWorldTimerManager().SetTimer(this, &AFlickeringLightBrightness::Flicker, 0.3f, true);


    Allerdings hat der nicht funktioniert.