Menu
CoddyTech

Basculer selon l’état

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

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, de sorte que l’écran correspond 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 à zéro, Enter(Phase.Fight) change la phase, mais le cas Fight ne s’exécute qu’à l’image suivante, car cette image a déjà choisi son cas. Avec des blocs if séparés, l’un après l’autre, une image pourrait démarrer le combat et exécuter le code du combat pendant cette même image.

Enter est le seul endroit où phase est modifié. 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 également dans Enter et n’est exécuté qu’une fois, au lieu de l’être à chaque image.

challenge icon

Défi

Facile

Une course de tapotements : combien de fois peux-tu appuyer sur la barre d’espace en 5 secondes ? Le GameManager possède l’énumération GameState (Ready, Playing, GameOver), un panneau pour chaque état, et Start appelle SetState(GameState.Ready). Écris Update et SetState.

Dans Update, utilise une instruction switch sur state :

  • Ready : la barre d’espace démarre une manche. Cet appui ne compte pas comme un tapotement.
  • Playing : chaque appui sur la barre d’espace ajoute 1 à taps et l’affiche dans tapsText, sous la forme Taps: 3. Après roundTime secondes (5), la partie est terminée.
  • GameOver : la barre d’espace permet de revenir à Ready.

SetState(GameState next) définit state et affiche uniquement le panneau du nouvel état. En entrant dans Playing, une manche commence avec 0 tapotement, Taps: 0 à l’écran et roundTime secondes restantes ; en entrant dans GameOver, le résultat s’affiche dans resultText, sous la forme Taps: 3.

Appuie sur Jouer, 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 la valeur de state :
        // Ready : Space lance une manche
        // Playing : Space comptabilise un appui ; quand 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
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

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