Интеграция в редактор Unity с мониторингом состояния мира.
ВАЖНО! АКТИВНАЯ РАЗРАБОТКА ПРЕКРАЩЕНА, ВОЗМОЖНО ТОЛЬКО ИСПРАВЛЕНИЕ ОБНАРУЖЕННЫХ ОШИБОК. СОСТОЯНИЕ СТАБИЛЬНОЕ, ИЗВЕСТНЫХ ОШИБОК НЕ ОБНАРУЖЕНО. ЗА НОВЫМ ПОКОЛЕНИЕМ ФРЕЙМВОРКА СТОИТ СЛЕДИТЬ В БЛОГЕ https://leopotam.ru/
ВАЖНО! ПОДДЕРЖКА БУДЕТ ПРЕКРАЩЕНА И РЕПОЗИТОРИЙ БУДЕТ ОТПРАВЛЕН В АРХИВ 22.04.2026.
Проверено на Unity 2020.3 (зависит от Unity) и содержит asmdef-описания для компиляции в виде отдельных сборок и уменьшения времени рекомпиляции основного проекта.
ВАЖНО! Зависит от LeoECS Lite - фреймворк должен быть установлен до этого расширения.
Поддерживается установка в виде unity-модуля через git-ссылку в PackageManager или прямое редактирование Packages/manifest.json:
"com.leopotam.ecslite.unityeditor": "https://github.com/Leopotam/ecslite-unityeditor.git",
По умолчанию используется последняя релизная версия. Если требуется версия "в разработке" с актуальными изменениями - следует переключиться на ветку develop:
"com.leopotam.ecslite.unityeditor": "https://github.com/Leopotam/ecslite-unityeditor.git#develop",
Код так же может быть склонирован или получен в виде архива со страницы релизов.
// Инициализация окружения.IEcsSystems_systems;voidStart(){_systems=newEcsSystems(newEcsWorld());_systems.Add(newTestSystem1())
#if UNITY_EDITOR// Регистрируем отладочные системы по контролю за состоянием каждого отдельного мира:// .Add (new Leopotam.EcsLite.UnityEditor.EcsWorldDebugSystem ("events")).Add(newLeopotam.EcsLite.UnityEditor.EcsWorldDebugSystem())// Регистрируем отладочные системы по контролю за текущей группой систем. .Add(newLeopotam.EcsLite.UnityEditor.EcsSystemsDebugSystem())
#endif
.Init();}voidUpdate(){// Отладочные системы являются обычными ECS-системами и для их корректной работы// требуется выполнять их запуск через EcsSystems.Run(), иначе имена сущностей// не будут обновляться, к тому же это приведет к постоянным внутренним аллокациям._systems?.Run();}ВАЖНО! По умолчанию названия компонентов записываются в имя
GameObjectна каждом изменении списка компонентов на сущности. Если такое поведение не нужно (например, для повышения производительности работы в редакторе), то его можно изменить через параметрbakeComponentsInName = falseв конструктореEcsWorldDebugSystem.
Часть кода может быть автоматически сгенерирована через контекстное меню проекта Assets / Create / LeoECS Lite.
Пакет выпускается под MIT-Red лицензией.
В случаях лицензирования по условиям MIT-Red не стоит расчитывать на персональные консультации или какие-либо гарантии.
Нужно перейти в режим PlayMode и развернуть иерархию объектов в системной сцене DontDestroyOnLoad - там должны появиться объекты с именами [ECS-WORLD] для каждого мира.
Вся иерархия сущностей внутри этого объекта является виртуальной, создается только для визуализации наличия компонентов на сущностях и не участвует в реальной работе ядра.
У меня много сущностей и я хочу как-то отфильтровать только те, на которых есть нужные мне компоненты. Как это сделать?
По умолчанию имена типов компонентов добавляются к имени GameObject-а сущности, на которой они существуют - это можно использовать для фильтрации штатными средствами редактора Unity (строка поиска в окне иерархии сцены) для поиска GameObject-ов, подходящих под указанный шаблон.
Я хочу создавать сущности в IEcsPreInitSystem-системе, но отладочные системы бросают исключения в этом случае. Как это исправить?
Проблема в том, что EcsWorldDebugSystem тоже является IEcsPreInitSystem-системой и происходит конфликт из-за порядка систем.
Решение - все отладочные системы следует вынести в отдельный IEcsSystems и вызвать его инициализацию раньше основного кода:
IEcsSystems_systems;
#if UNITY_EDITORIEcsSystems_editorSystems;
#endif
voidAwake(){_systems=newEcsSystems(newEcsWorld());
#if UNITY_EDITOR// Создаем отдельную группу для отладочных систем._editorSystems=newEcsSystems(_systems.GetWorld());_editorSystems.Add(newLeopotam.EcsLite.UnityEditor.EcsWorldDebugSystem()).Init();
#endif
_systems.Add(newSys())
#if UNITY_EDITOR// Подключаем контроль систем в ту группу, которая содержит наш код..Add(newLeopotam.EcsLite.UnityEditor.EcsSystemsDebugSystem())
#endif
.Init();}voidUpdate(){_systems?.Run();
#if UNITY_EDITOR// Выполняем обновление состояния отладочных систем. _editorSystems?.Run();
#endif
}voidOnDestroy(){
#if UNITY_EDITOR// Выполняем очистку отладочных систем.if(_editorSystems!=null){_editorSystems.Destroy();_editorSystems=null;}
#endif
if(_systems!=null){_systems.Destroy();_systems.GetWorld().Destroy();_systems=null;}}Я хочу добавить поддержку редактирования полей моих компонентов, как это сделано для простых типов. Как я могу это сделать?
Это можно сделать через реализацию инспектора для отдельного типа поля, либо компонента целиком:
publicstructC2{publicstringName;}// Файл должен лежать где-то в проекте - будет обнаружен и подключен автоматически.
#if UNITY_EDITORsealedclassC2Inspector:EcsComponentInspectorTyped<C2>{publicoverrideboolOnGuiTyped(stringlabel,refC2value,EcsEntityDebugViewentityView){EditorGUILayout.LabelField($"Super C2 component",EditorStyles.boldLabel);varnewValue=EditorGUILayout.TextField("Name",value.Name);EditorGUILayout.HelpBox($"Hello, {value.Name}",MessageType.Info);// Если значение не поменялось - возвращаем false.if(newValue==value.Name){returnfalse;}// Иначе - обновляем значение и возвращаем true.value.Name=newValue;returntrue;}}
#endif