1. ホーム
  2. c#

[解決済み] Rigidbody GameObjectの正しい動かし方

2022-02-25 12:34:59

質問

Unityを学び始めたばかりです。このスクリプトを使って簡単な箱の動きを作ろうとしました。前提としては、誰かが'w'を押すたびにボックスが前に移動します。

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");

    }

}
}

これを使うと、いつも'w'キー押下でボックスが前に進みません。私のコードに何か問題があるのでしょうか?私は、私のコードにある ベクター3 move が設定されているので、z軸をspeedに置き換えてみましたが、うまくいきません。どなたか、どこを間違えているのか教えてください。

解決方法は?

移動する Rigidbody Rigidbody.MovePosition で回転させ Rigidbody.MoveRotation 周りのオブジェクトと適切に衝突させたい場合。 Rigidbody は、位置、回転、Translate変数/関数によって移動してはいけません。

のようにあらかじめ定義されているわけではありません。 シェリンビヌ が挙げられますが、問題はそれだけではありません。もし、それを定義して KeyCode.W それでもうまくいきません。オブジェクトは一度移動して停止します。

変更

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

になります。

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

これでいいはずだ。

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);
    }
}


最後に、wasdキーでオブジェクトを移動させたいのだと思います。もしそうであれば Input.GetAxisRaw または 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);
}