Créer un FPS #4 – Animer l’ennemi ! – Tuto Unity FR

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/

Recevez les dernières actus

Nous ne spammons pas ! Consultez notre politique de confidentialité pour plus d’informations.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut