移动刚体游戏对象的正确方法
Proper way to move Rigidbody GameObject
我刚开始学习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' 按键时盒子不会向前移动。我的代码有什么问题?我认为这可能是我设置 Vector 3 move
的方式,所以我尝试用速度替换 z 轴,但这没有用。谁能告诉我哪里搞砸了?
"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<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");
}
}
}
使用 Input.GetKey(KeyCode.W)
获取输入。
编辑说明:
要相对于其初始位置移动对象,请使用 rb.MovePosition(transform.position+move)
而不是 rb.MovePosition(move)
如果您希望 Rigidbody
与周围的对象正确碰撞,您可以将 Rigidbody
移动到 Rigidbody.MovePosition
and rotate it with Rigidbody.MoveRotation
。 Rigidbody
不应被其位置、旋转或平移移动 variables/function。
"w" 没有像提到的 那样预定义,但这不是唯一的问题。如果你定义它并使用 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);
}
您可以使用 axis 而不是将 w
设置为 bool,此外,在 unity 编辑器中,您应该设置它以便冻结刚体运动
这是一些代码
void update()
{
rb.AddForce(Input.GetAxis("Horizontal"));
}
bool w = Input.GetKeyDown(KeyCode.W);
我刚开始学习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' 按键时盒子不会向前移动。我的代码有什么问题?我认为这可能是我设置 Vector 3 move
的方式,所以我尝试用速度替换 z 轴,但这没有用。谁能告诉我哪里搞砸了?
"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<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");
}
}
}
使用 Input.GetKey(KeyCode.W)
获取输入。
编辑说明:
要相对于其初始位置移动对象,请使用 rb.MovePosition(transform.position+move)
而不是 rb.MovePosition(move)
如果您希望 Rigidbody
与周围的对象正确碰撞,您可以将 Rigidbody
移动到 Rigidbody.MovePosition
and rotate it with Rigidbody.MoveRotation
。 Rigidbody
不应被其位置、旋转或平移移动 variables/function。
"w" 没有像提到的 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);
}
您可以使用 axis 而不是将 w
设置为 bool,此外,在 unity 编辑器中,您应该设置它以便冻结刚体运动
这是一些代码
void update()
{
rb.AddForce(Input.GetAxis("Horizontal"));
}
bool w = Input.GetKeyDown(KeyCode.W);