Goede manier om Rigidbody GameObject te verplaatsen

Ik ben net begonnen met het leren van Unity. Ik heb geprobeerd een eenvoudige doosbeweging te maken door dit script te gebruiken. Het uitgangspunt is dat wanneer iemand op ‘w’ drukt, de box vooruit gaat.

public class PlayerMover : MonoBehaviour {
public float speed;
private Rigidbody rb;
public void Start () {
    rb = GetComponent<Rigidbody>();
}
public void Update () {
    bool w = Input.GetButton("w");
    if (w) {
        Vector3 move = new Vector3(0, 0, 1) * speed;
        rb.MovePosition(move);
        Debug.Log("Moved using w key");
    }
}
}

Telkens wanneer ik dit gebruik, gaat het vak niet vooruit bij een ‘w’-toets. Wat is er mis met mijn code? Ik dacht dat het misschien de manier was waarop ik mijn Vector 3 moveheb ingesteld, dus ik probeerde de z-as te vervangen door snelheid, maar dat werkte niet. Kan iemand me vertellen waar ik een rommeltje maak?


Antwoord 1, autoriteit 100%

Je verplaatst Rigidbodymet Rigidbody.MovePositionen roteer het met Rigidbody.MoveRotationals je wilt dat het goed botst met objecten eromheen. Rigidbodymag niet worden verplaatst door hun positie, rotatie of de Translate-variabelen/functie.

De “w” is niet vooraf gedefinieerd zoals SherinBinugenoemd, maar dat is niet het enige probleem. Als je het definieert en KeyCode.Wgebruikt, werkt het nog steeds niet. Het object zal één keer bewegen en stoppen.

Wijzigen

Vector3 move = new Vector3(0, 0, 1) * speed;
rb.MovePosition(move);

Naar

tempVect = tempVect.normalized * speed * Time.deltaTime;
rb.MovePosition(transform.position + tempVect);

Dit zou het moeten doen:

public float speed;
private Rigidbody rb;
public void Start()
{
    rb = GetComponent<Rigidbody>();
}
public void Update()
{
    bool w = Input.GetKey(KeyCode.W);
    if (w)
    {
        Vector3 tempVect = new Vector3(0, 0, 1);
        tempVect = tempVect.normalized * speed * Time.deltaTime;
        rb.MovePosition(transform.position + tempVect);
    }
}

Eindelijk, ik denk dat u uw object met WASD-toets wilt verplaatsen. Als dat het geval is, gebruik dan Input.GetAxisRawof Input.GetAxis.

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

Antwoord 2, Autoriteit 17%

“W” is niet vooraf gedefinieerd tenzij u het expliciet definieert. Gebruik Keycode.w


Antwoord 3

Probeer dit:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMover : MonoBehaviour {
    public float speed;
    private Rigidbody rb;
    void Start () {
        rb = GetComponent<Rigidbody>();
    }
    void Update () {
        bool w = Input.GetKey(KeyCode.W);
        if (w) {
            Vector3 move = new Vector3(0, 0, 1) * speed *Time.deltaTime;
            rb.MovePosition(move);
            Debug.Log("Moved using w key");
        }
    }
}

Gebruik Input.GetKey(KeyCode.W)om invoer te krijgen.
OPMERKING BEWERKEN:
Om het object relatief ten opzichte van zijn oorspronkelijke positie te verplaatsen, gebruikt u rb.MovePosition(transform.position+move)in plaats van rb.MovePosition(move)


Antwoord 4

In plaats van ween bool te maken, kun je axis gebruiken, ook in de unity-editor moet je het zo maken dat de beweging van het starre lichaam wordt bevroren

hier is wat code

void update()
{
    rb.AddForce(Input.GetAxis("Horizontal"));
}

Antwoord 5

bool w = Input.GetKeyDown(KeyCode.W);

Other episodes