
Приветствую начинающих разработчиков. В данной статье мы научимся реализовывать двойной прыжок персонажа для 2д игры. И если Вы разрабатываете двойной прыжок с самого нуля, то рекомендуем Вам снала ознакомиться со статьёй, в которой мы создавали обычный прыжок для 2д персонажа, а только потом продолжать прочтение данной статьи.
Ниже приведу готовый код обычного прыжка из предыдущей статьи, а заодно кратко его разберём:
using UnityEngine;
public class jumpPlayer : MonoBehaviour
{
private Rigidbody2D rb;
public float jumpForce = 5.0f;
public bool isGround;
public float rayDistance = 0.6f;
void Awake()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
RaycastHit2D hit = Physics2D.Raycast(rb.position, Vector2.down, rayDistance, LayerMask.GetMask("Ground"));
if (hit.collider != null)
{
isGround = true;
}
else
{
isGround = false;
}
if (Input.GetKeyDown(KeyCode.Space) && isGround)
{
rb.AddForce(new Vector2(0, jumpForce), ForceMode2D.Impulse);
}
}
}
В строке #5 и #6 мы объявляем переменные rb и jumpForce, в которых храним ссылку на компонент Rigidbody2D, и силу прыжка в 5.0f.
В строке #8 в переменной isGround мы храним информацию, находится ли игрок на Земле, или нет. А в строке #9 указываем дальность луча, который чуть позже будет выпускать наш персонаж, для обнаружения земли под ногами (значение этой дальности регулируйте для своего персонажа вручную).
В строке #13 мы присваиваем переменной rb, ссылку на компонент Rigidbody2D, чтобы в дальнейшем застявлять персонажа прыгать.
В строке #18 с помощью метода Physics2D.Raycast мы выпускаем от игрока луч, направленный под его ноги. И если луч на своём пути обнаруживает объект, имеющий слой с именем Ground, то это означает, что персонаж находится на земле. И эту информацию мы проверяем и записываем в следующих восьми строчках кода. Поэтому не забудьте указать слой Ground у объектов типа Земля(объекты, с которых можно осуществлять прыжок).
В строке #31 с помощью метода Rigidbody2D.AddForce мы осуществляем прыжок персонажа только в том случае, если нажата клавиша "Пробел", и если персонаж находится на земле. На этом всё, код мы разобрали. Теперь перейдём к самой важной части данной статьи
Двойной Прыжок
Сейчас внесём в код необходиые дополнения и изминения, а далее подробно эти изменения разберём:
using UnityEngine;
public class jumpPlayer11 : MonoBehaviour
{
private Rigidbody2D rb;
public float jumpForce = 5.0f;
public bool isGround;
public float rayDistance = 0.6f;
public bool doubleJump = false;
void Awake()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
RaycastHit2D hit = Physics2D.Raycast(rb.position, Vector2.down, rayDistance, LayerMask.GetMask("Ground"));
if (hit.collider != null)
{
isGround = true;
doubleJump = false;
}
else
{
isGround = false;
}
if (Input.GetKeyDown(KeyCode.Space))
{
if (isGround)
{
rb.AddForce(new Vector2(0, jumpForce), ForceMode2D.Impulse);
}
else if (!doubleJump && rb.velocity.y < 0)
{
doubleJump = true;
rb.AddForce(new Vector2(0, jumpForce), ForceMode2D.Impulse);
}
}
}
}
А теперь разберём, что же мы тут изменили.
Первым делом, в строке #11 мы объявили переменную doubleJump, которая будет хранить информацию о том, был ли использован двойной прыжок или нет?
В строке #25 в переменную doubleJump заносим значение false. То-есть обнуляем двойной прыжок, когда персонаж находится на земле.
Ну и в завершении, в строках #32-43 мы переписали условия, при которых игрок может прыгать. Теперь игрок может прыгать не только тогда, когда находится на земле, но и тогда, когда он находится в полёте, и только в том случае, если двойной прыжок не был использован.
Так же хочу обратить ваше внимание на строку #38, в которой имеется следующая строчка:
rb.velocity.y < 0
Благодаря этой строке, мы позволяем осуществлять двойной прыжок только тогда, когда персонаж уже начинает своё падение вниз. Эту часть можно убрать, но тогда двойной прыжок будет не совсем естественный.
На этом всё. Спасибо всем за внимание. Если остались вопросы, задавайте в комментариях.