Создаём прыжок для 2D персонажа
Один из часто задаваемых вопросов от начинающих разработчиков, это вопрос о реализации прыжка для 2д персонажа. И в данной статье мы разберёмся, как же правильно реализовать прыжок для своего персонажа.
Реализация прыжка состоит из двух частей:
- Непосредственно сам прыжок
- Проверка на наличие земли под ногами персонажа.
Создание прыжка
Для создания прыжка, создадим скрипт С# для нашего персонажа, с названием, например, JumpPlayer. И пропишем в него следующий код:
using UnityEngine; public class jumpPlayer : MonoBehaviour < private Rigidbody2D rb; public float jumpForce = 5.0f; void Awake() < rb = GetComponent(); > 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
В строке #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(); > 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.
На этом всё. А если Вы хотите модернизировать данный прыжок, и сделать его двойным, то можете прочитать о том, как сделать двойной прыжок в нашей новой статье. Всем спасибо, и не забывайте про лайки 🙂
Скрипт ходьбы и бега Unity2D
С ходьбой у персонажа всё отлично, попытался сделать аналогично бег, только увеличть его скорость вдвое, то есть walkSpeed * 2, только когда зажата клавиша Shift и A или D, делал не через стринг, а через бул. Почему с ходьбой все работает отлично, а с бегом такие траблы?
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour < Rigidbody2D rb2d; Animator anim; [SerializeField] private float walkSpeed; private string buttonPressed; private bool playerRuns; public const string RIGHT = "right"; public const string LEFT = "left"; private void Start() < rb2d = GetComponent(); anim = GetComponent(); > private void Update() < //WALK if (Input.GetKey(KeyCode.D)) < buttonPressed = RIGHT; >else if (Input.GetKey(KeyCode.A)) < buttonPressed = LEFT; >else < buttonPressed = null; >//RUN if (Input.GetKeyDown(KeyCode.D)) < if (Input.GetKey(KeyCode.LeftShift)) < playerRuns = true; >> else if (Input.GetKeyDown(KeyCode.A)) < if (Input.GetKey(KeyCode.LeftShift)) < playerRuns = true; >> else < playerRuns = false; >> private void FixedUpdate() < if (playerRuns == true) < rb2d.velocity = new Vector2(walkSpeed * 2.0f * Time.deltaTime, 0); >else < rb2d.velocity = new Vector2(0, 0); >//Walk if (buttonPressed == RIGHT) < rb2d.velocity = new Vector2(walkSpeed * Time.deltaTime, 0); anim.SetBool("Walk", true); >else if (buttonPressed == LEFT) < rb2d.velocity = new Vector2(-walkSpeed * Time.deltaTime, 0); anim.SetBool("Walk", true); >else < rb2d.velocity = new Vector2(0, 0); anim.SetBool("Walk", false); >> >
Отслеживать
29.2k 5 5 золотых знаков 28 28 серебряных знаков 55 55 бронзовых знаков
задан 19 апр 2020 в 16:13
Maxim Kapko Maxim Kapko
13 1 1 серебряный знак 5 5 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
GetKey — зажата ли клавиша
GetKeyDown — событие нажатия
Условия в FixedUpdate сломанные, if (playerRuns) else не имеет значения, поскольку что бы оно не сделало if (buttonPressed == RIGHT) else if (buttonPressed == LEFT) else всё равно изменят результат.
Ещё при одновременном A и D игнорируется A, что плохо.
enum kSide < None, Left, Right >kSide MoveSide; bool IsRunning; private void Update () < if (Input.GetKeyDown(KeyCode.D)) MoveSide = kSide.Right; if (Input.GetKeyDown(KeyCode.A)) MoveSide = kSide.Left; if (Input.GetKeyUp(KeyCode.D)) MoveSide = Input.GetKey(KeyCode.A) ? kSide.Left : kSide.None; if (Input.GetKeyUp(KeyCode.A)) MoveSide = Input.GetKey(KeyCode.D) ? kSide.Rigt : kSide.None; IsRunning = Input.GetKey(KeyCode.LeftShift); >private void FixedUpdate ()
Твои простые if (bool) X = A else X = B легко заменяются конструкцией X = bool ? A : B .
Как реализовать ходьбу в Unity 2D
Unity — мощный движок для разработки компьютерных игр, который предоставляет разработчикам множество возможностей. Одной из часто встречающихся задач при создании 2D-игр является реализация ходьбы для персонажей. В этом руководстве мы покажем, как просто можно реализовать ходьбу в Unity 2D.
Шаги по реализации
- Создайте новый проект в Unity и откройте его в редакторе.
- Создайте новый 2D-сценарий, добавив спрайт или картинку персонажа на сцену.
- Создайте новый скрипт для управления персонажем. Назовите его «PlayerController» или любым другим удобным именем.
- Откройте созданный скрипт в выбранной вами среде разработки, такой как Visual Studio или MonoDevelop.
- Добавьте следующий код в скрипт для управления персонажем:
using UnityEngine;
public class PlayerController : MonoBehaviour
public float speed = 5f;
private Rigidbody2D rb;
private void Start()
rb = GetComponent();
>
private void Update()
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector2 movement = new Vector2(moveHorizontal, moveVertical);
rb.velocity = movement * speed;
>
>
Объяснение кода
Выше приведенный код представляет простую реализацию управления персонажем в Unity 2D. Ваш персонаж будет двигаться в направлении, указанном с помощью клавиш со стрелками или клавиатурой. Настройте скорость движения, изменяя значение переменной «speed».
Работа кода состоит в следующем:
- Мы обращаемся к компоненту Rigidbody2D нашего персонажа и сохраняем его в переменной «rb» в методе Start().
- В методе Update() мы получаем значения горизонтального (moveHorizontal) и вертикального (moveVertical) ввода с помощью функции Input.GetAxis().
- Затем мы создаем новый вектор движения (movement) с помощью полученных значений ввода.
- Мы устанавливаем скорость Rigidbody2D нашего персонажа, умножая вектор движения на значение скорости (speed).
Применение скрипта к персонажу
- Вернитесь в редактор Unity.
- Перетащите скрипт «PlayerController» на объект вашего персонажа на сцене.
- Запустите сцену и попробуйте передвигать персонаж с помощью клавиш со стрелками или клавиатурой.
Заключение
Реализация ходьбы в Unity 2D может быть очень простой с использованием скрипта PlayerController. Вы можете дополнить этот скрипт различными дополнительными функциями, такими как прыжки, анимации или повороты.
Благодаря гибкости и мощи Unity, вам доступны различные методы реализации ходьбы и других механик движения. Постоянная практика и эксперименты сделают вас опытным разработчиком в реализации механик движения в Unity.
Основные шаги для реализации движения персонажа
Для создания движения персонажа в Unity 2D, вам потребуется выполнить несколько основных шагов:
- Создание спрайта персонажа: Начните с создания спрайта персонажа. Это может быть 2D изображение, которое будет отображаться на экране и представлять вашего персонажа. Вы можете создать спрайт с помощью графического редактора или использовать готовые ресурсы из Unity Asset Store.
- Создание анимаций: Для создания реалистичного движения персонажа вам потребуется создать несколько анимаций. Unity позволяет создавать 2D анимации, используя спрайты. Вы можете создать анимации ходьбы, бега, прыжка и других действий вашего персонажа.
- Написание скрипта движения: Для перемещения персонажа по игровому полю вам потребуется написать скрипт движения. Скрипт может использовать физику Unity или простые трансформации для перемещения персонажа влево, вправо, вверх и вниз. Вы также можете добавить код для обнаружения столкновений и других взаимодействий с окружающим миром.
- Привязка скрипта к персонажу: Чтобы использовать созданный скрипт движения, вы должны привязать его к игровому объекту, представляющему вашего персонажа. Это можно сделать в редакторе Unity, просто перетащив скрипт на объект персонажа.
- Настройка управления персонажем: Для управления персонажем вам потребуется настроить управление. Вы можете использовать клавиши на клавиатуре, кнопки на геймпаде или сенсорные взаимодействия на мобильных устройствах. Настройте управление с помощью EventSystem Unity и добавьте обработчики событий, чтобы персонаж реагировал на пользовательский ввод.
- Тестирование и настройка: После завершения всех предыдущих шагов, вы должны протестировать движение вашего персонажа и внести необходимые корректировки. Убедитесь, что ваш персонаж правильно перемещается, анимация воспроизводится корректно и управление работает по вашим ожиданиям.
Следуя этим шагам, вы сможете реализовать движение персонажа в Unity 2D и создать интересную и взаимодействующую с игроком игровую среду. Удачи в вашем творчестве!
Вопрос-ответ
Как реализовать ходьбу персонажа в Unity 2D?
Для реализации ходьбы персонажа в Unity 2D можно использовать простой алгоритм. Необходимо придать персонажу скрипт, который будет отслеживать нажатие клавиш влево и вправо, а также изменять позицию персонажа в соответствии с этими нажатиями. С помощью Input.GetAxis можно определить, был ли нажат клавиш влево или вправо, а затем изменить позицию персонажа с помощью метода Translate.
Как добавить анимацию ходьбы в Unity 2D?
Чтобы добавить анимацию ходьбы к персонажу в Unity 2D, необходимо создать анимационный контроллер и добавить в него анимации перемещения персонажа влево и вправо. Затем в скрипте, отслеживающем нажатие клавиш, нужно добавить код, который будет переключать анимационное состояние персонажа в зависимости от его движения.
Как сделать, чтобы персонаж останавливался, когда не нажата ни одна клавиша?
Чтобы сделать так, чтобы персонаж останавливался, когда не нажата ни одна клавиша, можно добавить проверку на нажатие клавиш во всех направлениях. Если ни одна клавиша не нажата, то скрипт должен перевести анимацию персонажа в состояние покоя и остановить его движение.
Как реализовать бег персонажа в Unity 2D?
Для реализации бега персонажа в Unity 2D можно использовать аналогичный алгоритм ходьбы, но уже с другими параметрами скорости. Вместо перемещения персонажа на небольшое расстояние при каждом нажатии клавиш, нужно увеличить скорость перемещения персонажа, чтобы он двигался быстрее.
Как сделать так, чтобы персонаж мог прыгать в Unity 2D?
Для того чтобы персонаж мог прыгать в Unity 2D, необходимо добавить проверку на нажатие клавиши прыжка к скрипту, отслеживающему нажатия клавиш. Если клавиша прыжка нажата и персонаж сейчас стоит на земле, то нужно применить силу, которая поднимет его вверх.
Как передвинуть 2D объект в место клика мыши
Приветствую начинающих разработчиков. В данной статье мы научимся передвигать объект в то место игрового пространства, в которое пользователь кликнул левой кнопкой мыши. Данная реализация для 2D и 3D существенно отличаются, поэтому для игр 3D была написана отдельная статья под названием «Передвижение персонажа по клику мыши в Unity 3D». Но а мы не будем тянуть, и попробуем реализовать данный функционал для 2D игры.
Первым делом создадим с помощью окна Hierarchy новый игровой объект, назовём его Player, этот объект будет являться нашим персонажем. (2D Object — Sprites — Square).
Далее создадим скрипт c#, с названием Move, и заранее присвойте его к только что созданному объекту Player. Впишите в скрипт следующий код:
using UnityEngine; public class Move : MonoBehaviour < private bool isMoving = false; private Vector3 targetPosition; public float speed = 1f; private void Update() < if (Input.GetMouseButton(0)) < targetPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); isMoving = true; >if (isMoving) < transform.position = Vector2.MoveTowards(transform.position, targetPosition, Time.fixedDeltaTime * speed); if (transform.position == targetPosition) < isMoving = false; >> > >
Предлагаю вкратце разобрать этот код, сначала мы объявляем переменные:
- В строке #5 мы создали переменную isMoving, которая будет хранить информацию о том, нужно ли перемещать нашего персонажа или нет. True — нужно, false — не нужно.
- В строке #6 переменная targetPosition будет хранить координаты того места пространства, на которое мы кликнули, чтобы потом в это место двигать нашего персонажа..
- В встроке #7 переменная speed хранит скорость передвижения персонажа.
Теперь начинается самое интересное. Логика:
- В строке #11 мы сначала с помощью Input.GetMouseButton() определяем, нажата ли левая кнопка мыши, и если нажата, то с помощью Input.mousePosition определяем текущее положение мыши, а потом с помощью ScreenToWorldPoint преобразуем это положение мыши в мировые координаты — это как раз те координаты, куда необходимо двигать нашего персонажа.
- В строке #12 переменной isMoving задаём значение true, чтобы указать, что нужно нашего персонажа привести в движение.
- А уже в строке #15 мы проверяем, если isMoving равняется true, то с помощью метода MoveTowards() мы двигаем нашего персонажа к цели. Строчкой ниже мы проверяем, если позиция нашего персонажа соответствует той позиции, куда мы шли, то необходимо нашу ходьбу прекратить, и записать в переменную isMoving значение false, чтобы указать, что двигаться больше не нужно.
На этом всё, движение 2D объекта по клику мыши готов! Как видите, здесь нет ничего сложного. Если остались вопросы, пишите в комментариях, а так же не забывайте о лайках 🙂