Cистема сценариев для игр/интерактивных визуализаций на Unity. Позволяет создавать сложные сценарии и последовательности действий для прохождения уровня в редакторе Unity без написания дополнительного кода/конфигураций. Реализовано на Unity 2019.4.8f1
Скачать сборку для Windows x64
Интерактивный сценарий можно разбить на последовательность атомарных операций с объектами в сцене. Каждый объект в описанных сценариях может находиться в двух основных состояниях:
- Неактивен (Inactive)
- Активен (Active)
Примеры:
- Лампочка. Inactive - выключена, Active - включена.
- Сменная часть устройства. Inactive - лежит на столе, Active - установлена в устройство.
Операции с объектами производятся кликами мыши, клик переводит объект из неактивного в активное состояние и наоборот, если это позволяется типом объекта.
Типы объектов:
- Одноразовое использование (UseOnce). После активации становится недоступным для взаимодействия. Пример - провод, который необходимо перерезать.
- Одна активация (Trigger). Активируется один раз. Повторное взаимодействие возможно, но не меняет состояние. Пример - кнопка пожарной сигнализации.
- Переключатель (Switch). Сохраняет состояние. Примеры - выключатель, крышка, сменная часть устройства.
Сценарий состоит из этапов, каждый из которых подразумевает выполнение определенных операций с объектами в сцене. Сценарии строго последовательны, и в текущей реализации не допускают ветвления или отмены этапов.
Этап сценария содержит условие перехода на следующий этап. Условие представляет собой требуемое состояние объекта или набора объектов. Также, набор разрешенных для взаимодействия объектов на каждом этапе сценария ограничивается.
Пример сценария:
Открыть защелку на крышке устройства, открыть крышку устройства, нажать красную кнопку, закрыть крышку устройства, закрыть защелку.
- Доступно: Защелка (Switch). Условие: Защелка открыта (Active)
- Доступно: Защелка, крышка (Switch). Условие: Крышка открыта (Active)
- Доступно: Защелка, крышка, десять кнопок разных цветов (Trigger). Условие: Красная кнопка нажата (Active)
- Доступно: Защелка, крышка, десять кнопок разных цветов. Условие: Крышка закрыта (Inactive)
- Доступно: Защелка, крышка. Условие: Защелка закрыта (Inactive)
На каждом этапе взаимодействие с объектом, не входящим в условия перехода, приводит к провалу сценария и сообщению об ошибочном выполнении.
Для перемещения камеры в сцене используется FPS CharacterController из Standard Assets.
Выделение границ объектов при наведении камеры реализовано шейдерами UltimateOutline.
Сценарии действий и списки названий объектов настраиваются как ScriptableObject ассеты.
Все ассеты и ресурсы сценариев хранятся в \Assets\TrainingSystem\TrainingScenarios
Интерактивными объектами являются GameObject в сцене, имеющие компоненты Collider, Animator и InteractiveBehaviour. InteractiveBehaviour связан с InteractiveObjectEntity - данными объекта. В InteractiveObjectEntity задается строковый идентификатор объекта, тип взаимодействия, текущее состояние и доступность для действий. Объект должен иметь слой Interactive.
При произведении действия с InteractiveBehaviour активируются триггеры его Animator - Activate, Deactivate. Рекомендуется создавать AnimationController для новых объектов как AnimationOverrideController. В проекте созданы три базовых Animator для трех типов объектов - AnimatorBase_Trigger, AnimatorBase_Switch, AnimatorBase_UseOnce.
Сценарий создается через CreateAssetMenu. В созданном ScriptableObject можно настраивать этапы выполнения с соответствующими условиями перехода и списками активируемых/деактивируемых при переходе на этап объектов. Используются строковые ключи, соответствующие заданным в InteractiveBehaviour.
Отображаемые при наведении камеры названия объектов задаются в ScriptableObject DisplayedObjectNames.
После подготовки префаба набора интерактивных объектов, сценария и отображаемых названий созданные ассеты объединяются в ScriptableObject ScenarioPreferences.
ScenarioPreferences, добавленные в компонент TrainingPreferencesInitializer в сцене MainMenu, становятся доступными для запуска.