我正在制作2D游戏。我有一个角色和一些瓷砖。瓷砖是1 x 1单位,并放置在场景中。
我使用以下代码移动我的角色。这是我的角色(" Hero")的代码:
public class Hero : MonoBehaviour {
private Vector2 speedX = new Vector2(1, 0);
private Vector2 speedY = new Vector2(0, 1);
void Update () {
if(Input.GetKey("left")) {
rigidbody2D.MovePosition(rigidbody2D.position - speedX * Time.deltaTime);
} else if(Input.GetKey("right")) {
rigidbody2D.MovePosition(rigidbody2D.position + speedX * Time.deltaTime);
} else if(Input.GetKey("up")) {
rigidbody2D.MovePosition(rigidbody2D.position + speedY * Time.deltaTime);
} else if(Input.GetKey("down")) {
rigidbody2D.MovePosition(rigidbody2D.position - speedY * Time.deltaTime);
}
}
}
它可以工作,但它没有按预期移动。当我按下箭头键一次时,它移动大约0.2个单位。如何让玩家每按一下1个单位?
我错过了什么?
答案 0 :(得分:4)
从我看到的情况看,一旦按下按键,你就会想要将角色瞬间移动到新位置。如果是这样,那么您有两个错误:
speedX
或speedY
)乘以Time.deltaTime
。Input.GetKey
不是您想要使用的,因为它会在按下键的每一帧中返回true(每按一次键不会一次)。相反,您需要使用Input.GetKeyDown
。因此,您的代码应如下所示:
public class Hero : MonoBehaviour {
private Vector2 speedX = new Vector2(1, 0);
private Vector2 speedY = new Vector2(0, 1);
void Update () {
if(Input.GetKeyDown("left")) {
rigidbody2D.MovePosition(rigidbody2D.position - speedX);
} else if(Input.GetKeyDown("right")) {
rigidbody2D.MovePosition(rigidbody2D.position + speedX);
} else if(Input.GetKeyDown("up")) {
rigidbody2D.MovePosition(rigidbody2D.position + speedY);
} else if(Input.GetKeyDown("down")) {
rigidbody2D.MovePosition(rigidbody2D.position - speedY);
}
}
}