Импакт-система
Импакт-система — это мощный инструмент для создания логики без необходимости написания кода. Система разработана для того, чтобы разработчики могли легко создавать сложные взаимодействия между объектами, используя визуальные компоненты в редакторе Unity. В основе системы лежит компонент Reaction, который позволяет комбинировать различные логические блоки для создания гибкой и модульной игровой логики.
Система идеально подходит для создания интерактивных сцен, управления игровыми событиями, анимациями, физическими взаимодействиями и многим другим. Она позволяет быстро прототипировать идеи и реализовывать их без необходимости глубокого погружения в программирование.
Основные компоненты системы
Reaction
Компонент Reaction — это основной узел системы. Он представляет собой контейнер, который объединяет два основных типа логических блоков:
- Источник событий (Event Sources) — отслеживает изменения в сцене и запускает логику. Например, это может быть вход объекта в зону, нажатие клавиши или изменение переменной.
- Действие (Actions) — выполняет конкретные изменения в сцене, такие как запуск анимации, изменение состояния объекта, уничтожение объекта и т.д.
Каждый Reaction может содержать несколько источников событий, условий и действий, что позволяет создавать сложные цепочки логики.
Variables
Для хранения состояния и организации сложной логики в системе используются переменные с целыми числами. Переменные хранятся в специальном объекте Variables Container, который представляет собой Scriptable Object. Это позволяет легко управлять состоянием сцены и передавать данные между различными компонентами.
State Machine
Компонент позволяет реализовать логику перехода из состояния в состояние. Есть возможность определить состояние источника, из которого будет осуществлен переход, состояние-цель — в которое будет осуществлен переход и условия перехода в целевое состояние. Также есть возможность указать начальное состояние, которое система примет в момент инициализации.
Сетевые компоненты
NetworkVariableSource
Компонент является источником изменения сетевой переменной. Во время вызова метода OnEnable происходит подписка под сетевое событие изменения указанной переменной. Во время вызова метода OnDisable происходит отписка от сетевого события указанной переменной. Значения, на которые будут вызываться реакции системы, можно задать в компоненте условия.
NetworkVariableCondition
Сетевые переменные хранят значения. Есть возможность подписаться на изменение этих значений. Этот компонент позволяет определить целевой диапазон значений сетевой переменной и ассоциировать определенный набор действий, которые будут выполнены в момент, когда сетевая переменная приобретет одно из значений целевого диапазона.
NetworkVariableAction
Позволяет производить манипуляции над сетевой переменной. Есть возможность указать тип операции, выбрать использовать округление или нет, пороговые значения. Есть возможность выбрать вариант синхронизации данных. Сделать это можно в компоненте NetworkVariableContainer.
Источники событий (Event Sources)
GlobalEventSource
Реагирует на глобальные события. Это мощный инструмент для связи различных частей игры. Например, можно отправить событие «Игра началась», и все объекты, подписанные на это событие, начнут свою логику.
AreaEntitySource
Этот компонент импакт-системы позволяет подсчитать количество объектов в определенном объеме. Всякий раз, когда количество этих объектов меняется, компонент сигнализирует об этом. Чтобы отличать целевые объекты от случайных, они маркируются тегом, например, Player. В компоненте можно настроить объем, в рамках которого происходит «сканирование» таких объектов, а также частоту, с которой это сканирование выполняется.
Настройка компонента
- В поле Area помещается Box Collider объема.
- В поле Tag прописывается тег объектов, число которых нужно будет синхронизировать.
- В поле Check Period Sec прописывается частота, с которой будет проводиться синхронизация. Например, 0.25 означает 4 раза в секунду.
KeyboardEventSource
Реагирует на нажатия клавиш. Позволяет создавать интерактивные элементы управления, такие как перемещение персонажа или активацию способностей.
ObjectStateChangeSource
Реагирует на изменения состояния объекта, такие как создание, активация, деактивация или уничтожение. Например, можно запустить анимацию при создании объекта.
TimerSource
Запускает событие по истечении заданного времени. Используется для создания таймеров, например, для ограничения времени на выполнение задания.
VariableChangedSource
Реагирует на изменение значения переменной. Это позволяет создавать логику, которая зависит от состояния сцены, например, обновление интерфейса при изменении счета.
CollisionSource
Компонент является источником сообщений о коллизиях объектов сцены. Под коллизией понимается появление в системе события OnCollisionEnter, OnCollisionStay. Под завершением коллизии понимается событие OnCollisionExit. В компоненте имеется возможность задать тип коллизии, а также указать на какие объекты будет распространяться источник — отфильтровать их.
TriggerSource
Компонент является источником триггерных сообщений. По своим возможностям и поведению аналогичен компоненту CollisionSource, за исключением того, что события, возникающие в системе, описываются как OnTriggerEnter, OnTriggerStay и OnTriggerExit.
UIButtonPressSource
Компонент предоставляет способ получения событий нажатия на кнопку Button. В инспекторе есть возможность указать кнопку, нажатие на которую будет запускать указанные в реакции действия.
Условия (Conditions)
TransformUpdateCondition
Компонент позволяет определить ряд условий для работы с Transform. С его помощью можно задать целевое значение по позиции, вращению и масштабу, а также определить параметры округления.
VariableExpressionCondition
Компонент позволяет задать сложное условие, которое задается как вычислимое выражение. При расчете результата выражения используются переменные и логические операции.
CheckGameObjectStateCondition
Проверяет, активен ли объект. Это полезно для создания логики, которая работает только с активными объектами.
CheckVariableCondition
Проверяет условие на основе значения переменной. Например, можно проверить, достиг ли счет игрока определенного значения, чтобы активировать событие.
MachineInStateCondition
Проверяет, находится ли машина состояний игровой логики в одном из заданных компонентом состояний.
PlayOnceCondition
Гарантирует, что действие выполнится только один раз. Это полезно для предотвращения многократного срабатывания критических событий.
Действия (Actions)
PlayAudioAction
Позволяет запускать звук как реакцию на различные события. Звук задается через аудиоклип и источник звука. Имеется возможность запускать звук со следующими опциями:
- последовательный или случайный запуск звука из контейнера по событию;
- зацикливание проигрывания звуков в контейнере;
- fade in/fade out — запуск звука с плавным повышением громкости при старте и плавным затуханием громкости при остановке;
- volume from/volume to — можно задать диапазон для случайных значений громкости при каждом вызове звука по событию;
- pitch from/pitch to — можно задать диапазон для случайных значений тона при каждом вызове звука по событию.
StopAudioAction
Позволяет останавливать звук при различных событиях.
SetTextAction
Отображает значение переменной в текстовом поле. Это полезно для отображения счета или времени.
ChangeComponentStateAction
Позволяет переключить состояние указанного компонента либо в enabled, либо в disabled.
ControlParticleEffectAction
Позволяет управлять поведением системы частиц. Можно либо включить эмиссию частиц, либо отключить ее.
SetIndicatorAction
Отображает индикатор на основе значения переменной. Например, можно отображать количество жизней игрока в виде пирамидки.
DataToContainerAction
Позволяет инициализировать переменную контейнера значением по умолчанию. Имя переменной поступает через поле Data события, вызвавшего данную реакцию.
DataToTextAction
Позволяет вывести значение указанной в событии переменной в текстовое поле. Текстовое поле задается через сериализуемую ссылку в инспекторе объектов.
SendLimitVariableAction
Позволяет осуществить поиск максимальной или минимальной величины в контейнере переменных. Если такая величина найдена, отправляется событие успеха, указанное в компоненте. Если нет — отправляется аналогичное сообщение о неудачном завершении операции.
SetParentAction
Позволяет установить родительский элемент в иерархии для текущего объекта.
ChangeGameObjectStateAction
Включает или выключает объект. Это простое действие, которое позволяет управлять видимостью и активностью объектов.
DestroyAction
Уничтожает объект. Можно задать задержку перед уничтожением, чтобы успеть проиграть анимацию.
PositionByVariableAction
Позволяет поменять позицию для объекта, на основании значения переменной, имя которой задано через параметры компонента. Имеется возможность задать направление сдвига.
SetPositionAction
Изменяет позицию и вращение объекта. Можно также применить физическую силу к объекту.
SwitchRandomObjectAction
Позволяет случайным образом выбрать объект из списка и активировать его.
AddForceAction
Позволяет приложить силу к заданному объекту. Есть возможность указать величину силы и радиуса.
CallUnityEventAction
Отправляет UnityEvent. Это действие позволяет интегрировать логику Impact System с другими системами в Unity.
ChangeVariableAction
Изменяет значение переменной. Это действие можно использовать для увеличения или уменьшения значений, например, для подсчета очков.
DebugMessageAction
Отправляет сообщение в лог для отладки. Это полезно для проверки работы логики во время разработки.
DelayedAction
Позволяет отложить выполнение реакций, заданных в инспекторе, на определенное время.
LoopAction
Позволяет выполнить последовательность реакций, заданных в инспекторе, несколько раз подряд в рамках обработки одного сообщения.
PlayOnceAction
Позволяет выполнить последовательность реакций, заданных в инспекторе, несколько раз подряд в рамках разных событий.
SendGlobalEventAction
Отправляет глобальное событие. Это действие позволяет связывать различные части игры.
ShufflePositionAction
Позволяет переместить указанный в инспекторе объект в случайную позицию внутри заданного объема.
ChangeAnimatorStateAction
Изменяет состояние аниматора. Поддерживает параметры типа bool, int, float и триггеры.
LegacyAnimationPlayAction
Позволяет запустить анимацию, созданную как Animation.
FireAction
Позволяет инстанцировать объект и задать ему ускорение.
SpawnAction
Создает объект на сцене.
SpawnRandomAction
Случайным образом размещает объекты на сцене. Это полезно для создания случайных бонусов или препятствий.
Отладка
При работе с системой бывает не всегда очевидно, почему тот или иной сценарий не отрабатывает как нужно. В целях отладки в систему интегрирован модуль логирования, который позволяет отследить значение переменной в конкретный момент времени, а также оценить, почему то или иное условие не отработало как нужно. Для того, чтобы включить м одуль логирования в работу системы, нужно определить ряд компонентов, подлежащих отладке. Перевести нужный компонент (reaction) в режим отладки можно при помощи поля Debug Flags в инспекторе компонента Reaction. В списке Debug Flags можно выбрать следующие значения:
- Default — работа модуля без отладки;
- Comment — при работе модуля будет выведен комментарий автора;
- ShowAddAction — позволяет рекурсивно выводить список кастомных компонентов;
- Log — позволяет логировать работу компонента.
Импакт-система — это гибкий и мощный инструмент для создания логики без необходимости написания кода. Позволяет быстро прототипировать идеи, создавать сложные взаимодействия и управлять игровыми событиями. Благодаря модульной структуре и возможности расширения, система подходит как для небольших проектов, так и для крупных. Используя компоненты, такие как источники событий, условия и действия, вы можете создавать уникальные механики и эффекты, которые сделают вашу сцену более интерактивной и увлекательной.