Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Créer le Menu Principal | Améliorer le Jeu
Jeu de Combat dans Unity
course content

Contenu du cours

Jeu de Combat dans Unity

Jeu de Combat dans Unity

1. Système d'Animation Unity
2. Comportement du Joueur
3. Comportement de l'Ennemi
4. Améliorer le Jeu
5. Améliorer le Jeu Flappy Bird

book
Créer le Menu Principal

Menu Principal

Script pour le Menu Principal

using UnityEngine;
using UnityEngine.SceneManagement;

public class MainUI : MonoBehaviour
{
    public void StatTheGame()
    {
        SceneManager.LoadScene(1);
    }

    public void Quit()
    {
        Application.Quit();
    }
}

La classe MainUI est un script simple qui fournit les fonctionnalités pour démarrer le jeu et quitter l'application. Ce script est destiné à être utilisé avec des boutons d'interface utilisateur dans Unity.

Définition de la classe et méthodes

La méthode StatTheGame est conçue pour lancer le jeu en chargeant une nouvelle scène. Plus précisément, SceneManager.LoadScene(1) indique à Unity de charger la scène avec l'index de build 1, qui correspond à sa position dans les paramètres de build.

La méthode Quit permet de fermer l'application en appelant Application.Quit(), bien que cette fonctionnalité ne soit effective que dans une application compilée et non dans l'éditeur Unity.

Utilisation dans Unity

Attacher le script

Créer un GameObject (par exemple, un GameObject vide ou un élément UI). Attacher le script MainUI au GameObject en faisant glisser le script dessus ou en utilisant le bouton Add Component dans l'Inspector.

Configuration des boutons UI

Créer un bouton UI (par exemple, GameObject > UI > Button). Sélectionner le bouton et aller dans l'Inspector. Dans la section On Click (), cliquer sur le bouton + pour ajouter un nouvel événement. Faire glisser le GameObject auquel le script MainUI est attaché dans le champ objet. Dans le menu déroulant, sélectionner MainUI > functionName.

Game Manager

Script pour Game Manager

public class GameManager : MonoBehaviour
{
    public GameStates GameState { private set; get; }
    public static event System.Action<GameStates> onGameStateChanges;
    public static GameManager instance;

    void Awake()
    {
        if (instance != null)
        {
            Destroy(gameObject);
            return;
        }
        instance = this;
        DontDestroyOnLoad(gameObject);
    }

    void Start()
    {
        GameState = GameStates.Playing;
        onGameStateChanges?.Invoke(GameState);
    }

    public void FinishGame()
    {
        GameState = GameStates.Finished;
        onGameStateChanges?.Invoke(GameState);
    }
}

public enum GameStates
{
    Playing,
    Finished,
}

La classe GameManager est responsable de la gestion de l'état du jeu. Elle utilise le pattern singleton pour garantir qu'il n'existe qu'une seule instance de GameManager dans le jeu, gère l'état du jeu et diffuse les changements d'état à l'aide d'événements.

Définition de la classe et variables membres

Méthodes

Méthode Awake

void Awake()
{
    if (instance != null)
    {
        Destroy(gameObject);
        return;
    }
    instance = this;
    DontDestroyOnLoad(gameObject);
}

But : Garantit qu'il n'existe qu'une seule instance de GameManager et empêche sa destruction lors du chargement de nouvelles scènes.

Patron Singleton : Vérifie si une instance existe déjà. Si c'est le cas, le doublon est détruit. Sinon, l'instance est assignée et l'objet est marqué pour ne pas être détruit lors du chargement d'une nouvelle scène.

Méthode Start

void Start()
{
    GameState = GameStates.Playing;
    onGameStateChanges?.Invoke(GameState);
}

But : Initialise l'état du jeu à Playing au démarrage du jeu et déclenche l'événement onGameStateChanges.

Méthode FinishGame

public void FinishGame()
{
    GameState = GameStates.Finished;
    onGameStateChanges?.Invoke(GameState);
}

But : Définit l'état du jeu sur Finished et déclenche l'événement onGameStateChanges.

Enum GameStates

public enum GameStates
{
    Playing,
    Finished,
}

But : Définit les états possibles du jeu.

Réaction de l'ennemi aux changements d'état du jeu

private void GameManager_onGameStateChanges(GameStates state)
{
    if (state == GameStates.Finished)
    {
        stateManager.ChangeState(idle);
    }
}

Cette méthode gère les changements d'état du jeu. Lorsque l'état du jeu passe à Finished, l'état de l'ennemi est changé en idle.

Panneau de fin

Script pour le panneau de fin

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.SceneManagement;

public class FinishPanel : MonoBehaviour
{
    [SerializeField] Player player;
    [SerializeField] GameObject panel;
    [SerializeField] TMP_Text infoText;

    private void Start()
    {
        GameManager.onGameStateChanges += GameManager_onGameStateChanges;
    }

    private void GameManager_onGameStateChanges(GameStates obj)
    {
        if (obj == GameStates.Finished)
        {
            panel.SetActive(true);
            OnGameFinished();
        }
    }

    void OnGameFinished()
    {
        if (player.isDead)
        {
            infoText.text = "You lost";
            infoText.color = Color.red;
        }
        else
        {
            infoText.text = "You Won";
            infoText.color = Color.green;
        }
    }

    public void BackToMainMenu()
    {
        SceneManager.LoadScene(0);
    }

    public void Quit()
    {
        Application.Quit();
    }
}

La classe FinishPanel gère l'affichage et la fonctionnalité du panneau de fin qui apparaît à la fin de la partie. Ce panneau fournit un retour au joueur sur la victoire ou la défaite et propose des options pour revenir au menu principal ou quitter le jeu.

Explication

Méthodes

Méthode Start

private void Start()
{
    GameManager.onGameStateChanges += GameManager_onGameStateChanges;
}

But : S'abonne à l'événement GameManager.onGameStateChanges pour écouter les changements d'état du jeu.

Méthode GameManager_onGameStateChanges

private void GameManager_onGameStateChanges(GameStates obj)
{
    if (obj == GameStates.Finished)
    {
        panel.SetActive(true);
        OnGameFinished();
    }
}

But : Gère les changements d'état du jeu. Lorsque l'état du jeu est Finished, active le panneau de fin et appelle OnGameFinished.

Méthode OnGameFinished

void OnGameFinished()
{
    if (player.isDead)
    {
        infoText.text = "You lost";
        infoText.color = Color.red;
    }
    else
    {
        infoText.text = "You Won";
        infoText.color = Color.green;
    }
}

But : Met à jour le texte du panneau de fin en fonction de l'état du joueur (mort ou vivant).

Logique : Si le joueur est mort, la méthode affiche "You lost" en rouge. Si le joueur est vivant, elle affiche "You Won" en vert.

Méthode BackToMainMenu

public void BackToMainMenu()
{
    SceneManager.LoadScene(0);
}

But : Charge la scène du menu principal (index de build 0) lorsqu'elle est appelée. Cette méthode est destinée à être liée à un bouton dans l'interface utilisateur.

Méthode Quit

public void Quit()
{
    Application.Quit();
}

But : Ferme l'application lorsqu'elle est appelée. Cette méthode est destinée à être liée à un bouton dans l'interface utilisateur.

Résumé

La classe FinishPanel affiche les résultats de fin de partie et propose des options pour revenir au menu principal ou quitter. Elle s'abonne à GameManager.onGameStateChanges pour se mettre à jour de manière appropriée lorsque la partie se termine, améliorant ainsi l'expérience utilisateur grâce à un retour clair et des options intuitives.

1. Que se passe-t-il lorsque la méthode FinishGame est appelée dans la classe GameManager ?

2. Que se passe-t-il lorsque le GameManager change l'état du jeu en GameStates.Finished ?

question mark

Que se passe-t-il lorsque la méthode FinishGame est appelée dans la classe GameManager ?

Select the correct answer

question mark

Que se passe-t-il lorsque le GameManager change l'état du jeu en GameStates.Finished ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 4. Chapitre 3

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

course content

Contenu du cours

Jeu de Combat dans Unity

Jeu de Combat dans Unity

1. Système d'Animation Unity
2. Comportement du Joueur
3. Comportement de l'Ennemi
4. Améliorer le Jeu
5. Améliorer le Jeu Flappy Bird

book
Créer le Menu Principal

Menu Principal

Script pour le Menu Principal

using UnityEngine;
using UnityEngine.SceneManagement;

public class MainUI : MonoBehaviour
{
    public void StatTheGame()
    {
        SceneManager.LoadScene(1);
    }

    public void Quit()
    {
        Application.Quit();
    }
}

La classe MainUI est un script simple qui fournit les fonctionnalités pour démarrer le jeu et quitter l'application. Ce script est destiné à être utilisé avec des boutons d'interface utilisateur dans Unity.

Définition de la classe et méthodes

La méthode StatTheGame est conçue pour lancer le jeu en chargeant une nouvelle scène. Plus précisément, SceneManager.LoadScene(1) indique à Unity de charger la scène avec l'index de build 1, qui correspond à sa position dans les paramètres de build.

La méthode Quit permet de fermer l'application en appelant Application.Quit(), bien que cette fonctionnalité ne soit effective que dans une application compilée et non dans l'éditeur Unity.

Utilisation dans Unity

Attacher le script

Créer un GameObject (par exemple, un GameObject vide ou un élément UI). Attacher le script MainUI au GameObject en faisant glisser le script dessus ou en utilisant le bouton Add Component dans l'Inspector.

Configuration des boutons UI

Créer un bouton UI (par exemple, GameObject > UI > Button). Sélectionner le bouton et aller dans l'Inspector. Dans la section On Click (), cliquer sur le bouton + pour ajouter un nouvel événement. Faire glisser le GameObject auquel le script MainUI est attaché dans le champ objet. Dans le menu déroulant, sélectionner MainUI > functionName.

Game Manager

Script pour Game Manager

public class GameManager : MonoBehaviour
{
    public GameStates GameState { private set; get; }
    public static event System.Action<GameStates> onGameStateChanges;
    public static GameManager instance;

    void Awake()
    {
        if (instance != null)
        {
            Destroy(gameObject);
            return;
        }
        instance = this;
        DontDestroyOnLoad(gameObject);
    }

    void Start()
    {
        GameState = GameStates.Playing;
        onGameStateChanges?.Invoke(GameState);
    }

    public void FinishGame()
    {
        GameState = GameStates.Finished;
        onGameStateChanges?.Invoke(GameState);
    }
}

public enum GameStates
{
    Playing,
    Finished,
}

La classe GameManager est responsable de la gestion de l'état du jeu. Elle utilise le pattern singleton pour garantir qu'il n'existe qu'une seule instance de GameManager dans le jeu, gère l'état du jeu et diffuse les changements d'état à l'aide d'événements.

Définition de la classe et variables membres

Méthodes

Méthode Awake

void Awake()
{
    if (instance != null)
    {
        Destroy(gameObject);
        return;
    }
    instance = this;
    DontDestroyOnLoad(gameObject);
}

But : Garantit qu'il n'existe qu'une seule instance de GameManager et empêche sa destruction lors du chargement de nouvelles scènes.

Patron Singleton : Vérifie si une instance existe déjà. Si c'est le cas, le doublon est détruit. Sinon, l'instance est assignée et l'objet est marqué pour ne pas être détruit lors du chargement d'une nouvelle scène.

Méthode Start

void Start()
{
    GameState = GameStates.Playing;
    onGameStateChanges?.Invoke(GameState);
}

But : Initialise l'état du jeu à Playing au démarrage du jeu et déclenche l'événement onGameStateChanges.

Méthode FinishGame

public void FinishGame()
{
    GameState = GameStates.Finished;
    onGameStateChanges?.Invoke(GameState);
}

But : Définit l'état du jeu sur Finished et déclenche l'événement onGameStateChanges.

Enum GameStates

public enum GameStates
{
    Playing,
    Finished,
}

But : Définit les états possibles du jeu.

Réaction de l'ennemi aux changements d'état du jeu

private void GameManager_onGameStateChanges(GameStates state)
{
    if (state == GameStates.Finished)
    {
        stateManager.ChangeState(idle);
    }
}

Cette méthode gère les changements d'état du jeu. Lorsque l'état du jeu passe à Finished, l'état de l'ennemi est changé en idle.

Panneau de fin

Script pour le panneau de fin

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.SceneManagement;

public class FinishPanel : MonoBehaviour
{
    [SerializeField] Player player;
    [SerializeField] GameObject panel;
    [SerializeField] TMP_Text infoText;

    private void Start()
    {
        GameManager.onGameStateChanges += GameManager_onGameStateChanges;
    }

    private void GameManager_onGameStateChanges(GameStates obj)
    {
        if (obj == GameStates.Finished)
        {
            panel.SetActive(true);
            OnGameFinished();
        }
    }

    void OnGameFinished()
    {
        if (player.isDead)
        {
            infoText.text = "You lost";
            infoText.color = Color.red;
        }
        else
        {
            infoText.text = "You Won";
            infoText.color = Color.green;
        }
    }

    public void BackToMainMenu()
    {
        SceneManager.LoadScene(0);
    }

    public void Quit()
    {
        Application.Quit();
    }
}

La classe FinishPanel gère l'affichage et la fonctionnalité du panneau de fin qui apparaît à la fin de la partie. Ce panneau fournit un retour au joueur sur la victoire ou la défaite et propose des options pour revenir au menu principal ou quitter le jeu.

Explication

Méthodes

Méthode Start

private void Start()
{
    GameManager.onGameStateChanges += GameManager_onGameStateChanges;
}

But : S'abonne à l'événement GameManager.onGameStateChanges pour écouter les changements d'état du jeu.

Méthode GameManager_onGameStateChanges

private void GameManager_onGameStateChanges(GameStates obj)
{
    if (obj == GameStates.Finished)
    {
        panel.SetActive(true);
        OnGameFinished();
    }
}

But : Gère les changements d'état du jeu. Lorsque l'état du jeu est Finished, active le panneau de fin et appelle OnGameFinished.

Méthode OnGameFinished

void OnGameFinished()
{
    if (player.isDead)
    {
        infoText.text = "You lost";
        infoText.color = Color.red;
    }
    else
    {
        infoText.text = "You Won";
        infoText.color = Color.green;
    }
}

But : Met à jour le texte du panneau de fin en fonction de l'état du joueur (mort ou vivant).

Logique : Si le joueur est mort, la méthode affiche "You lost" en rouge. Si le joueur est vivant, elle affiche "You Won" en vert.

Méthode BackToMainMenu

public void BackToMainMenu()
{
    SceneManager.LoadScene(0);
}

But : Charge la scène du menu principal (index de build 0) lorsqu'elle est appelée. Cette méthode est destinée à être liée à un bouton dans l'interface utilisateur.

Méthode Quit

public void Quit()
{
    Application.Quit();
}

But : Ferme l'application lorsqu'elle est appelée. Cette méthode est destinée à être liée à un bouton dans l'interface utilisateur.

Résumé

La classe FinishPanel affiche les résultats de fin de partie et propose des options pour revenir au menu principal ou quitter. Elle s'abonne à GameManager.onGameStateChanges pour se mettre à jour de manière appropriée lorsque la partie se termine, améliorant ainsi l'expérience utilisateur grâce à un retour clair et des options intuitives.

1. Que se passe-t-il lorsque la méthode FinishGame est appelée dans la classe GameManager ?

2. Que se passe-t-il lorsque le GameManager change l'état du jeu en GameStates.Finished ?

question mark

Que se passe-t-il lorsque la méthode FinishGame est appelée dans la classe GameManager ?

Select the correct answer

question mark

Que se passe-t-il lorsque le GameManager change l'état du jeu en GameStates.Finished ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 4. Chapitre 3
some-alt