Jouer animation 2D

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Emilie24
Messages : 13
Inscription : 17 Avr 2019 16:02

Jouer animation 2D

Message par Emilie24 » 24 Mai 2019 18:51

Bonjour,
J'essaie de faire jouer les animations dans mon script character controller. Voici le script :


Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour
{


    public Vector2 speed = new Vector2(5f, 2f);

    public Vector2 targetPosition;
    public Vector2 relativePosition;

    private Vector2 movement;
    private Rigidbody2D rigidbody2D;
    private Animator animator;
    private static object velocity;

    private void Start()
    {
        animator = GetComponent<Animator>();
        
    }

    void Awake()
    {
        rigidbody2D = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            targetPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            
        }

        relativePosition = new Vector2(
            targetPosition.x - gameObject.transform.position.x,
            rigidbody2D.velocity.y);
      
    }

    void FixedUpdate()
    {
        if (speed.x * Time.deltaTime >= Mathf.Abs(relativePosition.x))
            movement.x = relativePosition.x;
        else
            movement.x = speed.x * Mathf.Sign(relativePosition.x);

        rigidbody2D.velocity = movement;

        if (rigidbody2D.velocity.magnitude > 0)
        {
            animator.SetFloat("Speed", Mathf.Abs(targetPosition.x));
        }

    }

}
Les soucis rencontrés :
1) l'animation ne revient pas sur le idle
2) lorsque l'animation de walkright se déclenche, la taille du sprite est réduite
3) walkleft ne se déclenche pas
4) le joueur bouge au démarrage du jeu au lieu de rester immobile

Capture3.PNG
Capture3.PNG (70.86 Kio) Consulté 3238 fois


Je débute tout juste dans la progra alors je suis un peu perdue. Merci d'avance de votre aide

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

Re: Jouer animation 2D

Message par Max » 25 Mai 2019 09:53

Hello,

A la base, il faudrait surtout voir comment sont gérés tes transitions.
Tu as un exemple qui pourrait t'aider dans les StandardAssets, avec le CharacterRobotBoy je crois. Cela rejoint assez bien ce que tu cherche à faire.
Après, il faut savoir consacrer un peu de temps pour apprendre les bases,
en particulier aller voir ce qui se dit ici: Controlling Animation
;)
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

Emilie24
Messages : 13
Inscription : 17 Avr 2019 16:02

Re: Jouer animation 2D

Message par Emilie24 » 25 Mai 2019 13:53

Voilà les transitions :

walkright -> idle
Capture1.PNG
Capture1.PNG (25.63 Kio) Consulté 3184 fois
idle -> walkright
Capture2.PNG
Capture2.PNG (22.58 Kio) Consulté 3184 fois
idle -> walkleft
Capture3.PNG
Capture3.PNG (24.06 Kio) Consulté 3185 fois
walkleft -> idle
Capture3.PNG
Capture3.PNG (24.06 Kio) Consulté 3185 fois

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour
{


    public Vector2 speed = new Vector2(5f, 2f);

    public Vector2 targetPosition;
    public Vector2 relativePosition;

    private Vector2 movement;
    private Rigidbody2D rigidbody2D;
    private Animator animator;
    private static object velocity;

    private void Start()
    {
        animator = GetComponent<Animator>();
        
    }

    void Awake()
    {
        rigidbody2D = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            targetPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

        }

        relativePosition = new Vector2(
            targetPosition.x - gameObject.transform.position.x,
            rigidbody2D.velocity.y);

    }

    void FixedUpdate()
    {
        if (speed.x * Time.deltaTime >= Mathf.Abs(relativePosition.x))
            movement.x = relativePosition.x;
        else
            movement.x = speed.x * Mathf.Sign(relativePosition.x);

        rigidbody2D.velocity = movement;

        if (rigidbody2D.velocity.magnitude > 0)
        {
            animator.SetFloat("Speed", Mathf.Abs(targetPosition.x));
        }

        if (rigidbody2D.velocity.magnitude < 0)
        {
            animator.SetFloat("mSpeed", Mathf.Abs(targetPosition.x));
        }
      



    }
}

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

Re: Jouer animation 2D

Message par Max » 25 Mai 2019 15:46

Re,
1) l'animation ne revient pas sur le idle
peut-être parce que Mathf.Abs(targetPosition.x) ne revient jamais sous la barre des 0.1f ?
2) lorsque l'animation de walkright se déclenche, la taille du sprite est réduite
Là, j'en sais rien. Lié à ton animation peut-être.
3) walkleft ne se déclenche pas
normal je dirais, mSpeed n'est jamais affecté dans ton code.
4) le joueur bouge au démarrage du jeu au lieu de rester immobile
le vecteur2D "speed" n'est pas null au départ, puisque initialisé à (5f, 2f) (à moins que dans l'inspector il soit reset), pourquoi ? à voir de ce coté là.
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

Emilie24
Messages : 13
Inscription : 17 Avr 2019 16:02

Re: Jouer animation 2D

Message par Emilie24 » 28 Mai 2019 18:05

J'ai pu corrigé quelques erreurs. Mais maintenant, je ne sais pas comment faire jouer l'anim "idle". Et le perso bouge toujours au demarrage. Si je mets 0f, 0f à speed, il démarre sur walkright et ne bouge plus au clic souris.

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour
{


    public Vector2 speed = new Vector2(0f, 0f);

    public Vector2 targetPosition;
    public Vector2 relativePosition;

    private Vector2 movement;
    private Rigidbody2D rigidbody2D;
    private Animator animator;
    private static object velocity;


    private void Start()
    {
        animator = GetComponent<Animator>();

    }

    void Awake()
    {
        rigidbody2D = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            targetPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            

        }

        relativePosition = new Vector2(
            targetPosition.x - gameObject.transform.position.x,
            rigidbody2D.velocity.y);

        if (relativePosition.x > 0)
        {
            animator.SetTrigger("walkright");
        }

        if (relativePosition.x < 0)
        {
            animator.SetTrigger("walkleft");
        }

}

    void FixedUpdate()
    {
        if (speed.x * Time.deltaTime >= Mathf.Abs(relativePosition.x))
            movement.x = relativePosition.x;
        else
            movement.x = speed.x * Mathf.Sign(relativePosition.x);
        

        rigidbody2D.velocity = movement;

    }

}

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

Re: Jouer animation 2D

Message par Max » 28 Mai 2019 18:19

Bonsoir,

je trouve assez bizarre que tu déclenches les courses par rapport à une position (si j'ai bien lu: relativePosition.x ).
En générale, on définit se genre de chose plutôt sur une vélocité, ou une action du joueur (genre touche left/right).
En suite, avec cette partie du code:

Code : Tout sélectionner

        if (relativePosition.x > 0)
        {
            animator.SetTrigger("walkright");
        }

        if (relativePosition.x < 0)
        {
            animator.SetTrigger("walkleft");
        }
on peut penser que l'Idle (état de départ) ne sera conservé que si relativePosition.x est égale à zéro, ce qui au vue de son calcul fait avant a très peu de chance d'être le cas.
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

Emilie24
Messages : 13
Inscription : 17 Avr 2019 16:02

Re: Jouer animation 2D

Message par Emilie24 » 28 Mai 2019 19:05

Sinon j'ai trouvé ce script sur un tuto qui fonctionne assez bien (hormis le player qui quitter le décors). Mais j'ai toujours la même question qui revient, comment y intégrer mes animations ?

Code : Tout sélectionner

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

public class clicktomove : MonoBehaviour
{
    public float speed = 1.5f;
    private Vector3 target;
    public Animator animator;

    void Start()
    {
        target = transform.position;
        animator = gameObject.GetComponent<Animator>();
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            target = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            target.z = transform.position.z;
        }
        transform.position = Vector3.MoveTowards(transform.position, target, speed * Time.deltaTime);
    }
}


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

Re: Jouer animation 2D

Message par Max » 28 Mai 2019 20:17

je t'avais conseillé de regarder du coté du PlatformerCharacter2D dans le StandardAssets (donc fournis par Unity), cela semble bien correspondre à ce que tu cherches. Avec le prefabs qui va bien avec (CharacterRobotBay).
Là tu as tout pour bien comprendre et te l'approprier.
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

Répondre

Revenir vers « Scripting »