Awesome
Интеграция uGui в LeoECS
Интеграция событий uGui в ECS-мир.
Проверено на Unity 2020.3 (зависит от Unity) и содержит asmdef-описания для компиляции в виде отдельных сборок и уменьшения времени рекомпиляции основного проекта.
Содержание
Социальные ресурсы
Установка
В виде 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
, достаточно подключить в это поле виджет, чья активность должна учитываться при генерации событий.