Найти в Дзене

Unity 2D. Ruby's Adventure. Part 33

Ruby теперь может чинить сломанных роботов, но зачем? Ведь он единственный житель нашего мира. Чтобы это исправить, давайте добавим в игру еще одного персонажа. А чтобы он был полезен, научим его разговаривать с Ruby, чтобы рассказать о грандиозном квесте - починить всех роботов! Первая задача — создать персонажа, которым будет лягушка по имени Jambi. Теперь, когда вы познакомились с Unity и создали уже много игровых объектов, вы сможете сами с этим справиться. Чтобы сделать этот процесс еще проще, персонаж использует всего одну зацикленную анимацию. На всякий случай ниже представлена краткая инструкция: Нарежьте атлас спрайтов JambiSheet форматом 4 на 4 спрайта. Выберите все нарезанные спрайты и перетащите из на сцену. Unity автоматически создаст игровой объект, затем анимацию этих трех кадров и назначит ее вновь созданному объекту. Все произойдет автоматически, вам только нужно задать имя для новой анимации - JambiIdle.anim. Переименуйте созданный объект в Jambi. Добавьте Box Collide

Ruby теперь может чинить сломанных роботов, но зачем? Ведь он единственный житель нашего мира. Чтобы это исправить, давайте добавим в игру еще одного персонажа. А чтобы он был полезен, научим его разговаривать с Ruby, чтобы рассказать о грандиозном квесте - починить всех роботов!

Первая задача — создать персонажа, которым будет лягушка по имени Jambi. Теперь, когда вы познакомились с Unity и создали уже много игровых объектов, вы сможете сами с этим справиться. Чтобы сделать этот процесс еще проще, персонаж использует всего одну зацикленную анимацию.

На всякий случай ниже представлена краткая инструкция:

Нарежьте атлас спрайтов JambiSheet форматом 4 на 4 спрайта.

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

Переименуйте созданный объект в Jambi.

Добавьте Box Collider 2D и масштабируйте его, чтобы закрыть только нижнюю часть спрайта, как мы это делали для главного героя или врага.

Создайте слой под названием «NPC» (для неигрового персонажа ) и установите его для объекта Jambi .

Запустите игру и проверьте, правильно ли анимирован персонаж и правильно ли он сталкивается с Ruby.

Персонаж Jambi
Персонаж Jambi

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

Можно разместить триггер перед лягушкой, и если Ruby наступит на этот триггер, начнется диалог. Но это означает, что Ruby может повернуться спиной к лягушке, но при этом все равно сможет с ней разговаривать, что не совсем правильно.

Вместо этого мы будем использовать метод физической системы, который очень полезен в интерактивных приложениях - Raycasting.

Raycasting — это создание луча и проверка, пересекается ли этот луч с коллайдером. Луч имеет начальную точку, направление и длину. Проверка проводится от начальной точки на всем протяжении луча до его конца.

Мы будем "бросать" луч с позиции главного персонажа, в ту сторону, куда он смотрит, с небольшого расстояния 1.5 единицы.

Для этого добавьте следующий код в метод Update скрипта RubyController:

if (Input.GetKeyDown(KeyCode.X))

{

RaycastHit2D hit = Physics2D.Raycast(rb.position + Vector2.up * 0.2f, lookDirection, 1.5f, LayerMask.GetMask("NPC"));

if (hit.collider != null)

{

Debug.Log("Raycast has hit the object " + hit.collider.gameObject);

}

}

Давайте разберем этот код.

В первой строке в условном блоке проверим, нажата ли клавиша X. Это будет кнопка «разговор».

Если клавиша нажата, то "бросаем" луч Raycast. Сначала объявим новую переменную hit типа RaycastHit2D, которая будет хранит результат отбрасывания луча, в частности список коллайдеров, с которыми столкнулся луч.

Метод Physics2D.Raycast создает луч с указанными входными параметрами, в нашем случае из четырех аргументов:

  • первый аргумент - это начальная точка луча, которая находится чуть выше позиции Ruby, то есть в центре спрайта, а не в ногах.
  • второй аргумент - это направление, куда "бросать" луч, то есть направление, в котором смотрит Ruby.
  • третий параметр - максимальная длина луча, в данном случае 1.5, чтобы Raycast проверял пересечения с коллайдерами, которые находятся рядом с персонажем, так как говорить с лягушкой мы можем только рядом с ней.
  • четвертый параметр - маска слоя, позволяющая тестировать только определенные слои, в нашем случае это только слой NPC. Любые слои, которые не подходят под маску, будут игнорироваться во время теста пересечения.

После "бросания" луча проверяем, не попал ли наш Raycast в коллайдер. Если Raycast ничего не пересекает, то значение hit.collider будет нулевым, значит делать ничего не нужно. В противном случае RaycastHit2D будет содержать коллайдер, который Raycast пересек. В этом случае мы выведем в консоль соответствующее сообщение.

Проверьте и сохраните скрипт:

Скрипт RubyController
Скрипт RubyController

Запустите игру и проверьте, что когда Ruby подходит к лягушке и вы нажимаете клавишу X в консоли появляется сообщение: