Skip to content

andreichernov/ecs-ui

 
 

Repository files navigation

Интеграция uGui в LeoECS

Интеграция событий uGui в ECS-мир.

Проверено на Unity 2020.3 (зависит от Unity) и содержит asmdef-описания для компиляции в виде отдельных сборок и уменьшения времени рекомпиляции основного проекта.

Содержание

Социальные ресурсы

discord

Установка

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

Поддерживается установка в виде unity-модуля через git-ссылку в PackageManager или прямое редактирование Packages/manifest.json:

"com.leopotam.ecs": "https://github.com/Leopotam/ecs-ui.git",

По умолчанию используется последняя релизная версия. Если требуется версия "в разработке" с актуальными изменениями - следует переключиться на ветку develop:

"com.leopotam.ecs": "https://github.com/Leopotam/ecs-ui.git#develop",

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

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

Основные типы

EcsUiEmitter

EcsUiEmitter является MonoBehaviour-классом, отвечающим за генерацию ECS-событий на основе uGui-событий (нажатие, отпускание, перетаскивание и т.п):

public class Startup : MonoBehaviour {
    // Поле должно быть проинициализировано в инспекторе средствами редактора Unity.
    [SerializeField] EcsUiEmitter _uiEmitter;

    EcsSystems _systems;

    void Start () {
        var world = new EcsWorld ();
        _systems = new EcsSystems (world)
            // Дополнительная инициализация...
            .Add (new TestSystem ())
            .InjectUi (_uiEmitter);
        _systems.Init ();
    }
}

public class TestSystem : IEcsInitSystem {
    // Поля с автоматической инъекцией.
    EcsUiEmitter _ui;
    [EcsUiNamed("MyButton")] GameObject _btnGo;
    [EcsUiNamed("MyButton")] Transform _btnTransform;
    [EcsUiNamed("MyButton")] Button _btn;

    public void Init () {
        // Все поля системы к этому моменту проинициализированы и могут быть использованы:
        // _ui - содержит ссылку на EcsUiEmitter.
        // _btnGo - содержит ссылку, аналог вызова _ui.GetNamedObject ("MyButton");
        // _btnTransform = содержит ссылку, аналог вызова _ui.GetNamedObject ("MyButton").GetComponent<Transform> ();
        // _btn = содержит ссылку, аналог вызова _ui.GetNamedObject ("MyButton").GetComponent<Button> ();
    }
}

ВАЖНО! EcsUiEmitter должен быть добавлен к корневому GameObject, содержащему виджеты uGui. ВАЖНО! Не нужно принудительно выполнять инъекцию для EcsUiEmitter - вызов метода EcsSystems.Inject() делает это автоматически.

Действия

Действия (классы xxxAction) - это MonoBehaviour-компоненты, которые слушают события uGui виджетов, ищут EcsUiEmitter по иерархии вверх и вызывают генерацию соответствующих событий для ECS-мира.

Компоненты

ECS-компоненты, описывающие события: EcsUiClickEvent, EcsUiBeginDragEvent, EcsUiEndDragEvent и т.д. - все они являются стандартными ECS-компонентами и могут быть отфильтрованы с помощью EcsFilter:

public class TestUiClickEventSystem : IEcsRunSystem {
    EcsWorld _world;
    EcsFilter<EcsUiClickEvent> _clickEvents;

    public void Run () {
        foreach (var idx in _clickEvents) {
            ref EcsUiClickEvent data = ref _clickEvents.Get1 (idx);
            Debug.Log ("Im clicked!", data.Sender);
        }
    }
}

Лицензия

Фреймворк выпускается под двумя лицензиями, подробности тут.

В случаях лицензирования по условиям MIT-Red не стоит расчитывать на персональные консультации или какие-либо гарантии.

ЧаВо

Действие срабатывает на штатных виджетах uGui даже если у них отключен флаг интерактивности. Как это исправить?

У каждого действия в инспекторе есть отдельное поле Selectable, достаточно подключить в это поле виджет, чья активность должна учитываться при генерации событий.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C# 100.0%