我有以下代码
public Rigidbody2D rb;
public float speed = 5f;
void FixedUpdate()
{
if (Input.GetKeyDown("w"))
{
Fire();
}
}
void Fire()
{
rb.MovePosition(rb.position + Vector2.down * speed * Time.deltaTime);
}
但是每次我玩游戏时,球都不会根据射击功能移动,它只会在y轴上下降1。
如何编辑我的代码,以便Rigidbody根据Fire()函数移动?
答案 0 :(得分:1)
这里可能会出现一些问题。我首先要注意的是,您使用的是Input.GetKeyDown
而不是Input.GetKey
- GetKeyDown仅在按下该键的第一帧上返回true(所以它是' s对于像按键一次拍摄一样的东西很有用,而GetKey在按键关闭的整个时间内返回true(因此它对于诸如移动之类的东西很有用)。改变它应该给你你期待的行为。
另一个问题是你在FixedUpdate中进行输入检查。它运行在与Update相关的单独游戏循环中,您可以在此处找到有关此内容的更多详细信息:Is it really wrong to use Input.GetKey() on FixedUpdate?
我会使用Input
和GetKey
将输入状态存储在Update循环中的Vector2
中,然后使用FixedUpdate中的数据进行实际移动:
public Rigidbody2D rb;
public float speed = 5f;
private Vector2 velocity = Vector2.zero;
void Update()
{
if (Input.GetKey("w"))
{
velocity = Vector2.down * speed;
}
else {
velocity = Vector2.zero;
}
}
void FixedUpdate()
{
MoveBall();
}
void MoveBall()
{
rb.MovePosition(rb.position * velocity * Time.deltaTime);
}
这样,您在输入代码和移动代码之间也有了更强的分离,一旦开始尝试实现更高的复杂性,它就会更容易处理。祝你好运!