如何在C#中为位置和旋转变换的GetKey添加冷却时间?unity3d
我试图通过按Q来重置我的汽车位置,以避免汽车被卡住翻车,但当我按Q时,没有冷却,如果我继续按,汽车将飞起来。我不想那样,希望有人能帮我:> 我还想用相同的键码只改变X和Z旋转,但我有问题使其工作 这是我目前拥有的代码如何在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;
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;
}