Базовая интеграция в редактор 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, обновляемое каждый фрейм, но в инспекторе оно будет выглядеть статичным. Так происходит из-за особенностей работы редактора юнити - инспектор компонента будет перерисован только в случае возникновения одного и событий: клик, драг, изменение размеров виджетов и т.д. Поэтому, если хочется увидеть актуальное значение поля компонента - нужно покликать в инспекторе в любом месте. Такое поведение может быть изменено позже, но я пока не уверен в его целесообразности из-за падения производительности и аллокаций памяти.