Nous approchons de la fin. Sur cette page, nous allons finaliser le script "Joueur".
Logique des attaques
Lorsque nous avons créé les propriétés de notre personnage, nous avons choisi d'ajouter deux types d'attaque : une attaque normale et une attaque "magique" qui utilise de la mana.
Commençons par l'attaque normale.
Pour cette attaque, nous allons utiliser la variable force pour déterminer les dégâts infligés à la vie de l'ennemi.
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()
{
cible.GetComponent<Ennemie>().vie -= force;
Debug.Log("Le joueur a attaqué et a infligé " + force + " de dégâts! ");
}
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);
}
}
}
Pour l'instant, rien de nouveau. Je vous rappelle que la ligne :
cible.GetComponent<Ennemie>().vie -= force;
est équivalente à :
cible.GetComponent<Ennemie>().vie = cible.GetComponent<Ennemie>().vie - force;
Si vous l'aviez oublié, vous pouvez revoir cette notion dans cette page.
Vérification si la cible est morte
Après avoir réduit la vie de l'ennemi, nous allons exécuter sa méthode Mort() pour vérifier si sa vie est tombée à zéro ou moins. Voici l'exemple mis à jour :
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()
{
cible.GetComponent<Ennemie>().vie -= force;
Debug.Log("Le joueur a attaqué et a infligé " + force + " de dégâts!");
cible.GetComponent<Ennemie>().Mort();
}
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 : Il aurait été tout à fait possible, et même préférable, d'ajouter cette vérification dans notre script BattleSystem comme suit :
private void combatSystem()
{
if(tourDuJoueur)// si c'est le tour du joueur
{
if(idAction == 1)
{
joueur.GetComponent<Joueur>().Attaquer();
}
else if(idAction == 2)
{
joueur.GetComponent<Joueur>().Magie();
}
else if(idAction == 3)
{
joueur.GetComponent<Joueur>().Esquive();
}
ennemie.GetComponent<Ennemie>().Mort();
tourDuJoueur = false;
combatSystem(); // relance la méthode
}
else // si c'est le tour de l'ennemie.
{
ennemie.GetComponent<Ennemie>().ChoisirUneAttaque(); // exécute la méthode ChoisirUneAttaque() du script ennemie
tourDuJoueur = true;
}
}
Je vous laisse réfléchir un instant pour comprendre les avantages de l'écrire dans le script BattleSystem plutôt que dans les méthodes d'attaque. Pour cet exercice, nous allons l'utiliser uniquement dans le script Joueur.
L'attaque magique
Contrairement à l'attaque normale, la magie consomme la mana du joueur. Pour compenser, nous allons rendre ce type d'attaque plus puissant que l'attaque normale en multipliant la force par 1,5.
Voici comment nous pouvons faire cela :
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()
{
cible.GetComponent<Ennemie>().vie -= force;
Debug.Log("Le joueur a attaqué et a infligé " + force + " de dégâts!");
cible.GetComponent<Ennemie>().Mort();
}
public void Magie()
{
if(mana > 5)
{
mana -= 5; // consomme 5 point de mana
int calculDegats = (int)(force * 1.5);
cible.GetComponent<Ennemie>().vie -= calculDegats;
Debug.Log("Le joueur lance une boule de feu!");
Debug.Log("L'ennemie subit " + calculDegats + " de dégats"!);
}
else
{
Debug.Log("Le joueur n'a pas assez de mana pour son sort, il perd son tour !");
}
}
public void Esquive()
{
Debug.Log("Le joueur se prépare à esquiver");
}
void Mort()
{
if(vie <= 0)
{
gameObject.SetActive(false);
cercueil.SetActive(true);
}
}
}
Explication : Nous utilisons une condition pour vérifier que la variable mana est suffisamment élevée pour lancer l'attaque magique. Si c'est le cas, nous retirons 5 points de mana et effectuons le calcul des dégâts. Si la mana est insuffisante, le joueur perd son tour.
Notez la ligne suivante :
int calculDegats = (int)(force * 1.5);
Nous avons déclaré une variable calculDegats pour stocker le résultat de notre multiplication. Une variable déclarée dans une méthode est effacée une fois celle-ci terminée, ce qui permet de créer des variables temporaires.
Nous devons aussi convertir le calcul en un entier (int), car la multiplication implique un nombre à virgule (float). Le résultat doit être converti en int après la multiplication, comme montré ci-haut.
Pour ce qui est des autres lignes, il n'y a rien de spécial, nous réutilisons simplement le résultat de notre calcul pour réduire la vie de l'ennemi et affichons un message dans la console.
Vérification de la mort après la magie
Puisque nous avons modifié la vie de l'ennemi avec l'attaque magique, nous devons à nouveau appeler la méthode Mort() de l'ennemi pour vérifier s'il est mort.
public void Magie()
{
if(mana > 5)
{
mana -= 5; // consomme 5 point de mana
int calculDegats = (int)(force * 1.5);
cible.GetComponent<Ennemie>().vie -= calculDegats;
Debug.Log("Le joueur lance une boule de feu!");
Debug.Log("L'ennemie subit " + calculDegats + " de dégats"!);
}
else
{
Debug.Log("Le joueur n'a pas assez de mana pour son sort, il perd son tour !");
}
cible.GetComponent<Ennemie>().Mort();
}
Vous commencez peut-être à comprendre pourquoi il aurait été préférable d'ajouter cette méthode dans notre script BattleSystem. En effet, dans ce script,
private void combatSystem()
{
if(tourDuJoueur)// si c'est le tour du joueur
{
if(idAction == 1)
{
joueur.GetComponent<Joueur>().Attaquer();
}
else if(idAction == 2)
{
joueur.GetComponent<Joueur>().Magie();
}
else if(idAction == 3)
{
joueur.GetComponent<Joueur>().Esquive();
}
ennemie.GetComponent().Mort();
tourDuJoueur = false;
combatSystem(); // relance la méthode
}
else // si c'est le tour de l'ennemie.
{
ennemie.GetComponent<Ennemie>().ChoisirUneAttaque(); // exécute la méthode ChoisirUneAttaque du script ennemie
tourDuJoueur = true;
}
}
Uitliser la méthode Mort() avec le script BattleSystem nous éviteraient de devoir appeler Mort() à chaque fois que nous manipulons la vie de l'ennemi.
Gérer l'esquive du joueur
Il nous reste une dernière méthode à programmer au script Joueur : celle de l'esquive. Cette méthode permettra au joueur d'esquiver une attaque. Le script Ennemie devra détecter si le joueur est en position d'esquiver. Si c'est le cas, l'attaque échouera.
Nous allons utiliser un booléen nommé esquive qui, lorsqu'il est vrai, indiquera que le joueur est en position d'esquiver.
Voici le code mis à jour :
using UnityEngine; public class Joueur : MonoBehaviour { public int vie; private int mana = 20; [SerializeField] int force; private GameObject cible; [SerializeField] GameObject cercueil; public bool esquive; void Start() { cible = GameObject.Find("Ennemie"); } public void Attaquer() { cible.GetComponent<Ennemie>().vie -= force; Debug.Log("Le joueur a attaqué et a infligé " + force + " de dégâts !"); cible.GetComponent<Ennemie>().Mort(); } public void Magie() { if(mana > 5) { mana -= 5; // consomme 5 point de mana int calculDegats = (int)(force * 1.5); cible.GetComponent<Ennemie>().vie -= calculDegats; Debug.Log("Le joueur lance une boule de feu!"); Debug.Log("L'ennemie subit " + calculDegats + " de dégats"!); } else { Debug.Log("Le joueur n'a pas assez de mana pour son sort, il perd son tour!"); } cible.GetComponent<Ennemie>().Mort(); } public void Esquive() { esquive = true; Debug.Log("Le joueur se prépare à esquiver"); } void Mort() { if(vie <= 0) { gameObject.SetActive(false); cercueil.SetActive(true); } } }
ET c'est terminée!
Et voilà, vous avez terminé la création de votre personnage Joueur ! Il vous reste un dernier script à réaliser pour compléter cet exercice.
Rendez-vous à la page suivante où nous allons programmer l'Ennemie !
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. - - -