2
votes

Le personnage se fige lorsqu'il se déplace automatiquement

J'essaie de faire bouger le personnage automatiquement mais il se fige lorsque le personnage va à gauche ou à droite.

La vidéo:

https://www.youtube.com/watch?v=Ah4cYdXN8Y8

Script de mouvement de personnage:

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

public class Movement : MonoBehaviour
{


    public float moveSpeed;
    public float moveDirection;
    public float jumpForce;
    public AudioSource audioSource;

    private Rigidbody2D rb;
    private bool facingRight = true;
    private bool isJumping = false;
    private string direction = "right";



    // Start is called before the first frame update
    void Start()
    {


        // Screen.SetResolution(640, 480, true);

    }

    // Update is called once per frame
    void Update()
    {
        ProcessInputs();



        // FlipCharacter();
        if(direction == "right"){
            MoveRight();
        }

        if(direction == "left"){
            MoveLeft();
        }

    }


    private void FixedUpdate()
    {
        // Move();
    }

    private void OnCollisionEnter2D(Collision2D c)
    {
        if(c.gameObject.tag == "Rightwall"){

            Debug.Log("wall");
            rb.velocity = new Vector2(-1 * moveDirection * moveSpeed, rb.velocity.y);

            direction = "left";
          
        }

        if (c.gameObject.tag == "Leftwall")
        {

            direction = "right";


        }
    }




    private void Awake()
    {
        rb = GetComponent<Rigidbody2D>();

    }


    private void MoveRight()
    {
        rb.velocity = new Vector2(moveDirection * moveSpeed, rb.velocity.y);

        if(isJumping){
            Debug.Log("yep");
            rb.AddForce(new Vector2(0f, jumpForce),ForceMode2D.Impulse);
            audioSource.Play();
        }
        isJumping = false;
    }

    private void MoveLeft()
    {
        rb.velocity = new Vector2(-1* moveDirection * moveSpeed, rb.velocity.y);

        if (isJumping)
        {
            Debug.Log("yep");
            rb.AddForce(new Vector2(0f, jumpForce), ForceMode2D.Impulse);
            audioSource.Play();
        }
        isJumping = false;
    }


    private void ProcessInputs()
    {
        moveSpeed = moveSpeed;

        if(Input.GetButtonDown("Jump")){
            isJumping = true;
           // Debug.Log("jump");
        }
    }

    private void FlipCharacter(){
        facingRight = !facingRight;
        transform.Rotate(0f, 180f, 0f);

    }

}

Le personnage du jeu est redimensionné 6 fois plus grand.

Valeurs de transformation de caractère

En conséquence, comment puis-je résoudre mon problème? Où ai-je tort?

J'ai travaillé dur pour résoudre mon problème mais je n'ai pas pu le résoudre.

Comment puis-je résoudre ce problème de décalage? Je suis novice à Unity.

EDIT: Je veux dire que le personnage ne bouge pas continuellement . Il bouge discrètement . Mon but est de rendre le mouvement plus fluide. En programmation informatique, je sais qu'il est impossible de faire du mouvement% 100 en douceur, néanmoins, les utilisateurs ne devraient pas remarquer de mouvement "discret". Le mouvement devrait paraître plus réaliste .

Je ne connais pas le vrai problème. Cela peut être un problème FPS (problème Unity et problème d'affichage) ou j'ai fait quelque chose de mal dans le script. Je suis un novice à Unity.

Enfin, comment puis-je résoudre mon problème?

EDIT2: c'est mon FPS. Les valeurs sont-elles normales ou anormales? ou Pouvons-nous dire que "Si le FPS est inférieur à 60 à certains moments, les performances de ce jeu sont vraiment mauvaises. Le FPS doit toujours être égal ou supérieur à 60 pour dire que ses performances sont bonnes" Que pensez-vous? FPS


5 commentaires

De la vidéo, le personnage ne se fige pas. Il se déplace à gauche et à droite. De plus, ne vous assignez pas moveSpeed dans ProcessInputs et débarrassez-vous de moveDirection , vous ne l'utilisez pas.


Regardez bien, ça ne bouge pas comme ça. youtube.com/watch?v=iigQd5FpWOM Dans cette vidéo, le personnage va à droite et à gauche sans aucun arrêt. Cela se passe bien mais mon personnage ne bouge pas si vous regardez attentivement, vous le verrez.


Assez difficile de voir dans la vidéo de quoi vous parlez exactement ... En général: n'utilisez pas le composant Transform lorsque vous traitez avec un Rigidbody! Vous utilisez transform.Rotate(0f, 180f, 0f); ce qui risque de casser la physique .. plutôt utiliser par exemple rb.MoveRotation(...) qui passe par le moteur physique


Veuillez activer le Deep profile et découvrez dans la partie inférieure du profileur d'où viennent exactement vos retards ...


Je ne sais pas ce que ça veut dire? Je suis novice !! J'ai activé mais il semble que rien n'a changé !!


3 Réponses :


3
votes

Tout d'abord, mettez le code de mouvement dans FixedUpdate si cela ne fonctionne pas, continuez à lire ...

Le décalage comme le mouvement n'est probablement pas dû au décalage réel car cela semble être un simple projet d'unité, mais d'abord, vérifiez les fps en vérifiant les statistiques et vérifiez le profileur d'unité si vous voulez être sûr et découvrir comment optimiser le jeu.

Découvrez si le corps rigide a une traînée et réglez-le sur 0 et testez s'il y a encore un mouvement discret.

Ensuite, vérifiez tous les types de mouvement dans l'unité, il existe trois façons de déplacer un objet sans le couper à travers les murs:

La première consiste à régler la vélocité qui est celle que vous avez choisie.

Le second consiste à utiliser AddForce qui, selon mon expérience, n'a pas trouvé de problèmes de décalage avec. Remplacez donc rb.velocity = new Vector2(-1* moveDirection * moveSpeed, rb.velocity.y); avec rb.AddForce(moveDirection*moveSpeed); .

Essaye-le.

Le troisième est d'utiliser MovePosition que je ne recommande pas mais vous devriez tester si vous aimez ce style de mouvement.

Remplacez donc rb.velocity = new Vector2(-1* moveDirection * moveSpeed, rb.velocity.y); avec rb.MovePosition(transform.position+(moveDirection*moveSpeed*Time.deltaTime)); .

Essaye-le.

Voici une vidéo sur le mouvement Unity sur Youtube: https://www.youtube.com/watch?v=ixM2W2tPn6c

Si tout cela ne fonctionne pas, cela est probablement dû au taux de rafraîchissement de l'écran / du framerate d'Unity ou peut-être même à nos yeux qui nous jouent des tours.


2 commentaires

C'est mon profileur. Parfois, il est inférieur à 60 images par seconde. i.ibb.co/rFtw3V6/Ekran-Resmi-2020-11-11-22-49-47.png Que pensez-vous que c'est normal?


@gurkanstack Veuillez activer le Deep profile et découvrez dans la partie inférieure du profileur d'où viennent exactement vos retards ...



2
votes

Harry a donné une excellente réponse ici. Outre ses conseils, je vous recommanderai de faire ceci:

  1. Allez voir l'inspecteur
  2. Dans la barre d'outils ci-dessus, accédez à Actifs> Créer> Matériau physique 2D
  3. Sélectionnez le nouveau matériau physique 2D et définissez Friction sur 0
  4. Fixez ce matériau au corps rigide du joueur

Sachez que nous venons de donner l'instruction que le corps rigide du joueur n'a aucune friction avec un autre collisionneur, il ne s'arrêtera donc jamais sans une entrée de l'utilisateur. Mais en regardant votre code et votre vidéo, cela ne semble pas être un problème


2 commentaires

C'est mon profileur. Parfois, il est inférieur à 60 images par seconde. i.ibb.co/rFtw3V6/Ekran-Resmi-2020-11-11-22-49-47.png Que pensez-vous, est-ce normal?


@gurkanstack Veuillez activer le Deep profile et découvrez dans la partie inférieure du profileur d'où viennent exactement vos retards ...



0
votes

Comme mentionné dans la réponse de Harry , il se peut que vous appliquiez la force dans la fonction Update() dépendante du framerate, vous pouvez essayer de déplacer cela vers FixedUpdate() .

Sinon, vous pouvez essayer d'activer l'interpolation du Rigidbody pour masquer le mouvement saccadé. Vous pouvez le faire soit dans l'inspecteur (voir https://docs.unity3d.com/Manual/class-Rigidbody.html ) soit par code, en utilisant rb.interpolation (voir https://docs.unity3d.com/ScriptReference/ Rigidbody-interpolation.html ).

(De plus, l'éditeur peut parfois afficher un bégaiement qui n'est pas présent dans les versions autonomes, mais pour moi, cela ne se produit que dans des projets plus importants et pas à une fréquence aussi élevée.)


0 commentaires