Не спринтирате, докато сте приклекнали?

Така че съм в ранните етапи на създаване на 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