Один из часто задаваемых вопросов от начинающих разработчиков, это вопрос о реализации прыжка для 2д персонажа. И в данной статье мы разберёмся, как же правильно реализовать прыжок для своего персонажа.
Реализация прыжка состоит из двух частей:
- Непосредственно сам прыжок
- Проверка на наличие земли под ногами персонажа.
Создание прыжка
Для создания прыжка, создадим скрипт С# для нашего персонажа, с названием, например, JumpPlayer. И пропишем в него следующий код:
using UnityEngine;
public class jumpPlayer : MonoBehaviour
{
private Rigidbody2D rb;
public float jumpForce = 5.0f;
void Awake()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(new Vector2(0, jumpForce), ForceMode2D.Impulse);
}
}
}
Вкратце разберём наш код:
В строке #5 и #6 мы создаём две переменные. Переменная rb будет хранить ссылку на компонент Rigidbody2D, а переменная jumpForce указывает силу прыжка.
В десятой строке мы присваивает переменной rb ссылку на компонент Rigidbody2D.
В строке #15 мы проверяем, была ли нажата клавиша "Пробел" ? Если да, то в строке #17, с помощью метода Rigidbody2D.AddForce, выполняем прыжок персонажа.
На этом всё. Но не совсем :)
Дело в том, что при такой реализации прыжка, наш персонаж может прыгать даже в тех случаях, когда он не находится на земле. Тем самым персонаж становится летающим, будто птичка из игры Flappy Bird.
Для исправления этого бага, нам необходимо каждый раз перед прыжком, проверять наличие земли под ногами персонажа.
Проверка на наличие земли под ногами персонажа.
Сейчас нам нужно написать скрипт, который будет проверять, есть под ногами нашего персонажа Земля? Для этого используем метод Physics2D.Raycast:
public bool isGround;
public float rayDistance = 0.6f;
RaycastHit2D hit = Physics2D.Raycast(rb.position, Vector2.down, rayDistance, LayerMask.GetMask("Ground"));
if (hit.collider != null)
{
isGround = true;
}
else
{
isGround = false;
}
В строке #1 и #2 мы создали две дополнительные переменные. Переменная isGround будет хранить информацию о том, есть ли под ногами земля или нет. True - есть, а False - нету.
В строке #4 с помощью метода Raycast мы выпускаем лучь под ноги нашего персонажа, который ищет там землю. Земля это объект, который имеет слой Ground. Поэтому обязательно создайте слой с именем Ground, и присвойте его всем объектам земли.
Весь остальной код, начиная со строки #6, мы проверяем, нашёл ли наш луч землю под ногами, и если да, то в переменную isGround заносим значение true, если нет, то false.
Так же обратите своё внимание на то, что длину луча, которая записана в переменную rayDistance, необходимо отрегулировать под высоту вашего персонажа. Поэтому, если Ваш персонаж высокий, то и значение луча необходимо увеличить.
На самом деле вариантов проверок наличия земли под ногами персонажа большое множество. И если по какой либо причине Вам не понравился, или не подошёл данный способ, то Вы можете посмотреть о других способах проверки земли под ногами персонажа, о которых мы говорили в одной из предыдущих статей.
Итог
Теперь давайте совместим всё что у нас получилось, и посмотрим на итоговый код:
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);
}
}
}
Обратите внимание, что в строке #31 для осуществления прыжка мы проверяем не только нажатие на клавишу "пробел", но и на значение isGround, которое должно быть true.
На этом всё. А если Вы хотите модернизировать данный прыжок, и сделать его двойным, то можете прочитать о том, как сделать двойной прыжок в нашей новой статье. Всем спасибо, и не забывайте про лайки :)
Спасибо, реализация с лучом мне нравится больше