Heim >Backend-Entwicklung >C++ >Warum wird mein Unity Game Manager-Skript nur einmal ausgeführt und wie kann ich es szenenübergreifend persistent machen?

Warum wird mein Unity Game Manager-Skript nur einmal ausgeführt und wie kann ich es szenenübergreifend persistent machen?

Barbara Streisand
Barbara StreisandOriginal
2025-01-14 08:06:43816Durchsuche

Why Does My Unity Game Manager Script Only Run Once, and How Can I Make It Persistent Across Scenes?

Unity Game Manager: Szenarioübergreifende Persistenzprobleme und Lösungen

Frage:

Game Manager-Skripte, die so konzipiert sind, dass sie szenenübergreifend bestehen bleiben, werden bei der Projektinitialisierung nur einmal ausgeführt, auch wenn sie in allen Szenen vorhanden sind.

Grund:

Jedes Unity-Projekt erfordert eine „Preload-Szene“ als zentralen Hub für persistente Objekte und Systeme. Dieses Szenario muss in den Build-Einstellungen als Szenario 0 angegeben werden.

Lösung:

  1. Erstellen Sie eine vorinstallierte Szene:

    • Fügen Sie in den Build-Einstellungen eine neue Szene mit dem Namen „Preload“ hinzu und kennzeichnen Sie sie als Szene 0.
  2. Vorinstalliertes Spielobjekt hinzufügen:

    • Erstellen Sie in der Preload-Szene ein leeres Spielobjekt mit dem Namen „__app“.
  3. DontDestroyOnLoad anwenden:

    • Fügen Sie das „DontDestroyOnLoad“-Skript (oder die Komponente) zum „__app“-Spielobjekt hinzu. Dieses Skript stellt sicher, dass das Objekt und seine Komponenten über Szenenwechsel hinweg persistent bleiben.
  4. Übliches Verhalten in der Preload-Szene platzieren:

    • Die gesamte gemeinsame Spiellogik, wie Datenbankverbindungen, Soundeffekte und Punktestand, sollte auf dem Spielobjekt „__app“ in der vorinstallierten Szene platziert werden.

Komponenten in anderen Szenen finden:

Um auf diese persistenten Komponenten aus anderen Szenen zuzugreifen, können Sie die statische Methode „Object.FindObjectOfType()“ verwenden. Zum Beispiel:

<code class="language-C#">SoundEffects sound = Object.FindObjectOfType<SoundEffects>();
GameState state = Object.FindObjectOfType<GameState>();</code>

Optionale Optimierung:

Um die Codeduplizierung zu reduzieren, sollten Sie das folgende globale Skript verwenden:

<code class="language-C#">public static class App
{
    public static SoundEffects SoundEffects { get; private set; }
    public static GameState GameState { get; private set; }

    static App()
    {
        GameObject appObject = GameObject.Find("__app");
        SoundEffects = appObject.GetComponent<SoundEffects>();
        GameState = appObject.GetComponent<GameState>();
    }
}</code>

Mit diesem Skript können Sie mit einer vereinfachten Syntax auf diese Komponenten zugreifen:

<code class="language-C#">App.SoundEffects.PlayExplosion();
App.GameState.CurrentLevel = 5;</code>

Entwicklungskomfort:

Um die Entwicklungseffizienz zu verbessern, können Sie erwägen, der „Preload“-Szene ein Skript hinzuzufügen. Wenn das „__app“-Objekt nicht vorhanden ist, wird die „Preload“-Szene während der Projektinitialisierung automatisch geladen. Dadurch wird sichergestellt, dass das Spiel jedes Mal, wenn auf „Play“ geklickt wird, mit der „Preload“-Szene beginnt.

Das obige ist der detaillierte Inhalt vonWarum wird mein Unity Game Manager-Skript nur einmal ausgeführt und wie kann ich es szenenübergreifend persistent machen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn