Hallo,
wenn man einen eigenen SceneFader in Unity gebastelt hat (die Hintergrundfarbe der Kamera wechselt per Lerp), dann muss dieser Fader ja vor dem Laden des Levels die Farbe abdunkeln und nach dem Laden das Levels die Farbe wieder zurücksetzen.
Zudem müssen die Methoden aufeinander warten, sonst beginnt der Farbwechsel und direkt danach das Laden, das muss abgewartet werden. Dafür nutze ich die Methode "WaitUntil"
Doku
Nun habe ich in jeder Scene ein leeres GameObject mit den benötigten Scripten, klar, diese Objekte werden beim Szenenwechsel zerstört.
Das ist der Controller:
|
C#-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class SceneController : SceneFader {
internal void LoadScene(string sceneName)
{
StartCoroutine(ManageSceneLoad(sceneName));
}
IEnumerator ManageSceneLoad(string sceneName)
{
yield return SceneFade(Color.red, Color.green); // TESTFARBEN
SceneManager.LoadScene(sceneName);
}
}
|
Und hier wird der Farbwechsel abgearbeitet:
|
C#-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class SceneFader : MonoBehaviour {
const float lerpSpeed = 2f;
internal WaitUntil SceneFade(Color startColor, Color endColor)
{
Camera sceneCamera = GameObject.FindGameObjectWithTag("MainCamera").GetComponent<Camera>();
float t = 0f;
return new WaitUntil(() => {
sceneCamera.backgroundColor = Color.Lerp(startColor, endColor, t += Time.deltaTime / lerpSpeed);
return t >= 1;
});
}
}
|
Wie man im Controller sehen kann, habe ich erst das FadeOut implementiert. Jetzt versuche ich das FadeIn hinzubekommen. Dies muss nach dem Laden der Szene passieren. In alten Posts ist von "OnSceneLoaded" etc. die Rede. Dies gibt es aber in der neuen Version alles nicht mehr. Ich hatte gedacht, dain der nächsten Szene wieder ein neues Objekt und ein neuer MenüController ist, ein einfacher Aufruf am Anfang der nächsten Szene per
|
C#-Quelltext
|
1
2
3
4
|
void Start()
{
SceneFade(Color.black, Color.blue); // Wieder aufhellen
}
|
würde das Problem lösen, aber ein Farbwechsel geschieht nicht.
Gibt es noch ein Event, wo man erreichen kann, dass Methoden direkt zu Beginn ausgeführt werden? Mit Start() und Awake() komme ich wohl nicht weit