Unity中的更新中断功能

时间:2017-07-09 18:35:08

标签: c# unity3d game-engine game-physics

我有以下代码

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()函数移动?

1 个答案:

答案 0 :(得分:1)

这里可能会出现一些问题。我首先要注意的是,您使用的是Input.GetKeyDown而不是Input.GetKey - GetKeyDown仅在按下该键的第一帧上返回true(所以它是' s对于像按键一次拍摄一样的东西很有用,而GetKey在按键关闭的整个时间内返回true(因此它对于诸如移动之类的东西很有用)。改变它应该给你你期待的行为。

另一个问题是你在FixedUpdate中进行输入检查。它运行在与Update相关的单独游戏循环中,您可以在此处找到有关此内容的更多详细信息:Is it really wrong to use Input.GetKey() on FixedUpdate?

我会使用InputGetKey将输入状态存储在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);
}

这样,您在输入代码和移动代码之间也有了更强的分离,一旦开始尝试实现更高的复杂性,它就会更容易处理。祝你好运!