Contenu du cours
Jeu de Combat dans Unity
Jeu de Combat dans Unity
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
?
Merci pour vos commentaires !