Home

Awesome

Интеграция в редактор Unity для LeoECS Lite

Интеграция в редактор Unity с мониторингом состояния мира
( не подразумевает конвертацию / создание через инспектор )

Проверено на Unity 2021.3 LTS (зависит от Unity)

Содержание

Установка

ВАЖНО! Зависит от LeoECS Lite

В виде Unity модуля

Через Package manager:
https://github.com/Mitfart/LeoECSLite.UnityIntegration.git
или через добавление в @/Packages/manifest.json:
"com.mitfart.leoecslite.unity-integration": "https://github.com/Mitfart/LeoECSLite.UnityIntegration.git",

В виде исходников

Код также может быть склонирован или получен в виде архива

Интеграция

Подключение системы

// ecs-startup code:
IEcsSystems _systems;

void Start() {        
    _systems = new EcsSystems (new EcsWorld());
    _systems
        .Add (new TestSystem1())
#if UNITY_EDITOR
        // Регистрируем отладочные системы по контролю за состоянием каждого отдельного мира:
        // .Add (new Mitfart.LeoECSLite.UnityIntegration.EcsWorldDebugSystem("events"))
        .Add(new Mitfart.LeoECSLite.UnityIntegration.EcsWorldDebugSystem())
        // Для коректного отображения данных, системы необходимо подключать в конце
#endif
        .Init();
}

void Update() {
    // Отладочные системы являюся обычными ECS-системами и для их корректной работы
    // требуется выполнять их запуск через EcsSystems.Run()
    _systems?.Run();
}

ВАЖНО! По умолчанию названия компонентов НЕ записываются в имя (как в системе от Leopotam) Если такое поведение нужно, то его можно добавить создав пресет настроек для системы

var nameSettings = new EntityNameSettings(bakeComponents: true);
...
.Add(new Mitfart.LeoECSLite.UnityIntegration.EcsWorldDebugSystem(null, nameSettings))
...

Объявление компонента

[Serializable] // <-- Для отображения данных компонент долже быть сериализован
public struct Comp {
    public string value;
}

Просмотр

Для просмотра можно использовать два способа:

Открыть которое можно в верхнем меню
LeoEcs Lite -> Debug Window

plot plot

Entity

plot

Кнопка "Add" - добавить компонет

plot

Кнопка "Del" - удалить компонет

plot

Кнопка "Kill" - удалить / убить энтити

plot

В спец. окне

plot

Фильтрация

plot

Возможности

Планируется

Обратная связь

Discord Группа по LeoEcsLite

Telegram Группа по Ecs

@Mitfart

Good practices

Вопросы-ответы

При переименовании / изменении неймспейса типа, компонент "ломается"

Решение: Добавьте атрибут MovedFrom
после "починки", атрибут можно убрать

[MovedFrom(
   autoUpdateAPI: false, 
   sourceNamespace: "OldNamespace", // null, if you don't change it
   sourceAssembly: "OldAssembly",   // null, if you don't change it
   sourceClassName: "OldName"       // null, if you don't change it
)]
public struct Comp { ... }

Я хочу создавать сущности в IEcsPreInitSystem, ноотладочные системы бросают исключения в этом случае. Как это исправить??

Причина:EcsWorldDebugSystem тоже является IEcsPreInitSystem и происходит конфликт из-за порядка систем.
Решение 1: - вместо IEcsPreInitSystem использовать IEcsInitSystem
Решение 2: - все отладочные системы следует вынести в отдельный IEcsSystems и вызвать его инициализацию раньше основного кода:

IEcsSystems _systems;
#if UNITY_EDITOR
IEcsSystems _editorSystems;
#endif


void Awake() {
    _systems = new EcsSystems (new EcsWorld());
    
#if UNITY_EDITOR
    // Создаем отдельную группу для отладочных систем.
    _editorSystems = new EcsSystems (_systems.GetWorld());
    _editorSystems
      .Add(new LeoECSLite.UnityIntegration.EcsWorldDebugSystem(null, nameSettings))
      .Init ();
#endif

  _systems
    .Add (new Sys())
    .Init();
  }
}


void Update() {
    _systems?.Run();
    
#if UNITY_EDITOR
    // Выполняем обновление состояния отладочных систем. 
    _editorSystems?.Run ();
#endif
}
    
    
void OnDestroy () {
#if UNITY_EDITOR
  // Выполняем очистку отладочных систем.
  if (_editorSystems != null) {
      _editorSystems.Destroy ();
      _editorSystems = null;
  }
#endif
  if (_systems != null) {
      _systems.Destroy();
      _systems.GetWorld().Destroy();
      _systems = null;
  }
}

Я хочу добавить свою логику для компонента в окне инспектора. Как я могу это сделать?

Написав свой Editor / PropertyDrawer для компонента:

В стандартном эдиторе: @/Editor/Component/ComponentEditor.cs
используется UIToolkit
использование стандартного GUILayout, возможно, но не рекомендуется

#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.UIElements;
using UnityEngine.UIElements;
using Mitfart.LeoECSLite.UnityIntegration;

[CustomEditor(typeof(ComponentData<Comp>))] 
public class ComponentDataEditor : Editor {
  public override VisualElement CreateInspectorGUI() {
    // Создание главного/родительского элемента
    var container = new VisualElement();
    // ...
    return container;
  }
}
#endif