Input.GetKeyDown
и Input.GetKeyUp
вызываются только один раз, и именно тогда выполняется действие и рендерится следующий кадр.
Если по какой-либо причине, указанной в c кадре пропущен, либо для по причинам производительности или отладки, они могут привести к неожиданному поведению. что в вашем случае могло бы привести к вызову endSprint
без обнаружения Input.GetKeyDown(KeyCode.LeftShift)
в качестве примера.
Я предлагаю вместо этого использовать Input.GetKey
, который вызывается при каждом обновлении, поэтому пока клавиша удерживается нажатой.
В вашем случае вы можете сделать:
if (Input.GetKeyDown(KeyCode.LeftShift) && !Input.GetKey(KeyCode.Leftcontrol))
, что гарантирует, что левая клавиша Ctrl не удерживается.
Что бы я сделал в аналогичной ситуации, вместо использования Input.GetKeyDown(KeyCode.LeftShift)
я бы создал флаг _isSprinting
и использовал бы его примерно так:
void Update()
{
if (!_isSprinting && Input.GetKey(KeyCode.LeftShift) && !Input.GetKey(KeyCode.Leftcontrol)))
{
beginSprint();
_isSprinting = true;
}
if (_isSprinting && !Input.GetKey(KeyCode.LeftShift))
{
endSprint();
_isSprinting = false;
}
}