Учебник по визуальному скриптингу (Логические кирпичики)
Создание логики собираемого предмета
Lesson 6 of 10 • 10 XP
Keep your place in this quest
Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.
На этом уроке мы создадим логику, необходимую для сбора предмета с использованием Logic Bricks Cave Engine.
Вы научитесь определять, когда Игрок сталкивается с собираемым предметом, идентифицировать его с помощью тега, удалять его из сцены и обновлять простой счетчик UI, показывающий, сколько предметов было собрано.
Это начало очень распространенной системы игрового взаимодействия: взаимодействие с предметами. Та же идея может быть позже расширена для создания монет, ключей, комплектов патронов, предметов здоровья, объектов квестов, усилителей или любого другого объекта, который Игрок может собрать.
1. Создание логики для сбора предмета
Внутри логики нашего Игрока мы определим столкновения с собираемыми предметами прямо от самого Игрока.
После логики движения мы создадим систему, отвечающую за определение контакта с предметом и его удаление из сцены.
Сначала получите Entity и доступ к его Character Component, используя Get Character.
Из Character Component используйте узел Get Collision With. Этот узел позволяет нам обнаруживать столкновения на основе конкретного Tag.
В этом случае мы используем тег item, который был назначен нашему собираемому предмету на предыдущем уроке.
Вот почему добавление тега к предмету было важно. Вместо того чтобы проверять конкретное имя Entity, мы можем просто спросить Игрока, столкнулся ли он с чем-либо, помеченным как item. Это делает логику более гибкой, потому что любой собираемый объект с тем же тегом может быть обнаружен той же системой.
Результат этого обнаружения должен быть подключен к узлу Get, который возвращает информацию о столкновении, также известную как Collision Info.
Затем мы получаем индекс 0, который представляет первое обнаруженное столкновение.
Наконец, соедините этот результат с узлом Kill, который отвечает за удаление Entity из сцены.
Удаляемая Entity поступает непосредственно из Collision Info. Другими словами, сам собранный предмет передается как вход в Kill, заставляя его исчезнуть из сцены, когда его касается Игрок.

С этой логикой Игрок уже может обнаруживать собираемый предмет и удалять его из сцены.
На практике это означает, что когда Игрок касается Entity, помеченной как item, эта Entity будет собрана и удалена из текущей сцены.
2. Создание UI для собираемых предметов
Теперь нам нужно показать игроку, что предмет фактически был собран.
Для этого мы создадим простой интерфейс UI, который отображает:
- иконку предмета
- количество собранных предметов
- общее количество предметов, доступных на карте
Для начала получите Player Template и добавьте компонент Interface, а именно элемент UI Element. Этот элемент UI будет отвечать за создание визуальной части нашего HUD.
Из этого элемента мы создадим и настроим иконку собираемого предмета. Эта иконка будет служить визуальной основой для отображения информации о сборе на экране игрока.

На вкладке Basic элемента UI Element мы можем настроить позицию и масштаб иконки.
Кликнув по значку анкера свойства позиции, вы можете прикрепить его к нижнему левому углу экрана.
В настройке масштаба зафиксируйте опорную точку в центре и включите блокировки позиции и масштаба. Это делает значения относительными и помогает макету адаптироваться правильно к различным разрешениям экрана.
Наконец, установите значение Layer на 2. Это гарантирует, что иконка будет отрисована над другими UI Elements с более низким приоритетом.

Отрегулируйте значения Scale до тех пор, пока иконка не будет иметь нужный вам размер.
Затем используйте значения Position, чтобы разместить ее с левой стороны экрана или в любой другой области, которую вы предпочитаете в интерфейсе.
Эти настройки позволяют вам точно контролировать как размер, так и позицию элемента в HUD.
На вкладке Behaviour мы можем удалить Default Style, который идет по умолчанию, и добавить собственную Texture для нашей иконки.
Вы также можете настроить цвет Tint и прозрачность Alpha, чтобы добиться желаемого визуального результата.
Опция 9-Slice Scaling используется для предотвращения искажений, когда изображение растягивается в макете. При включении вы можете отрегулировать его значения в зависимости от потребностей иконки, сохраняя изображение последовательным даже при изменении размера. В нашем случае мы не будем использовать 9-Slice, поскольку наше изображение является иконкой.

Теперь давайте создадим 3 новых интерфейсных сущности типа Text.
Они будут отвечать за отображение количества собранных предметов и общего количества доступных предметов на карте.
Сначала переименуйте первый Text в TextCollect. Этот текст будет отображать количество предметов, собранных игроком.
Затем второй Text будет содержать только знак “/”, функционируя как визуальный разделитель между значениями в UI.
Наконец, переименуйте третий Text в TextMax. Этот текст будет представлять максимальное количество предметов, доступных на карте.

Теперь перейдите на вкладку Text для созданных UI Elements.
В этом разделе есть поле, где мы можем определить содержимое, которое будет отображаться на экране.
Для двух текстов, представляющих значения предметов, TextMax и TextCollect, давайте оставим начальное значение равным 0.
Текст, используемый в качестве разделителя, должен содержать только знак “/”, визуально разделяя собранное количество от общего количества предметов.

Теперь давайте позиционируем текст UI так, чтобы он был организован рядом с иконкой.
- Сначала позиционируйте TextCollect.
- Затем поместите текст “/” сразу за ним.
- Наконец, расположите TextMax после косой черты.
Таким образом, UI будет организован как счетчик прогресса, ясно отображая что-то вроде:
собранные предметы / всего предметов
Например:
0 / 10

Примечание: Кроме того, вы также можете создать одну сущность и программно (через Logic Bricks) объединить строки, чтобы достичь того же результата.
3. Создание логики счетчика предметов
Теперь нам нужно, чтобы UI отражал собранные предметы.
На данный момент предмет может быть удален из сцены, но UI все еще не знает, что Игрок собрал что-либо. Поэтому теперь мы реализуем логику счетчика.
Сначала вернитесь к Player Logic Brick и создайте новое свойство, называемое Collected Item, типа Int.
Это свойство будет хранить, сколько предметов Игрок собрал за время игры.

Начальное значение этого свойства должно быть 0.
В логике Игрока, сразу после узла Kill, который удаляет собранный предмет, мы создадим логику, отвечающую за обновление количества предметов.
Сначала получите свойство Collected Item.
Затем добавьте +1 к его текущему значению.
Наконец, установите результат обратно в свойство Collected Item.
Таким образом, каждый раз, когда Игрок собирает предмет, значение Collected Item увеличивается на 1, поддерживая счетчик в актуальном состоянии.

Однако это значение все еще хранится только в свойстве. Теперь нам нужно отобразить его в тексте UI.
Сразу после этого продолжайте логику, связав поток от Set Collected Item к узлу Set Text.
Этот узел будет отвечать за обновление текста, отображаемого в интерфейсе.
Чтобы использовать Set Text, нам нужно предоставить две вещи:
- UI Element Component, текст которого будет обновлен
- новое значение текста
Поскольку тексты были созданы как дочерние элементы Игрока, мы можем получить к ним доступ напрямую через иерархию Entity.
Для этого используйте Entity, затем Get Child, указав имя текстового объекта. Включите опцию Recursive, чтобы убедиться, что поиск также происходит внутри дочерних элементов Игрока.
Затем получите UI Element Component от найденной Entity.
Для значения текста получите свойство Collected Item, преобразуйте его в String и соедините с Set Text.
Таким образом, текст UI будет автоматически обновляться с тем же значением, которое хранится в свойстве Игрока.

Теперь давайте сделаем так, чтобы текст, представляющий общее количество предметов, также работал.
Все еще в Logic Bricks Игрока создайте новое свойство, называемое Max Item, типа Int.
Это свойство будет хранить общее количество собираемых предметов, доступных на карте.

Теперь, чтобы хранить общее количество предметов на карте в этом свойстве, мы используем событие On Start Игрока.
Это значение нужно вычислить только один раз в начале игры, потому что оно представляет количество собираемых предметов, существующих на сцене, когда игра начинается.
Сначала получите Scene игры.
Затем используйте узел, который возвращает все Entities в сцене, отфильтрованные по тегу item. Поскольку этот тег присутствует только в наших собираемых предметах, это вернет список всех собираемых предметов в текущей карте.
С этим списком Entity используйте узел Size.
Узел Size возвращает общее количество элементов в списке как целое число. Это значение представляет собой точно количество предметов, доступных на карте.
Наконец, укажите этот результат в свойство Max Item, удостоверяясь, что игра начинается с правильным общим количеством собираемых предметов, хранящихся в свойстве.

Теперь нам нужно только отправить это значение в текст UI.
Для этого мы будем использовать ту же логику, что и для Собранного предмета.
Получите свойство Максимальный предмет, преобразуйте значение в Строку и соедините его с узлом Установить текст.
Затем получите доступ к UI-элементу, соответствующему тексту максимального предмета, используя иерархию игрока с помощью Получить дочерний элемент, набрав правильное имя и включив Рекурсивный при необходимости.
Наконец, соедините этот компонент UI-элемента с Установить текст.
Таким образом, общее количество предметов будет правильно отображаться в интерфейсе игрока.

На этом этапе система собираемых предметов функциональна.
Игрок может обнаруживать собираемые предметы, используя тег item, удалять их из сцены, увеличивать счетчик собранных предметов и обновлять UI, чтобы показывать как количество собранных предметов, так и общее количество предметов, доступных на карте.