我刚开始学习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轴,但这不起作用。有人能告诉我我搞砸了吗?
答案 0 :(得分:4)
您使用Rigidbody.MovePosition
移动Rigidbody
并使用Rigidbody.MoveRotation
将其旋转,如果您希望它与周围的对象正确碰撞。 Rigidbody
不应该被它们的位置,旋转或翻译变量/函数移动。
“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<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);
}
答案 1 :(得分:3)
“w”不是预定义的。使用KeyCode.W
答案 2 :(得分:0)
试试这个:
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)
答案 3 :(得分:0)
您可以使用轴,而不是将w
设置为布尔值,而且,在统一编辑器中,还应该使用轴,以便冻结刚体运动
这是一些代码
void update()
{
rb.AddForce(Input.GetAxis("Horizontal"));
}
答案 4 :(得分:-1)
bool w = Input.GetKeyDown(KeyCode.W);