Не бежите, присев?

Итак, я нахожусь на ранней стадии создания игры FPS, и я только что реализовал функцию спринта и приседания (в данный момент приседание только замедляет игрока). функции просто таковы:

private void sprintInput()
{

    if (Input.GetKeyDown(sprintKey))
    {           
        movementSpeed *= 2f;
    }
    if (Input.GetKeyUp(sprintKey))
    {          
        movementSpeed /= 2f;
    }
}


private void crouchInput()
{
    if (Input.GetKeyDown(crouchKey))
    {           
        movementSpeed /= 2f;
    }
    if (Input.GetKeyUp(crouchKey))
    {
        movementSpeed *= 2f;
    }
}

Как бы они ни были написаны, они, очевидно, могут быть активированы одновременно. Но я хочу присесть вместо спринта. Поэтому, если я использую спринт и приседание одновременно, активируется только приседание. Я пробовал несколько методов, но ничего не работает, я уверен, что упускаю что-то болезненно очевидное, я просто не знаю, что.


person Jaxper    schedule 18.11.2018    source источник


Ответы (2)


Установите логическую переменную в значение true/false, когда вы приседаете или нет.

bool isCrouching;

private void crouchInput()
{
    if (Input.GetKeyDown(crouchKey))
    {        
        isCrouching = true;   
        movementSpeed /= 2f;
    }
    if (Input.GetKeyUp(crouchKey))
    {
        isCrouching = false; 
        movementSpeed *= 2f;
    }
}

Затем вы можете использовать эту переменную, чтобы убедиться, что вы не приседаете перед спринтом:

private void sprintInput()
{
    if (!isCrouching  && Input.GetKeyDown(sprintKey))
    {           
        movementSpeed *= 2f;
    }
    if (!isCrouching && Input.GetKeyUp(sprintKey))
    {          
        movementSpeed /= 2f;
    }
}

Модификатор спринта будет доступен для активации только тогда, когда вар/кнопка приседания не используется.

person Dbercules    schedule 18.11.2018
comment
Ваш код приседания не был завершен, так как вы его нигде не устанавливаете. Пришлось отредактировать, чтобы добавить это. - person Programmer; 18.11.2018
comment
Не беспокойтесь, я не знал, что должен написать все решение! Мне также интересно, почему двойное объявление (!isCrouching...) лучше, чем один контейнер с тем же эффектом? - person Dbercules; 18.11.2018
comment
Вам не нужно было писать весь код. Просто покажите важные части, где и когда писать в isCrouching и когда читать из него. Вот и все. Двойное объявление isCrouching не лучше и не хуже. Он просто сохраняет код очень близким к исходному коду и учит использовать &&. Чтобы избежать слишком большого количества операторов if, вам придется использовать && для упрощения кода. Вы можете изменить его, если хотите. - person Programmer; 18.11.2018
comment
Нет, это не проблема, мне просто было интересно! - person Dbercules; 18.11.2018

Принятый ответ фактически делает эксплойт в вашей игре. Игрок нажимает «Спринт» (скорость x2), нажимает «Присесть» (скорость /2), отпускает «Спринт» (ничего не происходит), затем отпускает «Присесть» (скорость x2), что навсегда удваивает его скорость.

Я думаю, что более правильным подходом будет хранение обоих флагов:

bool isCrouching, isSprinting;
float baseSpeed, movementSpeed;

private void sprintInput {
    if (Input.GetKeyDown(sprintKey)) {        
        isSprinting = true;
        UpdateSpeed ();
    }
    if (Input.GetKeyUp(sprintKey)) {
        isSprinting = false; 
        UpdateSpeed ();
    }
}

private void crouchInput {
    if (Input.GetKeyDown(crouchKey)) {        
        isCrouching = true;
        UpdateSpeed ();
    }
    if (Input.GetKeyUp(crouchKey)) {
        isCrouching = false; 
        UpdateSpeed ();
    }
}

private void UpdateSpeed () {
    movementSpeed = isCrouching ? baseSpeed / 2
                  : isSprinting ? baseSpeed * 2
                  :               baseSpeed;
}
person trollingchar    schedule 18.11.2018