Menu
CoddyTech

Le Singleton

Fait partie de la section Créer de vrais jeux du Journey Unity de Coddy. Leçon 13 sur 60.

Une référence de l’Inspecteur a besoin d’un objet sur lequel être déposée. Les ennemis qu’un générateur crée pendant le jeu proviennent d’un prefab, et un prefab ne peut pointer que vers des ressources et vers ses propres composants, jamais vers un objet d’une scène. Leur champ GameManager est donc vide. La solution habituelle est un singleton : le GameManager se stocke lui-même dans un champ auquel chaque script peut accéder à l’aide du nom de la classe.

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;
    private int kills;

    void Awake()
    {
        Instance = this;
    }

    public void EnemyDown()
    {
        kills++;
        Debug.Log("Kills: " + kills);
    }
}
// Enemy.cs, sur le prefab de l'ennemi
public void Die()
{
    GameManager.Instance.EnemyDown();
    Destroy(gameObject);
}

static signifie que le champ appartient à la classe, et non à un objet. Chaque objet GameManager aurait son propre kills, mais il n’y a qu’une seule Instance dans tout le jeu, à laquelle tu accèdes avec le nom de la classe : GameManager.Instance. N’importe quel script peut la lire, y compris un ennemi apparu il y a une minute, sans avoir de champ propre à renseigner.

Le gestionnaire définit Instance = this; dans Awake, où this désigne le script lui-même. Unity exécute tous les Awake de la scène avant le moindre Start, afin que les autres scripts puissent utiliser GameManager.Instance dès leur Start. Un deuxième GameManager dans la scène remplacerait Instance par lui-même ; le chapitre Scenes and Levels montre comment éviter cela.

challenge icon

Défi

Facile

Permets aux météores d’atteindre le GameManager par l’intermédiaire d’un singleton.

  1. Dans GameManager.cs, ajoute public static GameManager Instance; et une méthode Awake() contenant Instance = this;.
  2. Dans Meteor.cs, supprime le champ game et appelle plutôt GameManager.Instance.MeteorLanded() et GameManager.Instance.MeteorCaught().

Appuie sur « Jouer » et attrape un météore : Caught: 1 s’affiche, sans erreur dans la Console. Puis appuie sur « Vérifier ».

Essayez vous-même

using UnityEngine;
using TMPro;

public class GameManager : MonoBehaviour
{
    public TMP_Text caughtText;
    public TMP_Text shieldText;
    private int caught;
    private int shield = 3;

    public void MeteorCaught()
    {
        caught++;
        caughtText.text = "Caught: " + caught;
    }

    public void MeteorLanded()
    {
        shield--;
        shieldText.text = "Shield: " + shield;
    }
}

Toutes les leçons de Créer de vrais jeux

Entraînez-vous par vous-même : Playground Unity