Как мне убедиться, что кнопка не нажата в C#? - PullRequest
0 голосов
/ 28 мая 2020

Итак, я сейчас делаю игру на C# и добавил способность спринта, нажав и удерживая левый Shift, но проблема в том, что я не хочу, чтобы игрок мог бегать, приседая, что может происходят в данный момент, пока удерживаются нажатыми левый Shift и левый элемент управления. Я пробовал GetButtonUp и GetButtonDown, но они вообще не работают. Вот мой текущий сценарий спринта с этой проблемой:

public class AdvancedMovement : MonoBehaviour
{
    //Variables;
    PlayerMovement basicMovementScript;
    public float speedBoost = 10f;

    // Start is called before the first frame update
    void Start()
    {
        basicMovementScript = GetComponent<PlayerMovement>();
    }

    // Update is called once per frame
    void Update()
    {

        if (Input.GetKeyDown(KeyCode.LeftShift))
            beginSprint();
        else if (Input.GetKeyUp(KeyCode.LeftShift))
            endSprint();
    }

    private void beginSprint()
    {
        basicMovementScript.speed += speedBoost;
    }

    private void endSprint()
    {
        basicMovementScript.speed -= speedBoost;
    }
}

Я был бы очень признателен за помощь. Спасибо.

1 Ответ

0 голосов
/ 28 мая 2020

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;
    }
}
...