Hoe een 2D-object te verplaatsen met WASD in Unity

Mijn onderstaande code werkt alleen voor horizontale bewegingen. Zou de verticale beweging ook niet moeten werken? Ik begin net met de basisprogrammering van 2D Unity:

public class Player : MonoBehaviour {
    //These fields will be exposed to Unity so the dev can set the parameters there
    [SerializeField] private float speed = 1f;
    [SerializeField] private float upY;
    [SerializeField] private float downY;
    [SerializeField] private float leftX;
    [SerializeField] private float rightX;
    private Transform _transformY;
    private Transform _transformX;
    private Vector2 _currentPosY;
    private Vector2 _currentPosX;
    // Use this for initialization
    void Start () {
        _transformY = gameObject.GetComponent<Transform> ();
        _currentPosY = _transformY.position;        
        _transformX = gameObject.GetComponent<Transform> ();
        _currentPosX = _transformX.position;
    }
    // Update is called once per frame
    void Update () {
        _currentPosY = _transformY.position;
        _currentPosX = _transformX.position;
        float userInputV = Input.GetAxis ("Vertical");
        float userInputH = Input.GetAxis ("Horizontal");
        if (userInputV < 0) 
            _currentPosY -= new Vector2 (0, speed);     
        if (userInputV > 0)
            _currentPosY += new Vector2 (0, speed);
        if (userInputH < 0)
            _currentPosX -= new Vector2 (speed, 0);
        if (userInputH > 0)
            _currentPosX += new Vector2 (speed, 0);
        CheckBoundary ();
        _transformY.position = _currentPosY;
        _transformX.position = _currentPosX;
    }
    private void CheckBoundary(){
        if (_currentPosY.y < upY)
            _currentPosY.y = upY;
        if (_currentPosY.y > downY)
            _currentPosY.y = downY;
        if (_currentPosX.x < leftX)
            _currentPosX.x = leftX;
        if (_currentPosX.x > rightX)
            _currentPosX.x = rightX;
    }
}

Als ik de _currentPosXverwijder/becommentarieer en het zijn gerelateerde codes, dan werkt mijn verticale beweging. Maar als ik de _currentPosYverwijder/becommentarieer en het zijn gerelateerde codes, dan werkt mijn horizontale beweging.

Maar hoe komt het dat ik problemen heb om ze tegelijkertijd aan het werk te krijgen? Ik denk dat ik gewoon iets over het hoofd zie, maar ik kom er niet uit omdat ik hier nog maar een beginner in ben.

Met dank aan degene die advies kan geven.

EDIT: voor verdere verduidelijking…

Ik codeer een eenvoudig 2D-spel waarbij de speler in 4 richtingen beweegt met behulp van de WASD-toetsen.

W = move up
A = move left
S = move down
D = move right

Mijn grootste probleem is dat ik twee van de toetsen alleen in één as kan laten werken: ofwel A en D werken voor Horizontaal, terwijl W en S helemaal niet werken voor Verticale beweging of omgekeerd.


Antwoord 1, autoriteit 100%

Je hebt die if-instructies niet nodig. Gebruik gewoon +=om de invoer toe te voegen aan de huidige transformatiepositie.

Verplaats zonder Rigidbody:

public float speed = 100;
public Transform obj;
public void Update()
{
    float h = Input.GetAxis("Horizontal");
    float v = Input.GetAxis("Vertical");
    Vector3 tempVect = new Vector3(h, v, 0);
    tempVect = tempVect.normalized * speed * Time.deltaTime;
    obj.transform.position += tempVect;
}

Object verplaatsen met Rigidbody2D:

public float speed = 100;
public Rigidbody2D rb;
public void Update()
{
    float h = Input.GetAxis("Horizontal");
    float v = Input.GetAxis("Vertical");
    Vector3 tempVect = new Vector3(h, v, 0);
    tempVect = tempVect.normalized * speed * Time.deltaTime;
    rb.MovePosition(rb.transform.position + tempVect);
}

Ik raad aan om de tweede code te gebruiken en de Rigidbody te verplaatsen als je later een botsing wilt kunnen detecteren.

Opmerking:

U moet het object toewijzen om naar het obj-vak in de Editor te gaan. Als u de tweede code gebruikt, wijst u het object met de Rigidbody2Dtoe aan het rb-slot in de Editor.


Antwoord 2

Probeer de waarde 0 in de Vector2-functies te veranderen in de huidige x/y-positie… Ik kwam een soortgelijk probleem tegen met mijn project

if (userInputV < 0) 
        _currentPosY -= new Vector2 (/*current position*/, speed); 

Other episodes