移动Rigidbody GameObject的正确方法

我刚开始学习Unity。 我尝试使用此脚本进行简单的移动。 前提是,每当有人按’w’时,盒子就会向前移动。

public class PlayerMover : MonoBehaviour { public float speed; private Rigidbody rb; public void Start () { rb = GetComponent(); } 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’按键上向前移动。 我的代码出了什么问题? 我认为这可能是我设置Vector 3 move的方式所以我尝试用速度替换z轴,但这不起作用。 有人能告诉我我搞砸了吗?

使用Rigidbody.MovePosition移动Rigidbody ,并使用Rigidbody.MovePosition旋转它,如果您希望它与周围的对象正确碰撞。 不应通过其位置,旋转或Translate变量/function移动刚体。

“w”不是像SherinBinu所提到的那样预定义的,但这不是唯一的问题。 如果你定义它并使用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(); } 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.GetAxisRawInput.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); } 

除非您明确定义,否则“w”不是预定义的。 使用KeyCode.W

试试这个:

 using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMover : MonoBehaviour { public float speed; private Rigidbody rb; void Start () { rb = GetComponent(); } 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"); } } } 

使用Input.GetKey(KeyCode.W)获取输入。
编辑注意 :要相对于其初始位置移动对象,请使用rb.MovePosition(transform.position+move)而不是rb.MovePosition(move)