2017-09-26 6 views
2

Donc je fais un platformer 2d dans Unity, (Encore nouveau pour C# et Unity aussi), et j'essaye de faire un script de mouvement pour un simple carré, et le carré sera aléatoirement arrête de bouger, et je vais devoir sauter pour recommencer à bouger, seulement pour que cela se reproduise.Unity 2d Numéro de script Movement

public class PlayerMovement : MonoBehaviour 
{ 
    public float moveSpeed; 
    public float jumpHeight; 

    void Start() 
    { 
    } 

    void Update() 
    { 
     if (Input.GetKeyDown(KeyCode.Space)) 
     { 
      GetComponent<Rigidbody2D>().velocity = new Vector2(GetComponent<Rigidbody2D>().velocity.x, jumpHeight); 
     } 

     if (Input.GetKey(KeyCode.D)) 
     { 
      GetComponent<Rigidbody2D>().velocity = new Vector2(moveSpeed, 0); 
     } 

     if (Input.GetKey(KeyCode.A)) 
     { 
      GetComponent<Rigidbody2D>().velocity = new Vector2(-moveSpeed, 0); 
     } 
    } 
} 
+1

Ceci est probablement dû au collisionneur sur l'objet. L'objet est-il placé sur un 'terrain'? Votre script fonctionne-t-il s'il n'y a pas de terrain (et la gravité est désactivée)? – Bejasc

+0

Votre code est incomplet 'GetComponent () .velocity = nouveau Vector2 (GetComponent () .velocity.x,' ce qui m'amène à croire que ce n'est pas le code exact utilisé.Veuillez fournir le code exact. Comme @Bejasc l'a noté, c'est probablement une bosse dans le sol, assurez-vous que le terrain est ou essayez-le avec un collisionneur en forme de sphère – Maakep

Répondre

0

La bonne réponse est probablement dans les commentaires, par @Bejasc, à condition que vous nous avez fourni le code réel utilisé. Voici quelques conseils que vous ne demanderez pas d'améliorer votre code en termes de propreté, les meilleures pratiques et certaines fonctionnalités:

  1. Ne pas utiliser GetComponent <>() chaque fois que vous voulez lire une valeur. Enregistrez-le dans une variable lors de la création de GameObject! (Vérifiez la méthode Start() dans le code ci-dessous)
  2. Vous réglez Y-velocity sur 0 si le joueur bouge, cela ne fonctionnera pas si vous voulez sauter et bouger en même temps, si vous sautez Y vitesse à jumpHeight) puis déplacez (en réglant la vélocité Y à 0) votre personnage flottera au milieu de l'air puisque nous mettons la vitesse Y à 0 à chaque image. Réglez-le à la vitesse Y actuelle à la place! (Vérifiez le paramètre y dans le new Vector2 lors du déplacement)

code résultant:

public class PlayerMovement : MonoBehaviour 
{ 
    public float moveSpeed; 
    public float jumpHeight; 
    Rigidbody2D rb; 

    void Start() 
    { 
     rb = GetComponent<Rigidbody2D>(); 
    } 

    void Update() 
    { 
     if (Input.GetKeyDown(KeyCode.Space)) 
     { 
      rb.velocity = new Vector2(rb.velocity.x, jumpHeight); 
     } 

     if (Input.GetKey(KeyCode.D)) 
     { 
      rb.velocity = new Vector2(moveSpeed, rb.velocity.y); 
     } 

     if (Input.GetKey(KeyCode.A)) 
     { 
      rb.velocity = new Vector2(-moveSpeed, rb.velocity.y); 
     } 
    } 
} 

Pour ce script simple mouvement que vous pouvez également simplifier le code de mouvement un groupe en faisant: (À condition d'utiliser les paramètres d'entrée standard dans les paramètres de saisie Unitys (Édition -> Paramètres du projet -> Entrée)

Input.GetAxis ("horizontale") sera -1 si A, left arrow ou left on a gamepad joystick est pressé et 1 si D, right arrow ou right on a gamepad joystick est pressé. Ce sont les paramètres par défaut pour "Horizontal" et je suppose que vous pouvez deviner ce que "Vertical" fait. Faites-moi savoir si vous avez des questions ou si cela a été utile du tout.

+0

D'accord, alors maintenant je sais que c'était un problème avec le collisionneur, parce que je suis passé à un collisionneur de cercle et cela a fonctionné, cependant, il produit un mouvement instable.Tout moyen de résoudre ce problème? – ODOG

+0

Pourriez-vous décrire le problème dans un peu plus de détails? Vous utilisez la physique pour déplacer votre balle, si la surface sur laquelle elle glisse est fragile, son mouvement sera fragile – Maakep

+0

Je vais vérifier ce soir, je n'ai pas pu vérifier la nuit dernière. – ODOG

0

La seule façon dont j'ai réussi à faire cela est de changer le pas de temps fixe à 0,0166 dans le gestionnaire de temps. Semble le moteur physique et mise à jour ne sont pas synchronisés avec le résultat un bégaiement.