[MY-AL] Sprite qui sacade lors des déplacements

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Avatar de l’utilisateur
tenkai188
Messages : 34
Inscription : 29 Déc 2017 14:59

[MY-AL] Sprite qui sacade lors des déplacements

Message par tenkai188 » 06 Juil 2018 00:17

Bonsoir,

je travaille depuis peu sur un projet de jeux (donjon-rpg/2D vue du dessus) avec Unity.

J'ai créé un script pour le déplacement de mon perso et j'ai peu apres voulu ajouter la possibilité de faire des "dash" (rapide déplacement sur le coté).

Cependant depuis que j'ai rajouté cette option, mon jeu semble saccader lors des déplacement.

Je n'arrive pas a résoudre ce problème :(

voici mon script:

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class PlayerController : MonoBehaviour {
 
    public float moveSpeed;
 
    private Animator anim;
 
    private Rigidbody2D myRigidbody;
 
    private bool playerMoving;
    public Vector2 LastMove;
    private static bool playerExists;
 
    //dash
    private Rigidbody2D rb;
    public float dashspeed;
    private float dashTime;
    public float startDashTime;
    private int direction;
    private bool DashOn = false;
 
     
 
    // Use this for initialization
    void Start () {
        anim = GetComponent<Animator>();
        myRigidbody = GetComponent<Rigidbody2D>();
 
        if(!playerExists)
        {
            playerExists = true;
            DontDestroyOnLoad(transform.gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
        //dash
        dashTime = startDashTime;
 
         
    }
     
    // Update is called once per frame
    void Update () {
 
        playerMoving = false;
 
        if (Input.GetKeyDown(KeyCode.LeftShift))
        {
            DashOn = true;
        }
        else if (Input.GetKeyUp(KeyCode.LeftShift))
        {
            DashOn = false;
        }
 
        if ((Input.GetAxisRaw("Horizontal")>0.5f || Input.GetAxisRaw("Horizontal") < -0.5f)&& (DashOn == false))
        {
            myRigidbody.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * moveSpeed,myRigidbody.velocity.y);
            playerMoving = true;
            LastMove = new Vector2(Input.GetAxisRaw("Horizontal"),0.0f);
        }
 
        if ((Input.GetAxisRaw("Vertical") > 0.5f || Input.GetAxisRaw("Vertical") < -0.5f)&& (DashOn == false))
        {
            myRigidbody.velocity = new Vector2(myRigidbody.velocity.x, Input.GetAxisRaw("Vertical")*moveSpeed);
            playerMoving = true;
            LastMove = new Vector2(0f, Input.GetAxisRaw("Vertical"));
        }
 
        if((Input.GetAxisRaw("Horizontal") < 0.5f && Input.GetAxisRaw("Horizontal")> -0.5f) && (DashOn == false))
        {
            myRigidbody.velocity = new Vector2(0f, myRigidbody.velocity.y);
        }
 
        if ((Input.GetAxisRaw("Vertical") < 0.5f && Input.GetAxisRaw("Vertical") > -0.5f) && (DashOn == false))
        {
            myRigidbody.velocity = new Vector2(myRigidbody.velocity.x, 0f);
        }
        if (DashOn == false)
        {
            anim.SetFloat("MoveX", Input.GetAxisRaw("Horizontal"));
            anim.SetFloat("MoveY", Input.GetAxisRaw("Vertical"));
            anim.SetBool("PlayerMoving", playerMoving);
            anim.SetFloat("LastMoveX", LastMove.x);
            anim.SetFloat("LastMoveY", LastMove.y);
        }
 
 
         
        if ((direction == 0)&&(DashOn==true))
        {
            if (Input.GetKeyDown(KeyCode.LeftArrow))
            {
                direction = 1;
            }
            else if (Input.GetKeyDown(KeyCode.RightArrow))
            {
                direction = 2;
            }
            else if (Input.GetKeyDown(KeyCode.UpArrow))
            {
                direction = 3;
            }
            else if (Input.GetKeyDown(KeyCode.DownArrow))
            {
                direction = 4;
            }
        }
        else
        {
            if (dashTime <= 0)
            {
                direction = 0;
                dashTime = startDashTime;
                myRigidbody.velocity = Vector2.zero;
            }else
            {
                dashTime -= Time.deltaTime;
 
                if (direction == 1)
                {
                    myRigidbody.velocity = Vector2.left * dashspeed;
                }
                else if (direction == 2)
                {
                    myRigidbody.velocity = Vector2.right * dashspeed;
                }
                else if (direction == 3)
                {
                    myRigidbody.velocity = Vector2.up * dashspeed;
                }
                else if (direction == 4)
                {
                    myRigidbody.velocity = Vector2.down * dashspeed;
                }
            }
        }
    }
}
.
 ! Message de : Max
Utilisez les balises code SVP
Merci de lire la Netiquette.

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

Re: [MY-AL] Sprite qui sacade lors des déplacements

Message par boubouk50 » 06 Juil 2018 09:13

Je pense que cette condition est mauvaise à cause du else:

Code : Tout sélectionner

if ((direction == 0)&&(DashOn==true))
        {} else {}
le else sera effectué si direction != 0 ou DashOn vaut false, alors qu'il me semble qu'il devrait rester à true pour la condition.
tu devrais séparer les conditions:

Code : Tout sélectionner

if (DashOn) {
	if (direction == 0) {}
        {} else {}
}
Il y a aussi énormément de logique à faire pour tes conditions. Beaucoup de répétition et de tests inutiles.
"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

Avatar de l’utilisateur
tenkai188
Messages : 34
Inscription : 29 Déc 2017 14:59

Re: [MY-AL] Sprite qui sacade lors des déplacements

Message par tenkai188 » 06 Juil 2018 15:57

Merci de m'avoir répondu :)
j'ai modifié mon script selon tes indications et j'en ai profité pour le rendre moins brouillon.
Malheureusement le problème de saccade persiste, mais après y avoir réfléchis je ne suis plus certain que le problème viens du script.
Je place le script ainsi qu'une vidéo où le perso se déplace et fais des dash(sans animation pour l'instant) car je n'arrive pas déterminer d'ou vien le probleme (le tileSet, le sprite, son animation, le script, etc..)

Mon script:

Code : Tout sélectionner

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

public class PlayerController : MonoBehaviour
{

    public float moveSpeed;
    private Animator anim;
    private Rigidbody2D myRigidbody;
    private bool playerMoving;
    public Vector2 LastMove;
    private static bool playerExists;

    //dash
    public float dashspeed;
    private float dashTime;
    public float startDashTime;
    private int direction;
    private bool dashOn = false;



    // Use this for initialization
    void Start()
    {
        anim = GetComponent<Animator>();
        myRigidbody = GetComponent<Rigidbody2D>();

        if (!playerExists)
        {
            playerExists = true;
            DontDestroyOnLoad(transform.gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
        //dash
        dashTime = startDashTime;
    }

    // Update is called once per frame
    void Update()
    {
        playerMoving = false;

        if (Input.GetKeyDown(KeyCode.LeftShift))
        {
            dashOn = true;
        }
        if (Input.GetKeyUp(KeyCode.LeftShift))
        {
            dashOn = false;
        }

        if (dashOn)
        {
            if (direction == 0)
            {
                if (Input.GetKeyDown(KeyCode.LeftArrow))
                {
                    direction = 1;
                }
                else if (Input.GetKeyDown(KeyCode.RightArrow))
                {
                    direction = 2;
                }
                else if (Input.GetKeyDown(KeyCode.UpArrow))
                {
                    direction = 3;
                }
                else if (Input.GetKeyDown(KeyCode.DownArrow))
                {
                    direction = 4;
                }
            }
            else
            {
                if (dashTime <= 0)
                {
                    direction = 0;
                    dashTime = startDashTime;
                    myRigidbody.velocity = Vector2.zero;
                }
                else
                {
                    dashTime -= Time.deltaTime;

                    if (direction == 1)
                    {
                        myRigidbody.velocity = Vector2.left * dashspeed;
                    }
                    else if (direction == 2)
                    {
                        myRigidbody.velocity = Vector2.right * dashspeed;
                    }
                    else if (direction == 3)
                    {
                        myRigidbody.velocity = Vector2.up * dashspeed;
                    }
                    else if (direction == 4)
                    {
                        myRigidbody.velocity = Vector2.down * dashspeed;
                    }
                }
            }
        }
        else
        {
            if (Input.GetAxisRaw("Horizontal") > 0.5f || Input.GetAxisRaw("Horizontal") < -0.5f)
            {
                myRigidbody.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * moveSpeed, myRigidbody.velocity.y);
                playerMoving = true;
                LastMove = new Vector2(Input.GetAxisRaw("Horizontal"), 0.0f);
            }

            if (Input.GetAxisRaw("Vertical") > 0.5f || Input.GetAxisRaw("Vertical") < -0.5f)
            {
                myRigidbody.velocity = new Vector2(myRigidbody.velocity.x, Input.GetAxisRaw("Vertical") * moveSpeed);
                playerMoving = true;
                LastMove = new Vector2(0f, Input.GetAxisRaw("Vertical"));
            }

            if (Input.GetAxisRaw("Horizontal") < 0.5f && Input.GetAxisRaw("Horizontal") > -0.5f)
            {
                myRigidbody.velocity = new Vector2(0f, myRigidbody.velocity.y);
            }

            if (Input.GetAxisRaw("Vertical") < 0.5f && Input.GetAxisRaw("Vertical") > -0.5f)
            {
                myRigidbody.velocity = new Vector2(myRigidbody.velocity.x, 0f);
            }

            anim.SetFloat("MoveX", Input.GetAxisRaw("Horizontal"));
            anim.SetFloat("MoveY", Input.GetAxisRaw("Vertical"));
            anim.SetBool("PlayerMoving", playerMoving);
            anim.SetFloat("LastMoveX", LastMove.x);
            anim.SetFloat("LastMoveY", LastMove.y);

        }
    }
}
la video:
https://youtu.be/9Zck09VU268

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

Re: [MY-AL] Sprite qui sacade lors des déplacements

Message par Max » 07 Juil 2018 11:59

Bonjour,
tenkai188 a écrit :
06 Juil 2018 15:57
le perso se déplace et fais des dash(sans animation pour l'instant) car je n'arrive pas déterminer d'ou vien le probleme (le tileSet, le sprite, son animation, le script, etc..)
Avec juste le script, difficile de répondre dans la mesure où nous n'avons pas les autres éléments. Au pire pour dédouaner la partie script, essais d'en bypasser certaines parties.
Mais comme le disait Boubouk, tu as encore un pas mal de travail sur ton script.
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

Avatar de l’utilisateur
tenkai188
Messages : 34
Inscription : 29 Déc 2017 14:59

Re: [MY-AL] Sprite qui sacade lors des déplacements

Message par tenkai188 » 07 Juil 2018 15:32

Désolé je débute
Avec juste le script, difficile de répondre dans la mesure où nous n'avons pas les autres éléments
Quel autres éléments pourrais je fournir pour y voir plus claire ?
Mais comme le disait Boubouk, tu as encore un pas mal de travail sur ton script.
J'ai beau y réfléchir je ne vois plus quoi modifié. Pourrais tu me dire quelle modification apporté ? ou un indice, une indication qui m'aiderait à trouver ce qu'il faut modifié ?

Farstone
Messages : 187
Inscription : 04 Déc 2016 09:38

Re: [MY-AL] Sprite qui sacade lors des déplacements

Message par Farstone » 07 Juil 2018 16:08

Je pense que c'est à toi d'aller à la source du problème en trouvant qu'elle code apporte cette saccade, tu pourras son origine et mieux progresser. Recommence un script de déplacement en fessant des tests régulièrement, et voie ou sa bloque, le rigidbody utilise principalement le FixedUpdate, essaie de voir si c'est mieux en l'utilisant. Une autre possibilité peux être que cette variable velocity est modifié par le rigidbody (a cause du drag ou de la gravité) le fait que le rigidbody utilise le FixedUpdate rendrait ça aléatoire avec des saccades de différente distance. Tu devrais probablement lire la doc sur les rigidbody pour comprendre un peu mieux leur fonctionnement ;-)
Rigidbody 2D

EDIT : Hésite pas a regarder la partie scripting reference si tu veux en savoir plus sur les variables que tu utilisent dans les composants Unity
► Afficher le texte
Tu a l'exemple d'un script de déplacement sur la doc de unity utilisant la variable velocity Scripting Reference "Rigidbody 2D"

Avatar de l’utilisateur
Liven
Messages : 268
Inscription : 30 Nov 2017 01:48

Re: [MY-AL] Sprite qui sacade lors des déplacements

Message par Liven » 08 Juil 2018 01:45

As-tu essayé de passer l'interpolation de ton rigidbody en "interpolate" (ou "extrapolate") ?

Avatar de l’utilisateur
tenkai188
Messages : 34
Inscription : 29 Déc 2017 14:59

Re: [MY-AL] Sprite qui sacade lors des déplacements

Message par tenkai188 » 08 Juil 2018 23:42

Merci Liven :amen:
Le problème semble résolu.
(Cependant je vais quand même essayer d'améliorer mon code)
Merci à tous :)

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

Re: [MY-AL] Sprite qui sacade lors des déplacements

Message par boubouk50 » 09 Juil 2018 10:27

Il y a beaucoup a faire avoir un code lisible et moins redondant. Souvent les conditions sont répétées.
Par exemple:

Code : Tout sélectionner

if (Input.GetKeyDown(KeyCode.LeftShift))
        {
            DashOn = true;
        }
        else if (Input.GetKeyUp(KeyCode.LeftShift))
        {
            DashOn = false;
        }
équivaut à:

Code : Tout sélectionner

DashOn = Input.GetKey(KeyCode.LeftShift);
Car il est actif seulement si la touche est enfoncée. Tu pourrais donc même supprimer la variable DashOn puisqu'elle correspond directement à l'Input.

Également, tu as DashOn == false à toutes tes conditions du haut. Ne le teste qu'une seule fois pour toute au départ. Encapsule donc le tout dans une grande condition:

Code : Tout sélectionner

if (!DashOn) { /*code du haut*/ } else { /*code du bas*/ }
Ensuite, tes conditions peuvent être réduites et regroupées:

Code : Tout sélectionner

 if ((Input.GetAxisRaw("Horizontal")>0.5f || Input.GetAxisRaw("Horizontal") < -0.5f)&& (DashOn == false)) {...1}
 ...
 if((Input.GetAxisRaw("Horizontal") < 0.5f && Input.GetAxisRaw("Horizontal")> -0.5f) && (DashOn == false)) {...2}
        {
Déjà, précédemment on a viré le DashOn == false, aussi on peut ne faire qu'un test avec la valeur absolue, puis mettre la 2e condition dans le else de la première:

Code : Tout sélectionner

if (!DashOn) {
	if (Mathf.Abs (Input.GetAxisRaw("Horizontal"))>0.5f)
	{...1}
	else
	{...2}
	
Pareil pour tout le reste. Ce sera beaucoup plus lisible et bien plus simple à gérer.
"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 « (C#) CSharp »