Hey!
Ihr habt das Tutorial vielleicht schon auf meinem Channel gesehen, hier aber auf Deutsch!
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
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:
#pragma once
#include "Engine/Light.h"
#include "DayTimeLight.generated.h"
/**
*
*/
UCLASS()
class ADayTimeLight : public ALight
{
GENERATED_UCLASS_BODY()
void Tick(float DeltaSeconds) OVERRIDE;
virtual void BeginPlay() OVERRIDE;
float SunSpeed = 0.5f;
public:
UPROPERTY(VisibleAnywhere, Category = "Light")
TSubobjectPtr<UDirectionalLightComponent> DirlightComp;
private:
FVector MyRot;
};
Alles anzeigen
Und folgendes in eure CPP Datei:
#include "UltimateTutorials.h"
#include "DayTimeLight.h"
ADayTimeLight::ADayTimeLight(const class FPostConstructInitializeProperties& PCIP)
: Super(PCIP)
{
PrimaryActorTick.bCanEverTick = true;
DirlightComp = PCIP.CreateDefaultSubobject<UDirectionalLightComponent>(this, "DirLight");
RootComponent = DirlightComp;
}
void ADayTimeLight::Tick(float DeltaSeconds){
Super::Tick(DeltaSeconds);
FRotator SunRot = GetActorRotation();
MyRot.X += SunSpeed*DeltaSeconds;
if (MyRot.X > 360)
MyRot.X -= 360;
SunRot.Pitch = MyRot.X;
SunRot.Roll = MyRot.Y;
SunRot.Yaw = MyRot.Z;
SetActorRotation(SunRot);
}
void ADayTimeLight::BeginPlay()
{
Super::BeginPlay();
DirlightComp->SetMobility(EComponentMobility::Movable);
FRotator SunRot = GetActorRotation();
MyRot.X = SunRot.Pitch;
MyRot.Y = SunRot.Roll;
MyRot.Z = SunRot.Yaw;
}
Alles anzeigen
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!)