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
Libérer: 2025-01-14 08:06:43
original
816 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

À 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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal