sschmid / Entitas

Entitas is a super fast Entity Component System (ECS) Framework specifically made for C# and Unity
MIT License
7.08k stars 1.11k forks source link

UGUI & Entitas/Unity ECS #793

Closed VHBoss closed 1 year ago

VHBoss commented 5 years ago

Hi,

Как реализовать подобное на Entitas или Unity ECS? В голове не укладывается ui

OOP code:

public class TestUI : MonoBehaviour {

public Text sliderText;
public Transform item1;
public Transform item2;
public Slider slider;

private Transform current;

void Start() {
    current = item1;
}

public void ButtonItem1 () {
    current = item1;
    slider.value = item1.localScale.x;
    UpdateText();
}

public void ButtonItem2() {
    current = item2;
    slider.value = item2.localScale.x;
    UpdateText();
}

public void OnChange(float value) {
    current.localScale = Vector3.one * value;
    UpdateText();
}

void UpdateText() {
    sliderText.text = slider.value.ToString("0.0");
}

}

Cheers

zhuchun commented 5 years 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.

Translated by Google, I don't speak Russian ;)

Привет, ECS отличается от ООП, поэтому было бы сложно повторно реализовать что-либо, пока вы не узнаете, как это работает. ECS ориентирован на данные, что означает, что вам необходимо разделить свои данные и поведение.

Я создавал бы сущность каждый раз, когда мой пользовательский интерфейс меняет масштаб, должен быть компонент, хранящий localScale. Затем я бы сделал ExecuteSystem для вычисления правильного localScale, зависит от компонента. Наконец, я бы сделал событие, чтобы уведомить кнопку об изменении масштаба.

Без сомнения, это намного сложнее, чем BehaviorComponent, на практике я бы использовал их оба, AKA «Гибридный режим». ECS позаботится о моей логике игры, в то время как BehaviorComponent обрабатывает такие тривиальные вещи, как View, UI, Animation и т. Д.

kkohno commented 5 years ago

Я говорю по русски)) прочитайте вот эту статью, особенно про эвенты и генерацию систем с помощью EventAttribute. https://github.com/sschmid/Entitas-CSharp/wiki/How-I-build-games-with-Entitas-(FNGGames)

В итоге создаются сущности кнопок (чисто математическая модель, которая может работать без всяких Unity в модульных тестах например или на сервере), на которых есть компонент скейла и происходит вся симуляция на этих сущностях и ECS. Далее делаем для Unity компонент наблюдателя за этим делом (генератор кода сгенерит интерфейс типа IScaleView за счет EventAttribute). Чтобы подписаться - на сущность добавляем на туже сущность сгенерированный компонент со списком наблюдателей, которым нужно высылать изменения по интерфейсу IScaleView и собственно вставляем в список свой скрипт-визуализатор. В итоге визуализация вобще никак не будет зависеть от симуляции, что очень удобно для тестирования, разработки серверов, сериализации всего сущего за один проход итд.

kkohno commented 5 years ago

правда EventAttribute доступно только в платной версии Entitas, но то, что он генерирует можете сделать и сами вручную

zhuchun commented 5 years ago

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 может сделать вещи сложными, но это зависит от вас, как только вы знаете, как это работает, удачи :)

surferau commented 5 years ago

Короче, у тебя есть глобальная сущность(entity_item) у которой есть один из флагов, итем1 или итем2; потом у тебя есть несколько систем, одна реагирует нажатие на кнопки итем1,2 и сбрасывает ползунок и ставит флаг для entity_item& , потом есть система которая контролирует ползунок и размер кнопок. т.е. у тебя есть какой то контейнер который хранит все данные положение ползунка, размеры кнопок и т.д. и меняешь ты эти данные, а дальше система которая отвечает за визуальную часть, приводит размеры кнопок в соотвествии с данными.

webmonch commented 5 years ago

Вот еще пример как связать UI и Entitas https://github.com/mzaks/Entitas-ReactiveUI

sschmid commented 5 years ago

Hi, please let's keep the communication in english, so we can all participate, help and learn