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.
Défi
FacilePermets aux météores d’atteindre le GameManager par l’intermédiaire d’un singleton.
- Dans
GameManager.cs, ajoutepublic static GameManager Instance;et une méthodeAwake()contenantInstance = this;. - Dans
Meteor.cs, supprime le champgameet appelle plutôtGameManager.Instance.MeteorLanded()etGameManager.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
1Texte à l’écran
Canvas et texteAfficher le scoreFormater les nombresUn compte à reboursRécapitulatif : compteur de vitesse4Scènes et niveaux
Charger une scèneRedémarrer le niveauNiveau suivantConserver entre les scènesRécapitulatif : sélection du niveau2Boutons et écrans
Boutons et onClickLambdasRelier les éléments dans l’InspectorActiver et désactiver les panneauxBarres de santéRécapitulatif : boutique d’améliorations5Sauvegarder avec PlayerPrefs
Enregistrer un nombreCharger avec une valeur par défautMeilleur scoreEnregistrer les paramètresRécapitulatif : les pièces à la banque3Le gestionnaire du jeu
Un seul script gère le jeuLe SingletonLes états du jeuBasculer selon l’étatRécapitulatif : gestionnaire de manche6Projet : jeu de course sans fin
Trois voiesObstacles en vueEntraînez-vous par vous-même : Playground Unity