Closed VHBoss closed 1 year ago
Hi, ECS is different from OOP so it would be hard to re-implement anything until you know how it actually works. ECS is data-oriented, which means you have to split your data and behavior.
I would create an entity each time my UI change the scale, there should be a component storing localScale. Next, I would make an ExecuteSystem to calculate the correct localScale depends on the component. Last, I would make an Event to notify the button change its scale.
No doubt it's much more complex than BehaviorComponent, in practice I would use both of them, AKA "Hybrid mode". ECS will take care of my game logic while BehaviorComponent handles those trivial things like View, UI, Animation etc.
Привет, ECS отличается от ООП, поэтому было бы сложно повторно реализовать что-либо, пока вы не узнаете, как это работает. ECS ориентирован на данные, что означает, что вам необходимо разделить свои данные и поведение.
Я создавал бы сущность каждый раз, когда мой пользовательский интерфейс меняет масштаб, должен быть компонент, хранящий localScale. Затем я бы сделал ExecuteSystem для вычисления правильного localScale, зависит от компонента. Наконец, я бы сделал событие, чтобы уведомить кнопку об изменении масштаба.
Без сомнения, это намного сложнее, чем BehaviorComponent, на практике я бы использовал их оба, AKA «Гибридный режим». ECS позаботится о моей логике игры, в то время как BehaviorComponent обрабатывает такие тривиальные вещи, как View, UI, Animation и т. Д.
Я говорю по русски)) прочитайте вот эту статью, особенно про эвенты и генерацию систем с помощью EventAttribute. https://github.com/sschmid/Entitas-CSharp/wiki/How-I-build-games-with-Entitas-(FNGGames)
В итоге создаются сущности кнопок (чисто математическая модель, которая может работать без всяких Unity в модульных тестах например или на сервере), на которых есть компонент скейла и происходит вся симуляция на этих сущностях и ECS. Далее делаем для Unity компонент наблюдателя за этим делом (генератор кода сгенерит интерфейс типа IScaleView за счет EventAttribute). Чтобы подписаться - на сущность добавляем на туже сущность сгенерированный компонент со списком наблюдателей, которым нужно высылать изменения по интерфейсу IScaleView и собственно вставляем в список свой скрипт-визуализатор. В итоге визуализация вобще никак не будет зависеть от симуляции, что очень удобно для тестирования, разработки серверов, сериализации всего сущего за один проход итд.
правда EventAttribute доступно только в платной версии Entitas, но то, что он генерирует можете сделать и сами вручную
I don't speak Russian but glad to see Google Translate works well.
I'm using the Asset Store version so didn't notice Event is missing in open source version. You're doing it in the right way. So as you can see ECS could make things complex, but it's up to you once you know how it works, good luck :)
Я не говорю по-русски, но рад видеть, что Google Translate работает хорошо.
Я использую версию хранилища активов, поэтому не заметил, что в версии с открытым исходным кодом отсутствует событие. Вы делаете это правильно. Так как вы можете видеть, что ECS может сделать вещи сложными, но это зависит от вас, как только вы знаете, как это работает, удачи :)
Короче, у тебя есть глобальная сущность(entity_item) у которой есть один из флагов, итем1 или итем2; потом у тебя есть несколько систем, одна реагирует нажатие на кнопки итем1,2 и сбрасывает ползунок и ставит флаг для entity_item& , потом есть система которая контролирует ползунок и размер кнопок. т.е. у тебя есть какой то контейнер который хранит все данные положение ползунка, размеры кнопок и т.д. и меняешь ты эти данные, а дальше система которая отвечает за визуальную часть, приводит размеры кнопок в соотвествии с данными.
Вот еще пример как связать UI и Entitas https://github.com/mzaks/Entitas-ReactiveUI
Hi, please let's keep the communication in english, so we can all participate, help and learn
Hi,
Как реализовать подобное на Entitas или Unity ECS? В голове не укладывается![ui](https://user-images.githubusercontent.com/5990553/45710890-a56f0000-bb90-11e8-8b8f-7197a23be5e4.gif)
OOP code:
public class TestUI : MonoBehaviour {
}
Cheers