Базовая интеграция в редактор Unity для Entity Component System
Это возможно с помощью отдельного модуля - UnityEditor integration. Он позволяет визуализировать ECS-сущности и ECS-компоненты на них, делая отображение на стандартные GameObject
и компоненты на них.
Тестовое окружение
Давайте создадим тестовое окружение. Пусть это будет сцена по умолчанию с новым GameObject
-объектом (имя может быть любым, я использовал “_LOGIC”) и следующим MonoBehaviour
-компонентом на нем:
1 | sealed class UnityIntegrationTest : MonoBehaviour { |
Интеграция была выполнена следующими двумя строчками:
1 | UnityIntegration.EcsWorldObserver.Create (_world); |
Обе строчки должны быть обернуты в директиву препроцессора #if UNITY_EDITOR
, иначе проект не сможет быть собран как релизное приложение и сможет работать только в редакторе.
Оставшаяся часть ECS (cкомпоненты и система):
1 | class UnityIntegrationComponent1 { |
В системе TestSystem
была создана одна сущность с компонентами UnityIntegrationComponent1
и UnityIntegrationComponent2
на ней. В Run
-цикле системы можно увидеть как создается новая сущность, к ней добавляется компонент и вся сущность удаляется - это делается для проверки пулинга объектов.
Визуализация
После старта редактора сцена будет выглядеть следующим образом:
Вы можете увидеть новый GameObject
с именем [ECS-WORLD]
, содержащий представления всех созданных (активных объектов) и удаленных (деактивированных объектов) сущностей.
Внутри [ECS-WORLD]
можно найти статистику по количеству сущностей, компонентов, фильтров и т.п:
Если выделить любую ecs-entity
-визуализацию, то можно увидеть список подключенных компонентов и данных внутри их полей:
При выделении [ECS-SYSTEMS]
представления можно увидеть список использованных систем:
Как дополнительная особенность - вы можете временно выключить все IEcsRunSystem
-ы, переключив состояние флага Run systems activated
.
[Обновлено 28.11.2018] Теперь можно отключать каждую
IEcsRunSystem
индивидуально.
Все данные представления - доступны только по чтению by design, они не могут быть изменены из редактора Unity
(связывание данных в одну сторону). Возможно позже будут добавлены опции вида “AddComponent” и “RemoveComponent”, но данные в ECS-компонентах не смогут быть отредактированы в любом случае.
В TestSystem
-системы можно увидеть поле UnityIntegrationComponent2.Time
, обновляемое каждый фрейм, но в инспекторе оно будет выглядеть статичным. Так происходит из-за особенностей работы редактора юнити - инспектор компонента будет перерисован только в случае возникновения одного и событий: клик, драг, изменение размеров виджетов и т.д. Поэтому, если хочется увидеть актуальное значение поля компонента - нужно покликать в инспекторе в любом месте. Такое поведение может быть изменено позже, но я пока не уверен в его целесообразности из-за падения производительности и аллокаций памяти.