Учебник по визуальному скриптингу (Логические кирпичики)
Открытие двери после сбора всех предметов
Lesson 7 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.
На этом уроке мы будем использовать логику собираемых предметов, созданную ранее, чтобы вызвать действие в игре.
В качестве примера мы сделаем так, чтобы дверь, блокирующая путь игрока, была удалена из сцены только после того, как все предметы на карте будут собраны.
Это очень распространённая игровая структура: игрок выполняет задание, и игра реагирует, открывая что-то. Это может быть дверь, платформа, лифт, мост, заставка, бой с боссом или любое другое событие прогрессии.
В этом уроке вы научитесь получать доступ к одной Entity из логики другой Entity. В данном случае Игрок будет проверять прогресс сбора и затем удалит Дверь из сцены.
1. Создание логики для удаления двери
Давайте начнем с создания нового Entity Template для нашей двери.
Настройте Mesh, который будет использоваться в качестве её визуального представления, и добавьте компонент physics, чтобы дверь могла блокировать прохождение игрока.
Поскольку дверь должна помешать персонажу пройти сквозь неё, не включайте опцию Ghost в компоненте physics.
Физическое тело Ghost может регистрировать столкновения, но не блокирует физически движение. Для собираемого предмета это было именно то, что нам нужно. Но для двери нам нужно обратное: игрок не должен иметь возможности пройти, пока условие не будет выполнено.
Нажимая клавишу 3, вы можете визуализировать предварительный просмотр столкновения Entity. Это полезно, чтобы подтвердить, соответствует ли физическая форма двери правильно.
Cave предоставляет вам различные способы настройки физической формы. Вы можете использовать собственную меш-сетку объекта в качестве коллизии, импортировать другую оптимизированную модель, созданную только для физики, или даже использовать любую другую Mesh из проекта в качестве формы коллизии.
Выберите вариант, который наилучшим образом соответствует потребностям и производительности вашей игры.

Система, которую мы создали ранее, уже предоставляет нам точно ту информацию, которую необходимо контролировать, когда дверь должна быть удалена.
Она автоматически вычисляет общее количество собираемых предметов, присутствующих на сцене, независимо от того, сколько предметов существует на карте, и также отслеживает, сколько из них уже собрано Игроком.
Это делает логику очень гибкой. Нам не нужно вручную изменять число каждый раз, когда мы добавляем или удаляем предметы из уровня. Счётчик продолжает работать правильно, автоматически адаптируясь к количеству доступных собираемых предметов на сцене.

Имея эти два куска информации — собранные предметы и общее количество предметов — мы можем просто сравнить оба значения.
Когда количество собранных предметов равно общему количеству предметов на карте, это означает, что игрок нашёл все собираемые предметы и выполнил задание, необходимое для открытия пути.
Исходя из этого условия, мы выполнит логику, ответственную за удаление двери из сцены, позволяя игроку пройти дальше в следующую область игры.
После обновления TextCollect мы проверим, были ли все предметы на карте уже собраны.
Для этого получите свойства Collected Item и Max Item и используйте узел сравнения, чтобы проверить, равны ли оба значения.
Если условие истинно, это означает, что игрок собрал все доступные предметы на сцене и выполнил необходимое требование для разблокировки прогрессии.

На основе этой проверки мы можем выполнить логику, ответственную за удаление двери и позволение доступа к следующей области.
Для этого мы получим доступ к Entity из логики Игрока.
Сначала получите Scene и используйте узел Get Entities With Name, передав имя Entity двери. В данном случае имя — Door.
Этот узел возвращает список Entity, найденных с этим именем.
Затем используйте узел Get, чтобы получить элемент по индексу 0, который соответствует первой найденной Entity с этим именем.
Наконец, соедините эту Entity с узлом Kill.
Когда эта логика будет выполнена, дверь будет удалена из сцены.

Важно понять, что здесь происходит.
Игрок не напрямую связан с Дверью как дочерняя или родительская Entity. Вместо этого Игрок получает текущую Сцену, ищет Entity с именем Door, извлекает её из результирующего списка и затем удаляет её.
Это означает, что вы можете создавать логику, где один объект влияет на другой объект на сцене, что крайне важно для создания игровых взаимодействий.
Одно, что нужно помнить, это то, что Get Entities With Name возвращает список, потому что может быть более одной Entity с одинаковым именем. В этом примере мы получаем индекс 0, что означает, что мы используем первый найденный результат. Для этого простого случая всё в порядке. Но в более крупных проектах хорошо бы организовывать важные имена Entity или использовать теги и другие ссылки в зависимости от ситуации.
Эту логику можно расширить многими способами.
В этом примере мы использовали сбор всех предметов, чтобы удалить дверь, но тот же принцип можно применить к почти любому событию внутри вашей игры.
Вместо удаления двери вы могли бы:
- переместить платформу
- активировать лифт
- воспроизвести заставку
- включить рычаг
- начать бой с боссом
- разблокировать новую область
- появить врагов
- изменить цель уровня
Самое главное — понять, что теперь у вас есть инструменты, необходимые для создания задач и наград с помощью визуальной логики Cave.
Из-за этого отличным упражнением будет попытаться адаптировать эту систему в нечто отличное от примера, показанного в этом уроке. Вы можете создать собственное условие, свою собственную награду и исследовать новые возможности, используя всё, что вы узнали до сих пор.
