2 votes

Mouvement saccadé dans Unity 2D

Essentiellement, j'essaie de créer un système de déplacement de joueur similaire à celui de RPG Maker avec 8 directions. J'ai réussi en partie, mais pas complètement. Lorsque j'essaie de changer brusquement de direction par exemple de haut à gauche, le personnage bégaye et refuse de bouger sans relâcher toutes les touches au préalable.

L'échelle de gravité est désactivée ou plutôt réglée à 0, le type de corps est dynamique.

Voici un code :

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

public class MoveChar : MonoBehaviour {

Rigidbody2D rigid;

public float Vitesse;

// Utilisez ceci pour l'initialisation
void Start () {

    rigid = GetComponent();

}

// Update est appelé une fois par frame
void Update () {

//        float horiz = Input.GetAxis("Horizontal");

//        float vert = Input.GetAxis("Vertical");

    if(Input.GetKeyDown(KeyCode.W)) //________________________________________MOUVEMENT VERS LE HAUT

    {
        rigid.velocity = new Vector2(rigid.velocity.x, 1 * Vitesse);
    }
    else if(Input.GetKeyUp(KeyCode.W))
    {
        rigid.velocity = new Vector2(0, 0);
    }

    if (Input.GetKeyDown(KeyCode.S)) //_______________________________________MOUVEMENT VERS LE BAS
    {
        rigid.velocity = new Vector2(rigid.velocity.x, -1 * Vitesse);
    }
    else if (Input.GetKeyUp(KeyCode.S))
    {
        rigid.velocity = new Vector2(0, 0);
    }

    if (Input.GetKeyDown(KeyCode.A)) //_______________________________________MOUVEMENT VERS LA GAUCHE
    {
        rigid.velocity = new Vector2(-1 * Vitesse, rigid.velocity.y);
    }
    else if (Input.GetKeyUp(KeyCode.A))
    {
        rigid.velocity = new Vector2(0, 0);
    }

    if (Input.GetKeyDown(KeyCode.D)) //_______________________________________MOUVEMENT VERS LA DROITE
    {
        rigid.velocity = new Vector2(1 * Vitesse, rigid.velocity.y);
    }
    else if (Input.GetKeyUp(KeyCode.D))
    {
        rigid.velocity = new Vector2(0, 0);
    }
}

2voto

Ruzihm Points 7430

Utilisez Input.GetAxis(axisName) pour éviter les conflits de cas dans votre code d'entrée. De plus, utilisez AddForce pour interagir correctement avec les autres rigidbodies.

Vector2 oldV = rigid.velocity;
float horiz = Input.GetAxis("Horizontal");
float vert = Input.GetAxis("Vertical");

Vector2 newV = new Vector2(horiz * Speed, vert * Speed);
rigid.AddForce(newV-oldV, ForceMode2D.Impulse);

Alternativement, gardez une trace de vos propres axes lorsque les touches sont relâchées/enfoncées.

public float horiz;
public float vert;

void Start() {
    horiz = 0f;
    vert = 0f;
    if (Input.GetKey(KeyCode.A)) horiz -= 1f;
    if (Input.GetKey(KeyCode.D)) horiz += 1f;
    if (Input.GetKey(KeyCode.S)) vert -= 1f;
    if (Input.GetKey(KeyCode.W)) vert += 1f;
}

void Update () {
    Vector2 oldV = rigid.velocity;

    if(Input.GetKeyDown(KeyCode.W)) vert += 1f;
    else if(Input.GetKeyUp(KeyCode.W)) vert -= 1f;

    if (Input.GetKeyDown(KeyCode.S)) vert -= 1f;
    else if (Input.GetKeyUp(KeyCode.S)) vert += 1f;

    if (Input.GetKeyDown(KeyCode.A)) horiz -= 1f;
    else if (Input.GetKeyUp(KeyCode.A)) horiz += 1f;

    if (Input.GetKeyDown(KeyCode.D)) horiz += 1f;
    else if (Input.GetKeyUp(KeyCode.D)) horiz -= 1f;

    Vector2 newV = new Vector2(horiz * Speed, vert * Speed);
    rigid.AddForce(newV-oldV, ForceMode2D.Impulse);
}

0voto

Raph_Wa Points 49

Il n'y a qu'un petit problème avec le relâchement du bouton. Ajoutez la force d'origine dans la direction qui n'est pas affectée par la touche. Tout le script devrait ressembler à ceci :

void Update()
{
    if (Input.GetKeyDown(KeyCode.W)) //________________________________________MONTANT
    {
        rigid.velocity = new Vector2(rigid.velocity.x, 1 * Speed);
    }
    else if (Input.GetKeyUp(KeyCode.W))
    {
        rigid.velocity = new Vector2(rigid.velocity.x, 0);
    }

    if (Input.GetKeyDown(KeyCode.S)) //_______________________________________DESCENDANT
    {
        rigid.velocity = new Vector2(rigid.velocity.x, -1 * Speed);
    }
    else if (Input.GetKeyUp(KeyCode.S))
    {
        rigid.velocity = new Vector2(rigid.velocity.x, 0);
    }

    if (Input.GetKeyDown(KeyCode.A)) //_______________________________________GAUCHE
    {
        rigid.velocity = new Vector2(-1 * Speed, rigid.velocity.y);
    }
    else if (Input.GetKeyUp(KeyCode.A))
    {
        rigid.velocity = new Vector2(0, rigid.velocity.y);
    }

    if (Input.GetKeyDown(KeyCode.D)) //_______________________________________DROITE
    {
        rigid.velocity = new Vector2(1 * Speed, rigid.velocity.y);
    }
    else if (Input.GetKeyUp(KeyCode.D))
    {
        rigid.velocity = new Vector2(0, rigid.velocity.y);
    }
}

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X