Как сделать персонажа в юнити 2д

Добавил пользователь Дмитрий К.
Обновлено: 04.10.2024

Мэтт Берд пишет всякую чушь, но ему нравится писать уроки по анимации для Unity.Анимация 2D-объектов в Unity - довольно простой процесс, хотя и не совсем понятный. Она немного отличается от 3D-анимаци

Содержание:

Мэтт Берд пишет всякую чушь, но ему нравится писать уроки по анимации для Unity.

Анимация 2D-объектов в Unity - довольно простой процесс, хотя и не совсем понятный. Она немного отличается от 3D-анимации, которая, в зависимости от модели вашего персонажа, может стать невероятно сложной и сложной, и требует некоторой настройки, прежде чем вы будете готовы превратить статические спрайты в движущегося персонажа. Посмотрим, как это делается.

Подготовка анимации

Чтобы оживить 2D-персонажа, вам сначала понадобится лист спрайтов. Листы спрайтов - это длинные прозрачные изображения, которые содержат все созданные вами спрайты в виде ряда строк и столбцов. Существует множество программ, которые можно использовать для создания как спрайтов, так и листов спрайтов; Лично я предпочитаю GraphicsGale, так как увлекаюсь пиксельной графикой. Какую программу вы используете, зависит от ваших личных вкусов, а также от характера вашего проекта.

Независимо от того, как вы собираетесь создавать свою таблицу спрайтов - которая будет отличаться от программы к программе, поэтому вам нужно будет искать дополнительные руководства после этого - вы хотите убедиться, что .jpg, который выдает ваша программа, имеет прозрачный фон. . Часто это влечет за собой выбор одного цвета в качестве цвета фона / стирания (например, темно-зеленого в приведенном выше примере таблицы спрайтов), который служит ориентиром для прозрачных областей изображения. Если этот цвет фона отображается в вашем .jpg за пределами вашей программы редактирования, вы неправильно установили прозрачность.

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

Независимо от того, насколько большими вы хотите, чтобы ваши спрайты были, я очень рекомендуем установить тот же размер пикселей на единицу для каждое произведение искусства, которое вы импортируете в Unity. Если ваш персонаж 32 PPU, ваш фон также должен быть 32 PPU. То же самое и с любыми другими персонажами, врагами, анимацией эффектов и т. Д. Установка всего на другой PPU может выглядеть очень странно, если вы не будете осторожны.

Независимо от других ваших настроек, вы захотите изменить Sprite Mode прямо вверху на Multiple. Затем нажмите кнопку Sprite Editor на несколько полей вниз. Откроется окно редактора спрайтов.

Окно редактора спрайтов позволяет вам манипулировать отдельными кадрами и путаться с различными настройками, которые могут создавать широкий спектр эффектов. Однако для наших целей нам нужно использовать редактор спрайтов только для объединения нашего листа спрайтов. В настоящее время, если вы вытащите лист спрайтов в Unity, вы получите GameObject, который состоит из каждого спрайта на вашем листе, а это не то, что вам нужно.

Поднимитесь к Slice в верхней части редактора. Это откроет меню Slice, показанное выше. Здесь вы можете разделить лист спрайтов на более мелкие изображения, которые Unity позже интерпретирует как отдельные кадры для вашей анимации. Как вы будете нарезать лист, зависит от вас, но я предпочитаю установить для Типа значение Сетка по размеру ячейки, а затем ввести точные размеры листа. одиночный кадр моего спрайта. Графические программы, которые создают спрайты персонажей, обычно работают покадрово, поэтому должно быть легко определить размеры ваших кадров, проверив вашу графическую программу. В этом случае я создал каждый из своих кадров размером 64 x 64 пикселя, поэтому я ввожу размер пикселя равным 64 и 64. Это разбивает лист спрайтов на шесть разных кадров, обозначенных слабыми белыми линиями, которые появляются на изображении. под меню. Если эти линии в какой-то момент делят ваши изображения пополам, значит, у вас неправильные размеры.

Теперь каждый кадр можно по отдельности перетащить в ваш проект и использовать как собственный GameObject.

Это была большая подготовка, но, наконец, вы готовы к анимации. Переходим к следующему шагу.

Создание анимации

Далее вам нужны вкладки Animator и Animation. Если по умолчанию их нет на экране Unity, вы можете добавить их, перейдя в Window, а затем прокрутив вниз до Animation. Анимации - это отдельные покадровые последовательности, которые заставляют вашего персонажа двигаться; Аниматоры - это небольшие блоки обработки, которые сообщают GameObjects, к каким анимациям они могут получить доступ, а также позволяют Unity запускать анимации из сценария. Вам нужно и то, и другое, чтобы анимировать GameObject.

Это также создаст компонент Animator на вашем GameObject, а также контроллер, который хранит все анимационные клипы Animator. Он появится в ваших активах как файл .controller. Я рекомендую переместить все создаваемые вами файлы - анимационные клипы и контроллер - в ту же папку, что и ваш лист спрайтов, для облегчения доступа. Вам также следует создать префаб GameObject, над которым вы работаете, поэтому перетащите GameObject вниз в папку в представлении Project.

yourObject.GetComponentAnimator> (). Play ("yourAnimationName");

Дополнительные советы

Конечно, анимация GameObject в Unity намного шире, и рассмотрение каждой основы выходит за рамки этой статьи. Тем не менее, давайте взглянем на несколько быстрых советов, которые помогут вам начать создавать и использовать анимацию, выходящую за рамки основ:

В прошлой статье было небольшое введение в принцип работы Bolt и основы визуального программирования. В этой же попробуем небольшой платформер сделать и затронем основные аспекты.

​Поработаем с силами, рейкастами и затронем тему модульности и переиспользования компонентов.


Цикл статей

​Туториалы можно скачать бесплатно с Гитхаба. Каждый туториал будет отдельной папкой в проекте. Конкретно этот туториал будет лежать в директории Assets/Tutorials/02 — Platformer.

Оглавление

Подготовка

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


В инспекторе добавляем к объекту компонент Flow Machine.


Нажимаем Edit Graph и приступает к настройке графа.

Движение персонажа

Мы хотим, чтобы персонаж двигался влево и вправо в зависимости от горизонтальной оси ввода, для которой предварительно настроены сочетания клавиш A и D на клавиатуре или левый джойстик на контроллере. Когда вы идёте влево, возвращается -1 , а когда вправо, то +1 . Скорость движения зададим в переменной.

Для начала можно зайти в настройки и задать необходимое управление в Edit > Project Settings > Input Manager, если не нравятся дефолтные настройки.


Теперь добавим переменную, откуда будем читать скорость. В инспектора объекта игрока добавим переменную в компоненте Veriables. Подробнее можно почитать в документации.

Далее, собственно, нам нужно получить горизонтальную ось ввода. Мы можем сделать это с помощью блока Get Axis.

Новый узел будет полупрозрачным. Так Unity нам сообщает, что они пока нигде не используется. Этот эффект можно отключить на панели отжав пункт Dim.


Далее мы хотим на основании инпута вычислить итоговое значение скорости. Для этого нужно считать значение переменной Speed, созданной ранее, перемножить со значением с инпута и записать в новую переменную.

  1. От выхода узла GetAxis тащим указатель и создаём узел Multiply.
  2. От второго входа нового узла тянем указатель и создаём узел для чтения переменной Variables > Object > Get Object Variable.
  3. Выбираем там Speed.
  4. Выход узла Multiply соединяем с новым узлом Variables > Graph -> Set Graph Variable.
  5. Дадим новой переменной имя Movement.
  6. Соединяем управляющий вход с Update.

Каждый кадр (событие Update) мы получаем значение инпута по оси X в диапозоне [-1;1], домножаем на скорость и сохраняем в переменную Movement.

Теперь нужно задать компоненту Rigidbody 2D персонажа скорость. Скорость состоит из двух составляющих — по осям X и Y, которые пакуются в Vector2 .

  1. Добавляем узел Get Variable для получения Movement из предыдущего шага.
  2. Это передаёт на вход X координате новой ноде Vector2.
  3. А в Y передаём считанную Y координату из текущей скорости (Codebase > Unity Engine > Rigidbody 2D -> Get Velocity).
  4. Полученный вектор передаём на вход узлу для установки нового значения скорости (Codebase > Unity Engine > Rigidbody 2D -> Set Velocity).

Остаётся теперь связать выход узла по установке Movement со входом узла, устанавливающего скорость.

Ну и заодно сгруппируем узлы. Это делается выделением с зажатой клавишей Ctrl .

Если запустить редактор, можно увидеть, как персонаж двигает при нажатии на клавиши. Обратите внимание на граф и то, как меняется значение скорости на нём в режиме реального времени.

  1. Если двигаемся вправо (значение Movement больше 0), значение Scale должно быть положительным.
  2. Если движемся влево (значение Movement меньше 0), значение Scale должно быть отрицательным.
  3. Если стоим на месте (значение Movement равно 0), то ничего не делаем.

Значение Y и Z оставляем как есть.


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

Но сейчас персонаж просто скользит. Хотелось бы сделать анимацию движения.

Анимация

Возьмём готовые спрайты и анимации из примера проекта Penny Pixel.

Если открыть аниматор, то нас там пока интересует всего 2 анимации: айдловая и бега. Если посмотреть на переход для анимации бега, то заметим, что оно зависит от скорости по оси X. Нам всего лишь нужно это значение передавать аниматору.

Ну и флажок grounded пока в true выставим, чтобы не запускалась анимация полёта.


На графе, как я уже сказал, нам нужно всего лишь передать значение скорости аниматору и записать в переменную velocityX.


Остаётся только соединить с остальным графом и запустить.

Следующим шагом добавим возможность прыгать.

Придание силы объекту для прыжка

  1. Добавим глобальную переменную для силы прыжка и назовём JumpPower.
  2. Events > Input, а там On Button Input.
  3. Вместе со считанной силой прыжка передаём в Codebase > Unity Engine > Rigidbody 2D > Add Force (Force, Mode).

Если запустить, то по нажатию на Space персонаж будет прыгать. Но есть одна проблема…

Во-первых, нету анимации прыжка. Во-вторых, если, находясь в воздухе, снова нажать Space, то персонаж прыгнет ещё раз. А нам бы этого не хотелось.

Создадим новый слой и назначим его платформам.


Необходимо дописать логику по проверке, находится ли персонаж на земле. Один из способов — рейкасты. Будем выпускать лучи вниз на небольшое расстояние, чтобы проверить, сталкиваются ли они с платформой. Проверять как раз по этому слою будем.

Переиспользование логики

Так как эта проверку нужна в двух местах, то выделим всю логику в отдельный юнит Assets > Create > Bolt > Flow Macro.

Для каста использовать будем CircleCast . Хотя это не так принципиально.

  1. Получаем позицию текущую.
  2. Делаем рейкаст по слою Platform, направляя вниз с радиусом 2 и дальностью 2.
  3. Результат получаем в отдельную ноду.
  4. Делаем проверку на то, было ли столкновение.
  5. Результат проверки столкновения луча с платформой пишем в bool переменную IsGrounded на выход.

Теперь в графе персонажа нужно немного изменить узлы, обрабатывающие прыжок.

  1. Перетаскиваем на граф персонажа граф GroundCheck.
  2. Добавляем ветвление.
  3. Соединяем с узлом, задающим силу.

Если запустить, то увидим, что персонаж теперь может прыгать только находясь на платформе.

Точно также добавим проверку к анимации.


Теперь, если персонаж в воздухе, будет проигрываться соответствующая анимация.

Хотелось бы как-то визуализировать дебажную информацию для отладки.

Отладка и OnDrawGizmos

Было бы неплохо как-то визуализировать рейкаст. Как минимум, хочется видеть, как далеко он бьёт. Для этого можно воспользоваться событием OnDrawGizmos , которое позволяет в редакторе рисовать отладочную информацию.

В нашем случае просто будет рисовать линию. Увеличим дальность луча до 50 и добавим соответствующие узлы для отрисовки линии.

  1. Вытаскиваем информацию о текущем положении.
  2. Создаём Vecto3 на основе X и Z координаты. Эта позиция будет конечной при отрисовки линии.
  3. Рейкаст мы делаем вниз, поэтому в Y координату вписываем Y координату текущего положения персонажа с за вычетом дальности луча.
  4. Добавляем ивент, который каждый кадр рисует информацию.
  5. На вход узла по отрисовке в начальную координату передаём текущее положение персонажа, а конечной точкой будет новое вычисленное значение позиции.

Ещё нужно в Scene View включить отображение Gizmos.


Теперь запустим и посмотрим.

Увеличив дальность проверки для рейкаста мы дали возможно персонажу прыгать даже в воздухе.

В следующей статье поработаем с окнами и сделаем экран смерти персонажа с перезапуском сцены.

Если хотите поддержать выход статей, сделать это можно одним из способов.

🏓 Создаем 2D-игру на Unity: инструкция для новичка

Недавно мы рассказали о том, как научиться разработке игр на Unity . Продолжим тему на практике и покажем, как новичку создать на этой платформе первую 2D-игру.

Если вы хотите получить более систематическое образование в области разработки игр, мы рекомендуем рассмотреть факультет разработки игр онлайн-университета GeekBrains.

Двумерные игры сравнительно просты: для них не требуется сложных 3D-моделей, программный код по сравнению с 3D-проектами выглядит понятнее. Такие игры популярны как на десктопах, так и на мобильных устройствах. Unity также позволяет разрабатывать игры и для браузеров.

За последние годы вышло много популярных двумерных игр:

Программная реализация 2D-игр проще не только из-за отсутствия третьего измерения: на самой сцене меньше объектов, вместо трехмерных моделей плоские спрайты, вместо скелетной анимации – покадровая. А еще 2D-игры проще портировать на другие платформы – легче найти новую аудиторию.

Давайте создадим простую игру в жанре пинг-понг 🏓 . Перед тем как приступить к созданию игры, продумайте, какой именно результат хотите получить. На первых этапах рекомендуется использовать схематические шаблоны, чтобы быстрее получить работающий результат. В этой инструкции мы так и поступим. Графических ресурсов использовать не будем: и ракетки, и отбиваемый мяч будем пока отображать простыми белыми спрайтами.

Предварительно рассмотрим основные понятия Unity, без понимания которых будет проблематично создать игру:

Предполагаем, что вы уже установили редактор и создали аккаунт на портале Unity.

В первую очередь создадим новый проект и откроем его настройки (Edit → Project Settings). Во вкладке Editor установим параметр Default Behaviour Mode в значение 2D

Настройка проекта Детальная настройка проекта

Следующим шагом сохраним текущую активную сцену, назвав ее, например, Scene1. Теперь создадим основные игровые объекты: ракетку, мяч и менеджер игры, в котором будет храниться основная логика игры.

1. Создаем пустой объект, переименовываем в GameManager.

Создаем пустой объект

Создаем пустой объект

3. Создаем квадратный спрайт, называем его Pad (Assets → Create → Sprites → Square). Аналогично создаем круглый спрайт Ball (Assets → Create → Sprites → Circle). Масштабируем спрайт Pad со следующими параметрами – x:0.5, y:2.5, z:1.

Создаем спрайты

Создаем спрайты

4. Создаем префабы для Pad и Ball, после чего добавляем к ним компонент Box Collider 2D (включаем параметр Is Trigger) и компонент Rigidbody 2D (выставляем параметр Body Type в значение Kinematic).

Добавляем .компонент Box Collider 2D Настраиваем.компонент Box Collider 2D Добавляем компонент Rigidbody 2D Масштабируем спрайты

6. Заполняем скрипты следующим кодом.

GameManager.cs Ball.cs Pad.cs

6. Добавляем к префабу Ball и Pad теги с аналогичными именами. Выделив префабы, в инспекторе мы можем видеть выпадающий список тегов. Там же расположены и кнопки для добавления и редактирования тегов.

7. В настройках камеры выставляем параметр Projection в значение Orthographic, а параметр Clear Flag – в значение Solid Color.

Настройка камеры

Настройка камеры

8. Настраиваем кнопки, как показано на следующих скриншотах (Edit → Project Settings → Input Manager).

Настройка ввода, основное Настройка ввода, первый игрок Настройка ввода, второй игрок

Вот и всё, игра готова!

Пинг-понг, итоговый результат

Пинг-понг, итоговый результат

Билд для платформы Windows

1. Официальный туториал от Unity, где детально рассмотрен процесс создания roguelike RPG.

2. Youtube-канал Brackeys , где можно найти серию видеоуроков по созданию 2D-платформера.

3. Youtube-канал N3K EN содержит множество уроков как по отдельным компонентам Unity, так и полноценные серии уроков по созданию игр с нуля.

Если у вас мало опыта в разработке игр на Unity, мы рекомендуем обратить внимание на факультет разработки игр GeekBrains . Материал хорошо структурирован и содержит все необходимое для того, чтобы стать профессиональным Unity-разработчиком.

В числе прочего вы разработаете 2D-платформер с физическими загадками и динамическим освещением, научитесь портировать его на мобильные устройства. Кроме того, разработаете полноценную браузерную стратегию, а также игру в жанре двухмерных гонок.

По окончании обучения вы будете иметь портфолио из 4 игр, которое можно показать на собеседовании. Если же какая-то часть материала будет непонятна, вы всегда можете обратиться к персональному преподавателю.

Движение персонажа в Unity 2D (для чайников)

Движение персонажа в Unity 2D (для чайников)

Движение персонажа в Unity 2D (для чайников)

Движение персонажа в Unity 2D (для чайников)

Видео - огонь, доступно, понятно и по делу. БОЛЬШОЕ СПАСИБО. Так держать.Жду следующие выпуски.

если вы используете джойстик то этот код не подойдет(при повороте во круг своей оси) вот код для джойстика:
public FixedJoystick jstk;

public float moove;
public bool facingRight;

public void FixedUpdate()
<
if (moove 0f)
<
facingRight = false;
>
if (facingRight)
<
GetComponent ().flipX = true;
>
if(facingRight == false)
<
GetComponent ().flipX = false;
>
>

Ты меня просто спас)) Посмотрел примерно 30 роликов, и почти везде все говорили "Вы просто переписывайте код, как у меня". Ты же всё понятно и чётко объясняешь) Огромное тебе спасибо. Посмотрю все ролики❤❤❤

В—вауви!; Я думал это просто невозможно ; а тут движение как я хочу сделать в своей игре!;

Чел. 1000 сердец тебе. Приду домой и перепишу код дударя, построенный на if-ах..

Хорошее объяснение, что редкость. Спасибо подписался

Обалденный канал! Спасибо большое за такое подробное объяснение. Нигде раньше таких подробностей не слышал!

Я не понял одного момента. Почему он разворачивает персонажа, если координата по горизонтали(X) больше 0 или меньше?

Окей. Твоё код рабочий, тут споров нет, но я НЕ ПОНИМАЮ, почему ЭТО именно ТАК?!

Вот смотри:
Мы начинаем движене с 0 координаты и уходим в + по X на 100 пунктов к примеру? В Инспекторе в SpriteRenderer тоже будет написано, что мы в +100 по X. Если мы нажимаем ВЛЕВО - он ВСЁ РАВНО разворачивается! ПОЧЕМУ?! Условие же ведь не выполняется! Почему так?

Читайте также: