Проблемы с прыжками и запоминанием времени прыжка - PullRequest
4 голосов
/ 11 марта 2020

Я пытаюсь сделать так, чтобы мой персонаж мог прыгать, когда он заземлен, ИЛИ если он находится в воздухе, чтобы иметь возможность прыгать только тогда, когда у него есть дополнительные прыжки и прошло х количество времени. В настоящее время у меня есть это: ´

void Jump()
{
    jumpTime -= Time.fixedDeltaTime;
    if ((jumpRemember > 0) && ((groundRemember > 0) || ((jumps>0) && (jumpTime <= 0))))
    {
        jumpRemember = 0;
        groundRemember = 0;
        rb.velocity = new Vector2(rb.velocity.x, jumpForce);
        jumps--;
        jumpTime = timeSinceLastJump;
    }
}

(запоминание прыжка и запоминание грунта - это проверки, чтобы увидеть, нажал ли я кнопку прыжка или был заземлен в последние 0,1 секунды)

, но когда он заземлен, сталкивается с крышей и его отправляют обратно на землю, он не может прыгнуть через какое-то время, хотя я использовал оператор «ИЛИ».

Ответы [ 3 ]

3 голосов
/ 11 марта 2020

Попробуйте использовать Debug.Log (переменная), чтобы проверить состояния ваших переменных.

"когда он заземлен, сталкивается с крышей и возвращается на землю" - Какие переменные это изменяет?

Не изменяется ли какая-либо из этих переменных неожиданно, когда персонаж сталкивается с крышей?

Я бы оставил это в комментарии, но вам нужна репутация, чтобы разблокировать эту функцию этого сайта.

2 голосов
/ 11 марта 2020

Пример того, как вы могли бы подойти к вашей проблеме.

const int MAX_JUMPS = 2;
const FLOAT JUMP_TIMER = 1;
const float JUMP_FORCE = 100;

int jumps = 2;
float nextJump = 0;
bool grounded = true;


void Update() 
{
    if (Input.GetKeyDown(KeyCode.Space)) 
       TryJump();
}

void TryJump() 
{
    if (grounded || (jumps > 0 && nextJump < Time.time)) 
    {
        Jump();
    }

}

void Jump() 
{
    rb.velocity = new Vector2(rb.velocity.x, JUMP_FORCE);
    jumps--;
    nextJump = Time.time + JUMP_TIMER;
}

void Grounded() 
{
    grounded = true;
    jumps = MAX_JUMPS;
}

void Airborne()
{
    grounded = false;
}

void OnCollisionEnter(Collision col) 
{
    if (col.tag == "Floor")
        Grounded();

}

void OnCollisionExit(Collision col) 
{
    if (col.tag == "Floor")
        Airborne();

}
1 голос
/ 11 марта 2020

Я думаю, вы поставили круглые скобки. Вы хотите, чтобы оба из первых двух были истинными или оба из вторых двух были правы?

if ((jumpRemember > 0) && ((groundRemember > 0) || ((jumps>0) && (jumpTime <= 0))))

должно ли это быть?

if ((jumpRemember > 0 && groundRemember > 0) || (jumps>0 && jumpTime <= 0))

Эта вторая скобка перед записью GroundRemember, чтобы это было сгруппированы с двумя справа от оператора или. Вы требуете помнить все время, а затем либо вспомнить с нуля> 0, либо два других, чтобы оба были истинными. Это не похоже на то, что вы намереваетесь. Это так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...