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

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

Вот сценарий движения:

public float jumpHeight;

public float speed;

public Rigidbody2D rb;

private bool isGrounded;

public Transform feetPos;

public float checkRadius;

public LayerMask Ground;

private float jumpTimeCounter;

public float jumpTime;

private bool isJumping;

void Update()
{
    PausedThisFrame = false;

    isGrounded = Physics2D.OverlapCircle(feetPos.position, checkRadius, Ground);

    if (isGrounded && Input.GetKeyDown(KeyCode.Space))
    {
        isJumping = true;
        jumpTimeCounter = jumpTime;
        rb.velocity = Vector2.up * jumpHeight;
    }
    if (Input.GetKey(KeyCode.Space) && isJumping)
    {
        if (jumpTimeCounter > 0)
        {
            rb.velocity = Vector2.up * jumpHeight;
            jumpTimeCounter -= Time.deltaTime;
        }
        else
        {
            isJumping = false;
        }
    }
    if (Input.GetKeyUp(KeyCode.Space))
    {
        isJumping = false;
    }
}

void FixedUpdate()
{
    if (Input.GetKey(KeyCode.A))
    {
        Debug.Log("A");
        rb.velocity = new Vector2(-1 * speed, rb.velocity.y);
        transform.eulerAngles = new Vector3(0, 180, 0);
    }
    if (Input.GetKey(KeyCode.D))
    {
        Debug.Log("D");
        rb.velocity = new Vector2(1 * speed, rb.velocity.y);
        transform.eulerAngles = new Vector3(0, 0, 0);
    }
    else
    {
        rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y);
    }
}

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

Извините, скорость меняется или нет? they continue to move in the direction they were moving while jumping звучит так, будто скорость не меняется. Но i trully have no idea what's changing the velocity of the rigidbody. звучит так, как есть.

Ruzihm 30.05.2024 20:51

извини, я имел в виду, что он просто движется в определенном направлении.

Vota 30.05.2024 21:22

Это не отвечает на мой вопрос, меняется ли скорость или нет, когда игрок отпускает контроль.

Ruzihm 30.05.2024 21:35

демонстрация. я нажимаю пробел, и игрок подпрыгивает. я нажимаю (не удерживаю, а нажимаю) клавишу D, пока они все еще находятся в воздухе, что заставляет игрока идти вправо. вместо того, чтобы игрок прекращал движение сразу после того, как я отпускаю клавишу D, он продолжает двигаться в этом направлении, пока не упадет на землю.

Vota 30.05.2024 21:45

другими словами, их горизонтальная скорость не меняется (и это неожиданное поведение), но их вертикальная скорость может продолжать изменяться под действием силы тяжести (и это ожидаемо). спасибо за разъяснения

Ruzihm 30.05.2024 21:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
69
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

else {
    rb.velocity = new Vector2(0, rb.velocity.y);
}

Установите горизонтальную скорость на ноль.

Это ничего не меняет, к сожалению. Даже если я удалю часть «else», все останется прежним.

Vota 30.05.2024 21:26

Похоже, это приведет к тому, что персонаж не сможет двигаться влево, поскольку это отменит любые изменения, сделанные блоком if (Input.GetKey(KeyCode.A)).

Ruzihm 30.05.2024 21:46
Ответ принят как подходящий

Кажется, проблема заключается в другой части вашей процедуры FixUpdate(). Часть

else
{
rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y);
}

присваивать себе только копию вектора скорости. Таким образом, значения не меняются. Попробуйте это вместо другого

if (!Input.GetKey(KeyCode.A) &&
    !Input.GetKey(KeyCode.D))
    {
       rb.velocity = new Vector2(0, rb.velocity.y);
    }

Проверка ввода необходима только для установки скорости X на ноль, когда ни одна клавиша не нажата;)

Это ничего не меняет, к сожалению. Даже если я удалю часть «else», все останется прежним.

Vota 30.05.2024 21:26

@Vota В этом ответе нет else. Вы внимательно прочитали этот ответ?

Ruzihm 30.05.2024 21:40

спасибо @Ruzihm, я не заметил, что леваррис заменил else на if. извините, что я это пропустил, это помогло.

Vota 30.05.2024 21:48

Вы добавляете в rb.velocity.x с помощью

rb.velocity = new Vector2(1 * speed, rb.velocity.y);

но вы никогда не уменьшаете ее... В приведенном ниже утверждении вы, по сути, говорите, что скорость = скорости. Попробуйте заменить

else
{
    rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y);
}

с чем-то вроде

else
{
    rb.velocity = new  Vector2(Mathf.Lerp(rb.velocity.x, 0, Time.deltaTime * rb.drag), rb.velocity.y);
}

Это ничего не меняет, к сожалению. Даже если я удалю часть «else», все останется прежним.

Vota 30.05.2024 21:26

На что установлено ваше твердое тело «Линейное сопротивление»?

azelito 30.05.2024 21:37

Утверждение Mathf.Lerp(rb.velocity.x, 0, Time.deltaTime * rb.drag); ничего не меняет. - вы забыли присвоить результат переменной?

Ruzihm 30.05.2024 21:39

@azelito мое линейное сопротивление твердого тела установлено на 0

Vota 30.05.2024 21:40

В приведенном выше примере движение со временем уменьшается на величину линейного сопротивления. Если ваше линейное перетаскивание равно 0, код ничего не делает... :)

azelito 30.05.2024 21:56

Пример else { Mathf.Lerp(rb.velocity.x, 0, Time.deltaTime * rb.drag); } ничего не делает с линейным сопротивлением.

Ruzihm 30.05.2024 22:18

Вы совершенно правы. Я вообще забыл присвоить значение чему-либо, да. Мне полагается, что я не опробовал мой пример перед публикацией.

azelito 31.05.2024 07:12

Другие вопросы по теме