Maison >développement back-end >C++ >Pourquoi mon script Unity Game Manager ne s'exécute-t-il qu'une seule fois et comment puis-je le rendre persistant dans toutes les scènes ?

Pourquoi mon script Unity Game Manager ne s'exécute-t-il qu'une seule fois et comment puis-je le rendre persistant dans toutes les scènes ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-14 08:06:43813parcourir

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

Unity Game Manager : Problèmes de persistance entre scénarios et solutions

Question :

Les scripts Game Manager conçus pour être persistants dans toutes les scènes ne seront exécutés qu'une seule fois lors de l'initialisation du projet, même s'ils sont présents dans toutes les scènes.

Raison :

Chaque projet Unity nécessite une « scène de préchargement » comme plaque tournante centrale pour les objets et systèmes persistants. Ce scénario doit être spécifié comme scénario 0 dans les paramètres de build.

Solution :

  1. Créer une scène préchargée :

    • Dans les paramètres de construction, ajoutez une nouvelle scène appelée "préchargement" et désignez-la comme scène 0.
  2. Ajouter un objet de jeu préchargé :

    • Dans la scène de préchargement, créez un objet de jeu vide nommé "__app".
  3. Appliquer DontDestroyOnLoad :

    • Ajoutez le script (ou composant) "DontDestroyOnLoad" à l'objet de jeu "__app". Ce script garantit que l'objet et ses composants restent persistants lors des changements de scène.
  4. Placer le comportement courant dans la scène de préchargement :

    • Toute la logique de jeu partagée, telle que les connexions à la base de données, les effets sonores et la notation, doit être placée sur l'objet de jeu « __app » dans la scène préchargée.

Trouver des composants dans d'autres scènes :

Pour accéder à ces composants persistants depuis d'autres scènes, vous pouvez utiliser la méthode statique "Object.FindObjectOfType()". Par exemple :

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

Optimisation optionnelle :

Pour réduire la duplication de code, pensez à utiliser le script global suivant :

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

À l'aide de ce script, vous pouvez accéder à ces composants en utilisant une syntaxe simplifiée :

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

Confort de développement :

Afin d'améliorer l'efficacité du développement, vous pouvez envisager d'ajouter un script à la scène "preload". Si l'objet "__app" n'existe pas, la scène "preload" sera automatiquement chargée lors de l'initialisation du projet. Cela garantit que le jeu démarre à partir de la scène « préchargement » à chaque fois que l'on clique sur « Jouer ».

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn