Кто-нибудь может помочь мне с моей системой реактивного ранца

#c# #unity3d

Вопрос:

Поэтому я использую unity и хочу, чтобы мой объект занимал высоту до тех пор, пока игрок нажимает пробел

Но сейчас он просто прыгает, и вам нужно освободить место, чтобы он улетел

Кто-нибудь может мне помочь ?

 private Rigidbody2D rb;
public float Speed;
private bool spacePressed;
public float jetForce;

pivate void Start()
{
    rb = GetComponent<Rigidbody2D>();
}

private void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        spacePressed = true;
    }
    else
    {
        spacePressed = false;
    }

    Move();
    Jet();
}

private void Move()
{
    float x = Input.GetAxis("Horizontal");
    rb.velocity = new Vector2(Speed * x, rb.velocity.y);
}

private void Jet()
{
    while (spacePressed == true)
    {
        rb.velocity = new Vector2(rb.velocity.x, jetForce);
    }
}
 

Ответ №1:

Input.GetKeyDown это верно только в одном кадре, где кнопка была нажата.

Возвращает значение true во время кадра, когда пользователь начинает нажимать клавишу, определенную ключевым KeyCode enum параметром.

То, что вы ищете Input.GetKey , верно для каждого кадра, пока кнопка остается нажатой.

Возвращает значение true, пока пользователь удерживает клавишу, определенную KeyCode параметром перечисления ключей.


Далее вы определенно не хотите while , чтобы там была петля! Внутри цикла значение spacePressed никогда не изменится => бесконечный цикл =>> сбой приложения!

Вы скорее просто хотите сделать

 // Do continuous physics based things in FixedUpdate, not in Update!
// if there WAS any single event based user input then yes, do it in Update with a field for it
// later handle it in FixedUpdate (not the case here though since there are now only two continuous inputs)
private void FixedUpdate()
{
    Move();
    Jet();
}

private void Move()
{
    var velocity = rb.velocity;
    velocity.x = Input.GetAxis("Horizontal") * Speed;
    rb.velocity = velocity;
}

private void Jet()
{
    // since this method is anyway already called every physics frame
    // there is no need for
    //  - a while loop here
    //  - getting this now continuous user input in Update 
    if(Input.GetKey(KeyCode.Space))
    {
        rb.velocity = new Vector2(rb.velocity.x, jetForce);
    }
}
 

Комментарии:

1. большое вам спасибо (: