Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

1

29.11.2016, 12:26

eigenen SceneFader bauen, nach dem Laden Routinen ausführen

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 ?(

Superwayne

Treue Seele

Beiträge: 242

Beruf: Student & App Entwickler (Xamarin)

  • Private Nachricht senden

2

29.11.2016, 13:43

Wenn du dein Objekt nicht beim Szenenwechsel zerstören lässt (DontDestroyOnLoad) kannst du einen Listener bei UnityEngine.SceneManagement.SceneManager.activeSceneChanged anmelden um herauszufinden, wann die Scene gewechselt wurde.


Bispielsweise:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class SceneController : SceneFader {

    private void Awake()
    {
        DontDestroyOnLoad(gameObject);
    }

    private void OnEnable()
    {
        UnityEngine.SceneManagement.SceneManager.activeSceneChanged += SceneManager_activeSceneChanged;
    }

    private void OnDisable()
    {
        UnityEngine.SceneManagement.SceneManager.activeSceneChanged -= SceneManager_activeSceneChanged;
    }

    private void SceneManager_activeSceneChanged(UnityEngine.SceneManagement.Scene prevScene, UnityEngine.SceneManagement.Scene newScene)
    {
        // Start the fade from green to red
    }

    internal void LoadScene(string sceneName)
    {
       StartCoroutine(ManageSceneLoad(sceneName));
    }

    IEnumerator ManageSceneLoad(string sceneName)
    {
        yield return SceneFade(Color.red, Color.green); // TESTFARBEN
        SceneManager.LoadScene(sceneName);
    }
}

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

3

29.11.2016, 17:54

Cool, vielen Dank für die Hilfe!

Werbeanzeige