如果 C# 中的条件无法在 Unity 中使用 Time.time 正常工作

If condition in C# not working properly with Time.time in Unity

我为一个对象编写了代码,该对象通过按 space 栏来实例化。现在,我还希望它每十秒出现一次。所以,我写了这段代码-

public class Player : MonoBehaviour
{

    [SerializeField]
    private GameObject _laserPrefab;

    [SerializeField]
    private float _fireRate=10.0f;

    private float nextFire=0f;


    // Start is called before the first frame update
    void Start()
    {
        transform.position=new Vector3(0,0,0);

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space) && (Time.time>nextFire)){
            nextFire=Time.time+_fireRate;
            Instantiate(_laserPrefab,transform.position+new Vector3(0,1f,0),Quaternion.identity);
        }
    }

这段代码在每次按下 space 条时实例化对象,但它没有给出我想要的 10 秒间隔。

Input.GetKeyDown() 只有 return 在检测到按键按下的帧中为真。 它不会 return 为真,直到用户释放键并再次按下它。

我认为你可以使用 Input.GetKey() 来实现你想要的。

在这种情况下,您不能 Time.time,因为您没有一直按住该键。在这种情况下,您可能希望使用 Time.deltaTime 来计算自对象实例化以来经过的时间。

所以,在Update()函数中,不断更新nextFire,当对象被实例化时,将其重置为0。

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space) && (nextFire > _fireRate)){
        nextFire = 0;
        Instantiate(_laserPrefab,transform.position+new Vector3(0,1f,0),Quaternion.identity);
    }

    nextFire += time.DeltaTime;
}

当对象被实例化时,nextFire 会重置并在每一帧增加自身。一旦该值达到 10 秒(等于 _fireRate),就可以实例化另一个对象。