[Part1] Animation et contrôle d’un modèle avec Unity

Dans cet article, je vous propose d’animer un personnage et de le contrôler.

En partant de zéro, on va récupérer un modèle sur Unity store, l’animer, comprendre comment il fonctionne. Finalement le contrôler avec le moins de code possible.

Il existe des assets sur le store d’Unity gratuit pour montrer ce qu’on peut faire avec les animations, comme celui-ci



Vous pouvez récupérer cette asset par là :

Libre à vous de tester, en ouvrant la scène incluse et de la lancer. Vous devriez avoir quelque similaire au gif.

 

Comment fonctionne une animation ?

Il faut associer 2 choses, le modèle et l’animation.

Le modèle 3D est composé d’un squelette avec différentes articulations, et d’une peau par dessus (ou pas).

L’animation de son côté définit l’ensemble des mouvements de chaque articulation de votre modèle.

On peut donc utiliser une animation sur n’importe quel modèle ayant les mêmes articulations. C’est pourquoi les modèles humanoïdes sont plutôt standardisés.

Trouver nos assets

Dans l’absolu, vous pourriez donc prendre n’importe quels modèles et animations en allant dans l’asset store, mais je vous ai trouvé un seul asset pour tout faire.

Mais pour plus tard, si vous voulez trouver un modèle, vous pourrez rechercher les modèles de type Humanoids sur le store.

Pour notre exemple, nous allons prendre un squelette efficace (et gratuit) avec ses animations et son équipement.

Créer un nouveau projet sur Unity Editor, et importer l’asset.

Maintenant, il faut créer une nouvelle scène.

Maintenant, il faut l’ajouter à notre scène. En le cliquant/glissant depuis la fenêtre de projet Assets/mesh/SKELETON vers la fenêtre de scène.

Il est bien notre squelette, mais il ne bouge pas vraiment. Cependant, c’est un modèle qui date un peu depuis Unity 3.4.0, on va donc changer son mode d’animation pour être plus facile à manipuler. Pour se faire, il faut aller changer les configurations de notre skeleton.fbx, et dans l’onglet Rig.

Vous pouvez voir que le fbx a 3 onglets Model, Rig et Animation. Le premier et le dernier parlent d’eux même, la partie Rig constitue la liaison entre les deux, c’est lui qui définit un squelette ou plus précisément ses articulations à contrôler par les animations.

Les différents types d’animation :

  • None : C’est un modèle fixe sans animation, les différentes articulations sont donc immobiles.
  • Legacy : Ancienne manière de manipuler un modèle. À ne plus utiliser.
  • Generic : Gestion manuelle, vous allez devoir créer un avatar en définissant les os et les articulations un par un.
  • Humanoid : Génère automatiquement votre avatar, mais ne fonctionne que pour des modèles bipèdes. Si le modèle n’est pas compatible, un avertissement survient si ce n’est pas le cas.

Animons-le

L’animation va passer par un animator. C’est un composant qui fait le lien entre notre modèle (ou plus précisément son Rig) et l’ensemble des animations dont nous avons besoin.

Pour ce faire, on va créer un Animator controller dans les assets.

Dans notre cas, on a déjà un un composant Animator sur notre modèle, mais il faut le lier à notre Animator controller.

Maintenant qu’on a tout ce qu’il faut pour contrôler notre animation. On a besoin d’éditer notre animator controller en double cliquant dessus.

Si vous fermez la fenêtre, vous pourrez la rouvrir en double cliquant sur un Animator controller, ou en passant par le menu Window.

Dans les nouveaux assets, les animations sont dans des dossiers différents, avec son propre fichier fbx pour définir les articulations à commander. Cependant, dans notre modèle, les animations sont directement dedans, ce qui ne change pas grand-chose, surtout la réutilisabilité.

Ajoutons notre première animation à l’animator controller, en général on ajoute une animation “idle” ou animation de repos, mais dans notre cas, je préfère le “waiting for battle”.

Sauf qu’on remarquera que notre animation se fait une fois, puis le squelette se fige.

Pour corriger ça, on va modifier les configurations de l’animation. Pour boucler l’animation, on va devoir lui ajouter les options :

  • Loop Time : Active le bouclage de l’animation automatique
  • Loop Pose : Rend smooth le passage de la fin de l’animation à début de la suivante, donc évitant que le modèle ne change en un clignement d’œil.

Il court !

Pour le faire courir sur demande, il va falloir qu’on fasse 2 choses, préparer l’animation, et l’activer quand on voudra.

On va donc avoir besoin d’une variable “run” dans l’animator qu’on pourra contrôler depuis le code.

Maintenant, on peut ajouter l’animation et configurer les transitions pour s’activer quand notre variable passe à true, et se finit quand elle repasse à false.

C’est bien d’utiliser notre variable, faut-il encore l’alimenter. Pour ce faire, on va s’aider d’une librairie de base d’unity.

Qu’on peut récupérer via Assets/Import Package/CrossPlatformInput.

Puis on va créer un script C# et l’ouvrir avec monodevelop par défaut. Dans mon cas j’utilise visual studio 2015.

Voici le script que nous allons utiliser. N’hésitez pas à intervenir dans les commentaires si une partie n’est pas assez commentée.

using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;

public class CharacterBehavior : MonoBehaviour {

    /// <summary>
    /// Vitesse de déplacement du personnage 
    /// </summary>
    public float speed = 2.0f;

    // Mouvement du personnage
    Vector3 movement; 
    // RigidBody
    Rigidbody playerRigidBody;
    Animator animator;
    bool isAttacking = false;

    // Appelé à l'initialisation de l'instance
    void Start()
    {
        playerRigidBody = GetComponent<Rigidbody>();
        animator = GetComponent<Animator>();
    }

    // Utilisé pour mettre à jour les positions, on a pas besoin de le faire à chaque frame comme on pourrait le faire avec le fonction Update()
    void FixedUpdate()
    {
        // Récupération des commandes horizontales, A et D sur pc, gauche et droite sur une manette.
        float h = CrossPlatformInputManager.GetAxisRaw("Horizontal");
        // Récupération des commandes verticales, W et S sur pc, haut et bas sur une manette.
        float v = CrossPlatformInputManager.GetAxisRaw("Vertical");

        // On applique le mouvement à un vecteur 3
        movement.Set(h, 0f, v);

        // On corrige notre vecteur par rapport au temps
        movement = movement.normalized * Time.fixedDeltaTime * speed;
        // On met à jour la position de notre RigidBody via notre mouvement
        playerRigidBody.MovePosition(transform.position + movement);

        // On met à jour les variables de notre animator
        // Dans notre cas "run" est un bool
        animator.SetBool("run", v != 0 || h != 0);
        // Mais on aurait pu utiliser un INT, un FLOAT, ou un TRIGGER
        //animator.SetInteger("int", value); // A appliquer pour des valeurs simples ou des états
        //animator.SetFloat("float", value); // A appliquer par exemple pour envoyer la vitesse, et différencier la marche de la course
        //animator.SetTrigger("trigger"); // Utilisé plutôt pour des actions à lancer qu'une fois, par exemple une attaque
    }
}

Mais notre script ne sert à rien pour le moment, il faut l’ajouter à notre skeleton. Il faut pour que le script marche ajouter un composant RigidBody et notre script, pensez à décocher l’option Use Gravity, n’ayant pas de sol on serait gêné.

Dans notre exemple, on peut utiliser une manette, mais les commandes sont bloquées sur les touches WASD. N’hésitez donc pas à passer en clavier qwerty avec la commande MAJ+ALT pour tester.

Corrections

Il reste des problèmes, l’animation de course continue alors qu’on a arrêté de courir. Les transitions sont par défaut configurées ainsi, il suffit de décocher l’option Has Exit Time.

Un autre problème est que notre animation de marche ne boucle pas, tout comme le faisait notre animation de repos.

Et voilà, vous avez une animation qui fonctionne sur demande !

Si vous voulez améliorer votre personnage, on peut imaginer des animations différentes pour aller en avant, en arrière, sur les côtés. Ajouter un trigger pour attaquer, sauter …
À vous les claviers 😉

Laisser un commentaire

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