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.
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?
3 Réponses :
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.
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 ...
Harry a donné une excellente réponse ici. Outre ses conseils, je vous recommanderai de faire ceci:
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
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 ...
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.)
De la vidéo, le personnage ne se fige pas. Il se déplace à gauche et à droite. De plus, ne vous assignez pas
moveSpeed
dansProcessInputs
et débarrassez-vous demoveDirection
, 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 utiliseztransform.Rotate(0f, 180f, 0f);
ce qui risque de casser la physique .. plutôt utiliser par exemplerb.MoveRotation(...)
qui passe par le moteur physiqueVeuillez 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é !!