Я делаю 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);
}
}
Я попытался отладить код, чтобы увидеть, считает ли сценарий, что клавиши нажимаются, но даже сценарий знает, что это не так, поэтому я действительно понятия не имею, что меняет скорость твердого тела.
извини, я имел в виду, что он просто движется в определенном направлении.
Это не отвечает на мой вопрос, меняется ли скорость или нет, когда игрок отпускает контроль.
демонстрация. я нажимаю пробел, и игрок подпрыгивает. я нажимаю (не удерживаю, а нажимаю) клавишу D, пока они все еще находятся в воздухе, что заставляет игрока идти вправо. вместо того, чтобы игрок прекращал движение сразу после того, как я отпускаю клавишу D, он продолжает двигаться в этом направлении, пока не упадет на землю.
другими словами, их горизонтальная скорость не меняется (и это неожиданное поведение), но их вертикальная скорость может продолжать изменяться под действием силы тяжести (и это ожидаемо). спасибо за разъяснения
else {
rb.velocity = new Vector2(0, rb.velocity.y);
}
Установите горизонтальную скорость на ноль.
Это ничего не меняет, к сожалению. Даже если я удалю часть «else», все останется прежним.
Похоже, это приведет к тому, что персонаж не сможет двигаться влево, поскольку это отменит любые изменения, сделанные блоком if (Input.GetKey(KeyCode.A))
.
Кажется, проблема заключается в другой части вашей процедуры 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 В этом ответе нет else
. Вы внимательно прочитали этот ответ?
спасибо @Ruzihm, я не заметил, что леваррис заменил else на if. извините, что я это пропустил, это помогло.
Вы добавляете в 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», все останется прежним.
На что установлено ваше твердое тело «Линейное сопротивление»?
Утверждение Mathf.Lerp(rb.velocity.x, 0, Time.deltaTime * rb.drag);
ничего не меняет. - вы забыли присвоить результат переменной?
@azelito мое линейное сопротивление твердого тела установлено на 0
В приведенном выше примере движение со временем уменьшается на величину линейного сопротивления. Если ваше линейное перетаскивание равно 0, код ничего не делает... :)
Пример else { Mathf.Lerp(rb.velocity.x, 0, Time.deltaTime * rb.drag); }
ничего не делает с линейным сопротивлением.
Вы совершенно правы. Я вообще забыл присвоить значение чему-либо, да. Мне полагается, что я не опробовал мой пример перед публикацией.
Извините, скорость меняется или нет?
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.
звучит так, как есть.