Почему не работает 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);