Почему не работает Input.GetKeyUp(KeyCode.W) в Unity?

Делаю игру — езду машины на Unity. Хочу, чтобы когда клавиша W отпущена, машина замедлялась.

Написал такой код:

public class CarController : MonoBehaviour
{
    static float speed = 0.0f;
    static float maxSpeed = 120.0f;
    static float minAccelerationSpeed = 10.0f;
    static float maxAccelerationSpeed = 30.0f;
    static Rigidbody rb;

    void Update()
    {
        print(speed);

        if (Input.GetKey(KeyCode.W) && speed < maxSpeed)
            speed += Random.Range(minAccelerationSpeed * Time.deltaTime, maxAccelerationSpeed * Time.deltaTime);

        if (Input.GetKeyUp(KeyCode.W))
            speed -= Random.Range(minAccelerationSpeed * Time.deltaTime, maxAccelerationSpeed * Time.deltaTime);

        rb.AddForce(Vector3.forward * speed * Time.deltaTime * 50);

        if (Input.GetKey(KeyCode.A)) transform.Rotate(0, -speed / 20, 0);
        if (Input.GetKey(KeyCode.D)) transform.Rotate(0, speed / 20, 0);
    }

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
}

При отпускании W не срабатывает Input.GetKeyUp.

Проверял через print — в консоль не выводится.

Почему Input.GetKeyUp не срабатывает? Как правильно сделать, чтобы при отпускании W машина замедлялась?


Ответы (1 шт):

Автор решения: aepot

GetKeyUp немножно не так работает, как вы подумали, почитайте документацию

Самое простое решение для вас может выглядеть так

if (Input.GetKey(KeyCode.W) && speed < maxSpeed)
    speed += Random.Range(minAccelerationSpeed * Time.deltaTime, maxAccelerationSpeed * Time.deltaTime);
if (!Input.GetKey(KeyCode.W) && speed > 0)
    speed -= Random.Range(minAccelerationSpeed * Time.deltaTime, maxAccelerationSpeed * Time.deltaTime);

Но я бы написал ещё проще:

var deltaSpeed = Random.Range(minAccelerationSpeed * Time.deltaTime, maxAccelerationSpeed * Time.deltaTime);
if (!Input.GetKey(KeyCode.W))
{
    deltaSpeed = -deltaSpeed;
}
speed = Mathf.Clamp(speed + deltaSpeed, 0, maxSpeed);

Или если вы решите формулы для разгона и замедления сделать разными, то примерно такой код будет:

if (Input.GetKey(KeyCode.W))
    speed += <формула разгона>;
else
    speed -= <формула замедления>;
speed = Mathf.Clamp(speed, 0, maxSpeed);
→ Ссылка