如何在C#中为位置和旋转变换的GetKey添加冷却时间?unity3d

如何在C#中为位置和旋转变换的GetKey添加冷却时间?unity3d,c#,unity3d,C#,Unity3d,我试图通过按Q来重置我的汽车位置,以避免汽车被卡住翻车,但当我按Q时,没有冷却,如果我继续按,汽车将飞起来。我不想那样,希望有人能帮我:> 我还想用相同的键码只改变X和Z旋转,但我有问题使其工作 这是我目前拥有的代码 if (inVehicle == true && Input.GetKey(KeyCode.Q)) { Vector3 car = transform.position; car.y += 1;

我试图通过按Q来重置我的汽车位置,以避免汽车被卡住翻车,但当我按Q时,没有冷却,如果我继续按,汽车将飞起来。我不想那样,希望有人能帮我:> 我还想用相同的键码只改变X和Z旋转,但我有问题使其工作

这是我目前拥有的代码

if (inVehicle == true && Input.GetKey(KeyCode.Q))
        {
            Vector3 car = transform.position;
            car.y += 1;
            transform.position = car;
            Quaternion rotation = Quaternion.Euler(0, 0, 0);
        }

常用的解决方案是使用Time.Time差

/。。。类字段//
[序列化字段]
保护浮子冷却=0.5f//半秒钟
按float lastKeyPressed=0f;
// ... 在更新功能中//
if((Time.Time-lastKeyPressed)>=cooldown&&inVehicle==true&&Input.GetKey(KeyCode.Q))
{
Vector3车=变换位置;
car.y+=1;
变换位置=汽车;
四元数旋转=四元数.Euler(0,0,0);
lastKeyPressed=Time.Time;
}
如果您不希望Time.unscaledTime受当前时间刻度的影响,也可以使用Time.unscaledTime


另一种选择是使用协同路由作为其他答案中提到的方便方式,但要小心,协同路由通常涉及不必要的GC分配

使用协同路由进行冷却

public float cooldown = 1;
bool canReset = true;

void Update ()
{
    if (inVehicle == true && Input.GetKey(KeyCode.Q) && canReset)
    {
        StartCoroutine(Cooldown(cooldown));
        ...
    }
}

    
IEnumerator Cooldown(float seconds)
{
    canReset = false;
    yield return new WaitForSeconds(seconds);
    canReset = true;
}