Не так давно наткнулся на такой подход программирования в играх как ECS (Entity Component System). Далее начал читать статьи и смотреть различные ролики по этой теме. Из названия понятно что это разделение на сущности, компоненты и системы. Но почему он становится более предпочтительным в разработке игр нежели всем…
Тема
23 138
30
Угадай в каком решении быстрее сделать обходы и умножения векторов много раз в секунду
А насколько у нас тесные связи? Вот допустим у нас есть система аур. Одна аура распространяет пониженную гравитацию в сфере. Другая распространяет вектор гравитации к своему центру. Третья убирает коллизии на своём радиусе. Как нам поможет ECS?
Ну или вообще по классике. Есть у нас дерево. Как удалить родителя не оставив висячих ссылок в пустоте? В ООП это разрулится деструкторами. А в ECS?
16
nazarpunk, позиция и хп это компоненты, данные которые ты добавляешь в сущности, а сущность это просто ссылка (id) на какой-то набор этих компонентов. Тут отношение один ко многим.
16
nazarpunk, входит, это системы. Например как в Unity есть метод update, в котором пишут какую-то логику. Получается что ты в таком методе проходишься по массиву нужных тебе компонентов, которые есть у сущностей, и от этого пишешь логику.
30
bifurcated, а каким образом связаны собственно позиции и хп. Это же по сути разные сущности. Ну или более банальный пример. У нас физический движок и нужен маятник Ньютона? Как передать импульс ровно последнему шарику?
Загруженные файлы
16
nazarpunk, скорее у юнита будет компонент, отвечающий за его хит бокс и у тебя будет система, которая проходится по сущностям у которых есть какой-то архетип компонентов, как скорость, позиция, хп, хит бокс. И при условии что у каких-то двух объектах расстояние близкое, то наносим урон в зависимости от скорости отнимая от текущего хп
30
ScorpioT1000, а как слинковать сущности между собой? Например нанести юниту урон от столкновения?
38
nazarpunk, не, там фича в другом.
Скорее
Решение А
agentSKucheyGovna[i]
Решение Б
agents[i]
worldState[i]
kuchaGovnaSpellov[i]
...
Угадай в каком решении быстрее сделать обходы и умножения векторов много раз в секунду
30
Например, игрок является сущностью, а его скорость, позиция и жизни компонентами, движение игрока будет системой, которая итерируется по компонентам скорости и позиции. Данный подход делает наш код практичным и переиспользуемым.
Ужасное ООП
class Unit {
	vec3 position;
	vec3 speed;

	void move(){
		//...
	}
}
Прекрасный ECS
struct Position {
	vec3 position;
}

struct Speed {
	vec3 position;
}

class Unit {
}

struct UnitHolder {
	Unit unit;
	Position position;
	Speed speed;
}


void moveUnit(UnitHolder unit){
		//...
}
30
Данный подход делает наш код практичным и переиспользуемым.
А методы для работы с этими сущностями в код не входят?
30
Но почему он становится более предпочтительным в разработке игр нежели всем известный ООП с его подходами?
И почему же?