Basculer selon l’état
Fait partie de la section Créer de vrais jeux du Journey Unity de Coddy. Leçon 15 sur 60.
Chaque état d’un jeu effectue un travail différent à chaque image. Un switch sur le champ d’état place ce travail dans un cas par état, et chaque image exécute exactement un cas. Le changement d’état passe par une seule méthode, afin que l’écran corresponde toujours à l’état. Ce combat de boss comporte une introduction, le combat et un écran de victoire :
public enum Phase { Intro, Fight, Won }
public class BossFight : MonoBehaviour
{
public GameObject introPanel;
public GameObject fightPanel;
public GameObject winPanel;
public int bossHp = 10;
private Phase phase;
private float timer = 3f;
void Start()
{
Enter(Phase.Intro);
}
void Update()
{
switch (phase)
{
case Phase.Intro:
timer -= Time.deltaTime;
if (timer <= 0f) Enter(Phase.Fight);
break;
case Phase.Fight:
if (bossHp <= 0) Enter(Phase.Won);
break;
case Phase.Won:
break;
}
}
void Enter(Phase next)
{
phase = next;
introPanel.SetActive(next == Phase.Intro);
fightPanel.SetActive(next == Phase.Fight);
winPanel.SetActive(next == Phase.Won);
}
}Chaque cas se termine par break, car C# refuse de compiler un cas qui se poursuit dans le suivant. Lorsque le minuteur de l’introduction arrive à son terme, Enter(Phase.Fight) change la phase, mais le cas Fight ne s’exécute qu’à l’image suivante, car l’image en cours a déjà sélectionné son cas. Avec des blocs if séparés placés les uns à la suite des autres, une image pourrait démarrer le combat et exécuter le code du combat dans la même image.
Enter est le seul endroit où phase change. next == Phase.Fight vaut true uniquement pour le panneau du combat ; un seul appel affiche donc ce panneau et masque les deux autres. Le travail lié à l’entrée dans un état, comme la réinitialisation d’un minuteur, se fait aussi dans Enter et ne s’exécute qu’une seule fois, au lieu de s’exécuter à chaque image.
Défi
FacileCrée le défi de clics de 5 secondes.
- Dans
SetState, affiche uniquement le panneau du nouvel état. Le passage à Playing définittaps = 0,timeLeft = roundTimeetTaps: 0; le passage à GameOver afficheTaps: 3dansresultText. - Dans
Update(),switch (state): la barre d’espace fait passer de Ready à Playing et de GameOver à Ready ; en état Playing, chaque pression sur la barre d’espace incrémentetapset met à jourtapsTextjusqu’à la fin du temps imparti.
Appuie sur « Jouer » et fais deux courses. Puis appuie sur « Vérifier ».
Essayez vous-même
using UnityEngine;
using TMPro;
public enum GameState { Ready, Playing, GameOver }
public class GameManager : MonoBehaviour
{
public GameObject readyPanel;
public GameObject playPanel;
public GameObject gameOverPanel;
public TMP_Text tapsText;
public TMP_Text resultText;
public float roundTime = 5f;
public GameState state;
private int taps;
private float timeLeft;
void Start()
{
SetState(GameState.Ready);
}
void Update()
{
// selon state :
// Ready : Space lance une manche
// Playing : Space comptabilise un appui ; lorsque le temps est écoulé, la partie se termine
// GameOver : Space revient à Ready
}
void SetState(GameState next)
{
state = next;
// afficher uniquement le panneau du nouvel état
// une nouvelle manche commence avec 0 appuis et dure roundTime secondes ; à la fin, resultText affiche le nombre d’appuis
}
}
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