[AL-DB] Animation, CrossFade et GetComponent ()

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Répondre
lauraunkut
Messages : 5
Inscription : 28 Oct 2018 15:47

[AL-DB] Animation, CrossFade et GetComponent ()

Message par lauraunkut » 29 Oct 2018 17:29

Bonjour à tous, j'ai un problème avec mon code. Voici mon code:

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveCharacter : MonoBehaviour {

    //Variables publiques
    public float Speed;
    public float SpeedRun;
    public float SpeedRotate;
    public float Gravite;
   
    //Variables privées
    private CharacterController Controller;
    private Vector3 moveDirection;
    private float deltaTime;
    private bool walk;
    private bool run;
    private GameObject CharacterContenu;
 

    void Start () {
        Controller = GetComponent<CharacterController>();
        CharacterContenu = transform.Find("Perso").gameObject;
        CharacterContenu = GetComponent<GameObject>();
    }

	void Update () {

        //Cadence
        deltaTime = Time.deltaTime;

        //Déplacements haut et bas. getAxis vertical nous combine les flèches du haut et celles du bas.
        if(Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
        {
            moveDirection = new Vector3(0, 0, Input.GetAxis("Vertical") * SpeedRun);
            run = true;
        }
        else
        {
            moveDirection = new Vector3(0, 0, Input.GetAxis("Vertical") * Speed);
            walk = true;
        }
        if (!Input.anyKey)
        {
            walk = false;
            run = false;
        }
        // ******************
        if (!walk && !run)
        {
            CharacterContenu.CrossFade("idle"); 
        }
        else if (walk)
        {
            CharacterContenu.animation.CrossFade("walk", 0.2);
        }
        else if (run)
        {
            CharacterContenu.animation.CrossFade("run", 0.2);
        }
        
        moveDirection = transform.TransformDirection(moveDirection);

        //Rotation du personnage
        transform.Rotate(new Vector3(0, Input.GetAxis("Horizontal") * SpeedRotate * deltaTime, 0));

        //Gravité
        moveDirection.y -= Gravite;

        //Déplacement du CharacterController
        Controller.Move(moveDirection * deltaTime);
    
       
	}
}


J'ai un problème sur la partie après la ligne "crossfade", je ne voit pas comment faire jouer mes animations avec le CrossFade, ou plutôt je n'arrive pas à utiliser le "Crossfade"... Si quelqu'un peut m'aider ca serait vraiment super ^^
Dernière édition par lauraunkut le 29 Oct 2018 18:20, édité 1 fois.

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: Problème de code

Message par djulio74 » 29 Oct 2018 17:42

salut,
quel est le message d'erreur que tu as, sans ça pas possible de t'aider facilement..

Sinon juste au premier regard il ne manquerait pas un "animation" pour ton crossfade idle?

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

lauraunkut
Messages : 5
Inscription : 28 Oct 2018 15:47

Re: Problème de code

Message par lauraunkut » 29 Oct 2018 18:10

Voici le message d'erreur;

GameObject ne contient pas de définitions pour CrossFade et aucune méthode d'extension accessible 'CrossFade' acceptant un premier arguments de type 'GameObject' n'a été localisée.

En réalité je ne sais absolument pas comment fonctionne le CrossFade, j'ai essayer de suivre un tuto mais le script est en javascript donc j''ai du m'adapter. Aucune erreur jusqu’à ce CrossFade.
En fait, j'ai importer un personnage de l'Asset Store, qui possède déjà des animation, et je voudrait qu'il les jouent quand j'appuie sur les différentes flèches.

Merci pour ton aide.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Problème de code

Message par boubouk50 » 29 Oct 2018 18:37

Ceci une erreur très classique et commune, je te conseille d'apprendre les bases de la programmation pour ne pas avoir à bloquer sur ce genre de broutilles.

GameObject ne contient pas de définitions pour CrossFade et aucune méthode d'extension accessible 'CrossFade' acceptant un premier arguments de type 'GameObject' n'a été localisée.Le message d'erreur est très clair, le type GameObject ne possède pas de méthode appelée CrossFade ().
Tu vas dans la documentation pour le constater et par extension tu cherches Crossfade qui est une méthode du Component LODFadeMode, Animation ou Animator. Donc CrossFade doit être utilisé par un de ces 3 Components. Ici, par déduction, on choisira Animation.
Sur ta ligne d'erreur, il te manque donc l'appel au Component Animation (un peu comme les lignes en dessous...).

Tu risques d'avoir d'autres erreurs qui surviennent, ton code est pas très jouli...

Code : Tout sélectionner

CharacterContenu = transform.Find("Perso").gameObject;
 CharacterContenu = GetComponent<GameObject>();
Ici tu vas chercher le GameObject Perso, puis tu récupères celui qui possède ce script. Une ligne est en trop.

Code : Tout sélectionner

CharacterContenu.animation.CrossFade("walk", 0.2);
Ceci est obsolète. Aujourd'hui, il faut passer par GetComponent <>()
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

lauraunkut
Messages : 5
Inscription : 28 Oct 2018 15:47

Re: [AL-DB] Animation, CrossFade et GetComponent ()

Message par lauraunkut » 29 Oct 2018 19:29

je vais me faire une petite pause parce que j'y suis depuis ce matin ^^
J'ai essayer avec les getcomponent, mais je voit pas comment aller chercher par exemple l'animation "walk",
il faut faire:
CharacterContenu = GetComponent<Walk>
Ou pas du tout ? ^^
Merci encore de m'aider

De plus, il faut d"clarer les booléens ou pas? Sur JV je sais qu'il faut le faire mais je croyait qu'en C ce n'etait pas indispensable...

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: [AL-DB] Animation, CrossFade et GetComponent ()

Message par Max » 29 Oct 2018 21:59

Bonsoir,
lauraunkut a écrit :
29 Oct 2018 19:29
je vais me faire une petite pause parce que j'y suis depuis ce matin ^^
J'ai essayer avec les getcomponent, mais je voit pas comment aller chercher par exemple l'animation "walk",
il faut faire:
CharacterContenu = GetComponent<Walk>
Ou pas du tout ? ^^
Merci encore de m'aider

De plus, il faut d"clarer les booléens ou pas? Sur JV je sais qu'il faut le faire mais je croyait qu'en C ce n'etait pas indispensable...
Je crois surtout que tu mélanges tout.
Déjà, il faut que tu regardes ce qu'est vraiment un composant. Dans ton script, tu écris:

Code : Tout sélectionner

private GameObject CharacterContenu;
.....
CharacterContenu = GetComponent<GameObject>();
GameObject n'est pas un composant. Les GameObjects sont les entités de base constituant les scènes, des containers en quelque sorte, dans lequel vont venir s’insérer les composants utiles pour chaque GameObject. Dans ton cas, tu as toutes les chances que CharacterContenu soit null. Dans une classe dérivant de MonoBehaviour, tu n'a pas besoin manuellement de récupérer le go, gameObject est un membre de la classe. Voir la doc sur MonoBehaviour.

C'est donc sur ces GameObjects que l'on va ajouter les composants utiles (hormis Transform, composant un peu particulier et présent par défaut sur tout GameObject, même empty), comme par exemple la possibilité de jouer un son (AudioSource), d'avoir une interaction physique (RigidBody) ou encore la capacité de trouver son chemin dans une scène (NavMeshAgent). Dans le menu d'Unity, tu as l'onglet 'Component', qui de donne tous les composants que tu peux gérer et ajouter à tes GameObjects. Les Scripts (dérivant de MonoBehaviour) sont aussi considérés comme des composants.
Dans ton cas visiblement, il s'agit d'un composant Animation. C'est le rôle de l'instruction GetComponent. Lire la doc et voir ce qui y est dit. ( exemple: GetComponent<Animation>(); )

Quand tu parles de Walk, la c'est autre chose, il s'agit du nom d'une des animations contenues dans le composant
Animation de ton GameObject. D'ailleurs à titre d'info, il est désormais conseillé de passer par le composant Animator plutôt que le composant Animation (bon après je pense que tu t'appuis sur un tuto, donc...)

Il faut vraiment que tu travailles les bases, sinon tu va galérer sur des truc comme ça qui sont les bases en terme d'emploi de l'engine ;)
(conseil: les tuto du Learn pour apprendre ces bases, après tu seras déjà bien mieux armé pour faire ce que veux avec Unity)
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

lauraunkut
Messages : 5
Inscription : 28 Oct 2018 15:47

Re: [AL-DB] Animation, CrossFade et GetComponent ()

Message par lauraunkut » 30 Oct 2018 09:51

Bonjour,
Du coup j'ai essayer de me renseigner sur le GetComponent, et je crois avoir compris. En faite on fait appelle à notre Animator via le GetComponent. Du coup on créer un Animator avec les différentes animation.
Mais j'ai trouver un autre script qui ma totalement perdue...

Code : Tout sélectionner

using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;
 
public class CharacterBehavior : MonoBehaviour {
 
    /// &amp;amp;amp;amp;lt;summary&amp;amp;amp;amp;gt;
    /// Vitesse de déplacement du personnage 
    /// &amp;amp;amp;amp;lt;/summary&amp;amp;amp;amp;gt;
    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
 ! Message de : boubouk50
Les balises CODE stp
Si j'ai bien compris, ici il fait courrir le personnage des que v et h sont différents de zéro... mais ça ne ressemble à rien de tous ce que j'ai pu trouver...

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [AL-DB] Animation, CrossFade et GetComponent ()

Message par boubouk50 » 30 Oct 2018 10:14

Dans son code, le perso n'a que 2 états: rien ou courir. Donc le booléen est le plus adapté. L'animator lance les animations en fonctions de variables prédéterminées. Pour un passage d'un état à un autre, il est préférable de passer par un booléen qui ne possède lui aussi que 2 états.
S'il avait à gérer différentes animations, alors il aurait dû étoffer un peu le script et l'Animator pour déterminer les animations à jouer.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

lauraunkut
Messages : 5
Inscription : 28 Oct 2018 15:47

Re: [AL-DB] Animation, CrossFade et GetComponent ()

Message par lauraunkut » 30 Oct 2018 17:04

Du coup j'ai essayer uniquement avec l'animator. Et malheureusement, il se met bien en Idle mais quand je clique sur le booléen "walk", le personnage ne bouge pas... Mais déjà si à partir de l'animator, le personnage ne se déplace pas, c'est qu'il y a un problème non?

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [AL-DB] Animation, CrossFade et GetComponent ()

Message par boubouk50 » 30 Oct 2018 18:02

Comment dire... Le vocabulaire que tu utilises semble inapproprié ou alors je comprends pas trop.
Ne bouge pas, ne se déplace pas est difficilement interprétable dans le cas présent.
L'Animator sert à jouer des animations, donc le personnage devrait jouer son animation (mouvement ou non)
Le déplacement devrait être pris en compte par le CharacterController, donc du code.
Ici, l'animation se joue ou non?
> oui: le comportement est donc normal
> non: as-tu crée les variables associées (bien nommées) et géré la transition entre les animations dans l'Animator.

Je te conseillerai d'aller faire tour sur le site officiel d'Unity ou tu trouveras les Unity Learn et autres tutoriels. Tu trouveras une vidéo sur le fonctionnement des Animators.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Répondre

Revenir vers « Scripting »