Стики и работа с Event System в Unity 3D

Учебные материалы для школы программирования. Часть 12

Предыдущие уроки можно найти здесь:

Этот материал состоит из двух частей:

В первой, рассмотрим создание удобных стиков, подходящих под любые разрешения экранов и любую диагональ.

Познакомимся с использованием Event System в разрезе работы с UI и реализации пользовательской обработки реакции на указатель мыши/тачпада.

Далее, перейдем ко второй, где создадим скрипт, реализующий доступ к другим объектам посредством Event System.

По ходу дела, попробуем свои силы в работе со static-переменными для реализации удобной имплементации модулей в проект, и узнаем о глобальных и локальных координатах RectTransform.

Обе части занятия являют собой продолжение работы над проектом «Жидкий персонаж».

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

Порядок выполнения

Создадим новую панель со следующими параметрами:

b9c72a7b0aa441fa77796c058b9180b7

Панель — отвечает за активную зону для нажатий. От её размеров зависит площадь, на которой будет работать стик.

Внутри панели создадим 2 Image согласно иерархии на скриншотах — Joy и Mushroom Joy — тело нашего стика, Mushroom — его грибок.

Их параметры:

ff4241e64dacef7f13a9d7c861f36b42b7305c7eeb0faac611e23f2d0f0aaa5e

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

Создадим скрипт. Скрипт необходимо закинуть на панель. Его полный листинг выглядит так (если в таком формате совсем неудобно, пишите в комментах — перенаберу исходный код):

2bb2a09eb0dab06a4ca8d7f6f9f07385.png21b9c5ae74bf768bcc42cc706817d7d4.png

Разберём его подробнее
Для начала подключим пространство имён для обработки событий:

using UnityEngine.EventSystems;

За обработку нажатий отвечают методы OnPointerDown и OnPointerUp. Для их работы необходимы следующие интерфейсы: IpointerDownHandler и IpointerUpHandler.

Чтобы работать с информацией о конкретном нажатии (а в случае мультитача данных нажатий может быть несколько) объявляем поле private PointerEventData eventData;

При нажатии на экран вызывается OnPointerDown и складывает информацию о нажатии в eventData.

В дальнейшем это позволяет нам работать с eventData из метода Update ().

Для того, чтобы понимать, актульна ли информация о нажатии, введена булева переменная OnScreen. Если мы нажали на экран, то переменная принимает значение true, объект Joy становится в точку нажатия и объекты Joy и Mushroom становятся видимыми.

Метод OnPointerUp отключает видимость Joy и Mushroom и переводит переменную OnScreen в false.

Остальная обработка возникает в Update ().
Там мы выставляем Mushroom по глобальной точке нажатия и меряем её локальные координаты.

Принцип такой: нажали, грибок и джой выставились в току нажатия.
Передвинули палец/указатель — и грибок сместился относительно джоя. Это смещение мы и берём из локальных координат. Его и используем как результат.

Теперь, в любом скрипте, который используем методы типа GetAxis строку типа Input.GetAxis («Horizontal») меняем на CustomStick.horizontal

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

9c3c325a7adb59f3864ca42324c6c391

Приложенный ассет имеет полностью готовый и настроенный стик в виде префаба и сцены. Помните, что система эвентов не будет работать без данного объекта, который создаётся автоматически при создании Canvas через меню.

389c3a790cc0402f7f2e91c7e4dd999a

Хочется напомнить, все материалы рассчитаны на использование в составе проекта с главным героем — желе.

d23e8ef527e90b362adef83123046103

Перейдем ко второй части.

Использование своих типов эвентов через код

Откроем проект Goo (жидкий желеобразный персонаж), созданный ранее. Проект используется как пример, можно использовать любой другой.

Создадим новый скрипт. Его листинг:

e705144be18b3810f9c6786ff27455ed.png

Несмотря на то, что скрипт очень лёгкий, он может многое. Скрипт требует коллайдера в режиме триггера и реагирует на игрока.

Если мы выложим его на пустой объект на сцене, мы можем увидеть привычное окно системы эвентов.

ba72d6b700c63439714fd55e648a9bb9

Рассмотрим пару вариантов использования этого скрипта. Вариант первый — создание потайной двери-стены, открывающийся ключом. Для этого нам понадобится спрайт стены с обычным коллайдером и спрайт или модель ключа с коллайдером в режиме триггера.
Также можно добавить ещё один пустой объект и закинуть на него звук, создав тем самым AudioSource. Уберём у AudioSource галочку вопроизведения при старте и закинем в него ключ и стены.

11dc1857fd6eaffd47fad9fd980bce34

Далее настроим сам ключ. В данной конфигурации ключ выключает стену, включает звук и выключает себя.

74bba9a41867f96ab66d80787b9b9324

Это самый простой пример логики. Рассмотрим посложнее.

Создадим ловушку, в которую игрок может зайти, но как только будет пытаться выйти, перед ним будет закрываться дверь до тех пор, пока игрок не найдёт кнопку.

d68ad6fad791578c1f3a2e2de041a05e

Создать её будет сложнее. Кратко, логику можно описать так: у нас есть стенка, которая включается, чтобы не дать игроку выйти. (изначально она выключена, чтобы игрок вошёл).

18d2bbd565b2b1aad406e56dd99c637e

Стенку включает триггер, находящийся прямо возле неё. (Тоже изначально выключен)

314ae40bbd5d7d4c341efb4048a51fe4

По центру есть ещё один триггер, выключающий стенку и включающий триггер, включающий стенку.
Работает это так — игрок проходит сквозь выключенную стенку и сквозь выключенный триггер стенки, ничего не происходит. Заходит в триггер по центру и ловушка срабатывает. Теперь выйти нет никакой возможности.

dc39e3560b1114bfe6360f1e0963a168

Создадим кнопку. Для этого импортируем приложенное извображение и разрежем на 2 спрайта.

1d182f7d92175632f1269a8d9ce8b4be

Расположим их в мире в одной точке, зелёный выключим и назовём его «Вкл», Красный назовём «Выкл».

adffa30c7777e91019459e39dbe98c03

Создадим ещё один пустой объект, закинем на него коллайдер, выставим коллайдеру режим триггера и расположим на кнопке. Настроим следующим образом:

b42f61afb5e8d5751d841da1104fa0b4

Этот триггер выключает два других триггера ловушки, выключая всю логику ловушки и оставляя стенку выключенной, выключает красный спрайт и включает зелёный.
Таким образом, кнопка нажимается и ловушка отключается.

3f23e6d1fff1e982657b1f175cd2da8b

Сюда же можно добавить звук нажатия кнопки, закинув его на пустой объект или на сам спрайт зелёной кнопки и оставив галочку Play On Awake.

На этом этапе занятие можно считать завершённым.

Пишите комменты, делитесь полезными ссылками, как можно улучшить проект!

Пожалуйста, поддержите инициативу — нажимайте ↑ нравится и ➦ поделиться!

© Habrahabr.ru