Dans cette partie, on va animer notre ennemi créé dans la partie #3 – tirer sur les ennemis
Voici ce qu’on aura à la fin :
Quand le joueur tirera sur le monstre, celui-ci tombera sous l’effet du coup et ses points de vie vont diminuer. Il se relèvera tant que ses points de vie seront supérieurs à zéro. Et quand il n’aura plus de point de vie, il restera à terre.
L’ennemi aura donc 3 états possibles (ou actions):
- Stand (ou idle) : l’ennemi reste debout et attend
- Damage : il reçoit un dégât.
- Defeated : il est vaincu, il reste à terre
Les cibles
Tout d’abord, nous allons désactiver les cibles afin de se concentrer sur le zombie.
Les animations
Dans le composant Animator, double cliquez sur le Controller.
Les états à garder sont Z_Idle, Z_FallingBack, Z_FallingForward. Supprimez toutes les autres animations et toutes les transitions.
Pour plus de confort, vous pouvez renommez les états:
- Z_Idle => Stand
- Z_FallingBack => Damage
- Z_FallingForward=> Defeated
Créez les paramètres suivants:
- Stand (bool)
- Damage (bool)
- Defeated (bool)
Créez les transitions :
- Entre Stand et Damage : Conditions Damage = true. Décochez has exit time.
Quand on décoche cette case, on peut interrompre une animation avant qu’elle ne soit finie. - Entre Damage et Stand : Conditions Stand = true.
- Enfin, entre Stand et Defeated : Conditions Defeated = true. Décochez has exit time.
MonsterController
Nous allons créer MonsterController. Ce script se chargera de lancer les bonnes animations :
- Stand : quand l’ennemi attend, sans rien faire de particulier
- Damage : quand il reçoit des dommages
- Defeated : quand il n’a plus de points de vie
Ajoutez-le script ci-dessous au Zombie :
MonsterController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class MonsterController : MonoBehaviour
{
//Composants
Animator animator;
//Actions possibles
//Stand ou Idle = attendre
const string STAND_STATE = "Stand";
//Reçoit des dommages
const string TAKE_DAMAGE_STATE = "Damage";
//Est vaincu
public const string DEFEATED_STATE = "Defeated";
//Mémorise l'action actuelle
public string currentAction;
private void Awake()
{
//Au départ, la créature attend en restant debout
currentAction = STAND_STATE;
//Référence vers l'Animator
animator = GetComponent<Animator>();
}
private void Update()
{
//Si la créature reçoit des dommages:
//Elle ne peut rien faire d'autres.
//Cela servira quand on améliorera ce script.
if (currentAction == TAKE_DAMAGE_STATE)
{
TakingDamage();
return;
}
//...sera complété plus tard
}
//
private void Stand()
{
//Réinitialise les paramètres de l'animator
ResetAnimation();
//L'action est maintenant "Stand"
currentAction = STAND_STATE;
//Le paramètre "Stand" de l'animator = true
animator.SetBool("Stand", true);
}
public void TakeDamage()
{
//Réinitialise les paramètres de l'animator
ResetAnimation();
//L'action est maintenant "Damage"
currentAction = TAKE_DAMAGE_STATE;
//Le paramètre "Damage" de l'animator = true
animator.SetBool("Damage", true);
}
public void Defeated()
{
//Réinitialise les paramètres de l'animator
ResetAnimation();
//L'action est maintenant "Defeated"
currentAction = DEFEATED_STATE;
//Le paramètre "Defeated" de l'animator = true
animator.SetBool(DEFEATED_STATE, true);
}
//Permet de surveiller l'animation lorque l'on prend un dégât
private void TakingDamage()
{
if (this.animator.GetCurrentAnimatorStateInfo(0).IsName(TAKE_DAMAGE_STATE))
{
//Compte le temps de l'animation
//normalizedTime : temps écoulé nomralisé (de 0 à 1).
//Si normalizedTime = 0 => C'est le début.
//Si normalizedTime = 0.5 => C'est la moitié.
//Si normalizedTime = 1 => C'est la fin.
float normalizedTime = this.animator.GetCurrentAnimatorStateInfo(0).normalizedTime;
//Fin de l'animation
if (normalizedTime > 1)
{
Stand();
}
}
}
//Réinitialise les paramètres de l'animator
private void ResetAnimation()
{
animator.SetBool(STAND_STATE, false);
animator.SetBool(TAKE_DAMAGE_STATE, false);
animator.SetBool(DEFEATED_STATE, false);
}
}
Partie 5 : https://kareasoft.com/creer-un-fps-5-intelligence-artificielle-de-lennemi-et-deplacement/

