Exercice 1: Bases C#, Simulation d'un combat RPG --- "Tuer" un GameObject

Dans cette page, nous allons apprendre à "tuer" un GameObject dans notre jeu, à l'aide de notre méthode Mort().

Comment tuer un GameObject ?

Pour commencer, nous allons utiliser la méthode Mort(). Cette méthode est censée "tuer" le personnage qui la possède. Mais comment procéder exactement ? Il existe plusieurs façons de "tuer" un objet dans un jeu vidéo fait avec Unity.

1. Rendre un objet inactif 

La première méthode consiste à rendre un objet inactif. Vous pouvez le faire manuellement en décochant la case correspondante dans l'inspecteur Unity.

Lorsqu'un objet devient inactif, il ne peut plus interagir avec d'autres objets, sauf si vous avez créé une référence à cet objet avant qu'il ne soit inactif. De plus, tous ses composants cessent de fonctionner. Par exemple, si des scripts sont attachés à cet objet, ceux-ci seront "éteints". Et biensûr, l'objet ne sera plus visible dans votre scène. 

Évidemment, il est aussi possible de rendre un objet inactif par programmation. Pour cela, on utilise la méthode SetActive(false) pour l'éteindre et SetActive(true) pour le réactiver. Voici un exemple :

using UnityEngine;

public class Joueur : MonoBehaviour
{
    public int vie;
	private int mana = 20;
	[SerializeField] int force;

	private GameObject cible;

    void Start()
    {
		gameObject.SetActive(false);
		cible = GameObject.Find("Ennemie");
    }

	public void Attaquer()
	{
		Debug.Log("Le joueur a attaqué !");
	}
	
	public void Magie()
	{
		Debug.Log("Le joueur fait de la magie!");	
	}

	public void Esquive()
	{
		Debug.Log("Le joueur se prépare à esquiver");	
	}
	
	void Mort()
	{
		
	}
}

Lors de l'exécution du jeu, votre personnage deviendra immédiatement inactif. Notez l'utilisation du mot gameObject devant la méthode : cela fait référence à l'objet qui possède actuellement le script. Dans ce cas, c'est le personnage "Joueur" qui contient le script. Vous pouvez bien sûr remplacer gameObject par une autre référence, par exemple cible.SetActive(false) pour rendre l'ennemi inactif, si l'ennemi est stocké dans la variable cible.

2. Détruire un objet

La deuxième méthode consiste à détruire un objet. Pour ce faire, vous utilisez la méthode Destroy(référence de l'objet). Cette méthode supprime réellement l'objet de la scène. Par exemple :

using UnityEngine;

public class Joueur : MonoBehaviour
{
    public int vie;
	private int mana = 20;
	[SerializeField] int force;

	private GameObject cible;

    void Start()
    {
		Destroy(gameObject);
		cible = GameObject.Find("Ennemie");
    }

	public void Attaquer()
	{
		Debug.Log("Le joueur a attaqué !");
	}
	
	public void Magie()
	{
		Debug.Log("Le joueur fait de la magie!");	
	}

	public void Esquive()
	{
		Debug.Log("Le joueur se prépare à esquiver");	
	}
	
	void Mort()
	{
		
	}
}

Dans cet exemple, nous détruisons l'objet qui possède ce script, c'est-à-dire le "Joueur". Vous remarquerez que votre personnage n'est plus visible dans la hiérarchie et qu'il est donc impossible de le récupérer.

Quelle méthode choisir : SetActive() ou Destroy() ?

  • SetActive : L'objet est désactivé, mais il n'est pas supprimé de la mémoire. Vous pouvez toujours le réactiver plus tard. Cela consomme toujours de la mémoire.

  • Destroy() : L'objet est complètement détruit et supprimé de la mémoire. Il est impossible de le récupérer une fois qu'il est détruit.

Le choix entre ces deux méthodes dépend du contexte de votre jeu et de vos objectifs. Pour cet exercice, nous utiliserons la méthode SetActive().

La méthode Mort()

Nous allons maintenant écrire la logique derrière la méthode Mort() pour notre joueur et notre ennemi.

L'idée est simple : si le personnage tombe à 0 point de vie ou moins, nous le considérons comme mort et nous le rendons inactif. Voici un exemple avec le script "Joueur" :

using UnityEngine;

public class Joueur : MonoBehaviour
{
    public int vie;
	private int mana = 20;
	[SerializeField] int force;

	private GameObject cible;

    void Start()
    {
		cible = GameObject.Find("Ennemie");
    }

	public void Attaquer()
	{
		Debug.Log("Le joueur a attaqué !");
	}
	
	public void Magie()
	{
		Debug.Log("Le joueur fait de la magie!");	
	}

	public void Esquive()
	{
		Debug.Log("Le joueur se prépare à esquiver");	
	}
	
	void Mort()
	{
		if(vie <= 0)
		{
			gameObject.SetActive(false);
		}
	}
}

Rien de trop compliqué, n'est-ce pas ? Vous pouvez appliquer la même logique à votre script pour l'ennemi. 

Rendre la mort plus intéressante

En général, nous utiliserons une animation lorsque notre personnage meurt. Cependant, si ce n'est pas encore dans vos compétences, vous pouvez remplacer votre personnage par un cercueil lorsqu'il meurt.

Voici comment faire :

  1. Créez un objet contenant l'image de votre cercueil, comme nous l'avons fait pour nos personnages.
  2. Placez-le devant le personnage dans la scène, puis désactivez-le.
  3. Utilisez SetActive() pour activer le cercueil à la mort du personnage.

Voici un exemple de code pour inclure le cercueil :

using UnityEngine;

public class Joueur : MonoBehaviour
{
    public int vie;
	private int mana = 20;
	[SerializeField] int force;

	private GameObject cible;
	[SerializeField] GameObject cercueil;

    void Start()
    {
		cible = GameObject.Find("Ennemie");
    }

	public void Attaquer()
	{
		Debug.Log("Le joueur a attaqué !");
	}
	
	public void Magie()
	{
		Debug.Log("Le joueur fait de la magie!");	
	}

	public void Esquive()
	{
		Debug.Log("Le joueur se prépare à esquiver");	
	}
	
	void Mort()
	{
		if(vie <= 0)
		{
			gameObject.SetActive(false);
			cercueil.SetActive(true);
		}
	}
}

Remarque : Puisque notre cercueil est inactif avant le démarrage du jeu, vous devez utiliser une variable publique ou [SerializeField] pour y assigner une référence à ce GameObject. En effet, il sera impossible d'obtenir cette référence à partir de la méthode Start(), comme nous l'avons fait pour notre variable cible.

Ici les cercueils sont actif

Cette fois les deux cercueils sont inactif

Astuce : Vous pouvez inverser l'orientation du cercueil en modifiant la valeur de scale x par un nombre négatif dans le composant Transform.

Pensez à tester votre méthode Mort() en l'exécutant dans Start(). Vous obtiendrez ce résultat si vous avez mis les points de vie de votre personnage à 0.

Comme vous pouvez le voir au démarrage du jeu, votre GameObject personnage devient inactif et, immédiatement après, votre cercueil apparaît puisque vous avez zéro point de vie.  Si vous obtenez ce résultat, cela veut dire que votre méthode Mort() fonctionne. Pensez à la retirer de Start() une fois votre test est terminé.

En conclusion

Dans ce chapitre, nous avons appris à détruire et à rendre inactif ou actif un GameObject dans notre scène. Nous avons également vu comment utiliser gameObject pour faire référence à l'objet qui possède le script.

Pour la suite du cours, votre script "Joueur" devrait ressembler à ceci :

using UnityEngine;

public class Joueur : MonoBehaviour
{
    public int vie;
	private int mana = 20;
	[SerializeField] int force;

	private GameObject cible;
	[SerializeField] GameObject cercueil;

    void Start()
    {
		cible = GameObject.Find("Ennemie");
    }

	public void Attaquer()
	{
		Debug.Log("Le joueur a attaqué !");
	}
	
	public void Magie()
	{
		Debug.Log("Le joueur fait de la magie!");	
	}

	public void Esquive()
	{
		Debug.Log("Le joueur se prépare à esquiver");	
	}
	
	void Mort()
	{
		if(vie <= 0)
		{
			gameObject.SetActive(false);
			cercueil.SetActive(true);
		}
	}
}

N'oubliez pas de mettre à jour également la méthode Mort() dans le script de votre ennemi en suivant les mêmes étapes que pour le "Joueur".

Je vous donne rendez vous à la prochaine page, dans laquelle nous terminerons enfin le script Joueur.

Cette page ne contient pas de Fichier à Télécharger.

Les cours vous ont aidé et vous souhaitez à votre tour nous aider ?

- - - Vous pouvez partager le site avec vos connaissances, ainsi que le Discord. - - -

- - - Participer à la vie active du site et du Discord. - - -

- - - Faire un petit don pour nous aider à payer le serveur avec le lien ci-dessous. - - -

Buy Me a Coffee at ko-fi.com