23 days ago

И так, я болею, а оттого у меня сейчас много свободного (нет) времени...

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


Все знают, что в игровом движке нужно каким-то образом хранить данные об игровых объектах.

И за множество лет обуздания геймдева появилось немало архитектур:

  • Многоуровневая. Разделяет задачи, возможность менять одни слои на другие

  • Event-driven. Исходя из названия, - главные в движке - события

  • Parallel Task. Каждая система в своём мире и почти не контактирует с другими

  • Component-based. Делит игру на reusable компоненты

  • ECS. О нём мы и поговорим

Я, в своём движке Factory Engine, решил использовать архитектуру ECS (также Unity использовал такую систему в DOTS). "Но что же это значит?" - спросите вы меня, а я отвечу: ECS расшифровывается как Entity-Component-System.

Исходя из расшифровки вы можете сделать вывод, что эта архитектура держится на 3 столбах, и будете чертовски правы! ECS - это Data-driven подход к созданию движка, а его данные и логика разнесены в разные места.

Почему важно выбрать правильную архитектуру движка? Ну вот смотрите, Unity изнутри:

b2f1ceb391b5a7e05b1ab478c628cdf7.png

Это диаграмма классов движка, представляете, как трудно что-либо добавлять в движок?

А вот многоуровневая система движка Unreal Engine:

03a9084e6272abd72da394a7b96e7987.png

Уже намного лучше.

Но ECS - это Data-driven архитектура. И что это вообще значит? А значит это, что поведение движка определяется данными и не захардкожена в движке.

Первый столб. Entities

Первое, с чем мы сталкиваемся в расшифровке - Entity. Что это значит? Какие сущности? Сущности - это наши игровые объекты, с которыми мы можем взаимодействовать.

Они не имеют ни логики, ни данных сами по себе. Их назначение - хранить в себе указатели на компоненты для того, чтобы системы могли с ними взаимодействовать. Например:

		
			...
class GameObject : Entity {
 Component[] components = {
  Transform2D, Velocity2D
 };
};
...
		
	

Теперь мы плавно переходим ко второму столбу.

Второй столб. Components

Второе - это Components. Из предыдущей главы мы поняли, что Entity хранят указатели на Component, но зачем?

Как я уже сказал: Entity не хранят данные. Данные хранятся внутри компонентов. Например:

		
			...
class Transform2D : Component {
 Vec2 position;
 Vec2 scale;
 float rotation;
};
class Velocity2D : Component {
 Vec2 velocity;
};
...
		
	

Компоненты так же не имеют логики, её реализует следующий и последний столб.

Третий столб. Systems

Последнее, о чём мы поговорим - Systems. Это системы (как ни странно). Они выполняют всю логику над компонентами и сущностями. Именно они отвечают за то, "что" и "как" делать в игре.

Системы могут получить доступ к любой сущности и любому компоненту. Например:

		
			...
class Movement : System {
 void DoStuff() {
   Entity[] entities = Engine.Entities.With<Transform2D>().With<Velocity2D>();
   foreach (entity in entities) {
     entity.transform.position += entity.velocity;
   }
 }
};
...
		
	

Это был простенький пример системы, которая каждый вызов двигает каждый объект на его скорость.

Заключение

Всё, это конец этого поста. Изображения и немного информации я взял из этой статьи на хабре.



0 comments

Loading...

Next up

Yo! We've just reached the line of 200 likes!

Решил попрактиковаться в рисовании лица/волос

Но у меня нет идей, так что: можете покидать идей в комменты?

Тренируюсь рисовать глаза

Happy #WIPWednesday! Are you working on a game? Making some art? Practicing a song? Something else? Tell us in the comments!

I don't plan (joke)

1. Idea

2. Engine

3. Prototype

4. Test

5. Improve

6. Test

7. Test

8. Bugfix

9. Test

10. Release

#Devruary

Happy Devruary! Devruary Day 16 celebrates @balladrion ! He's the developer behind Balladrion, a 3D rogue-lite action RPG set in a magical fantasy world. We also have a question for the devs of Game Jolt: What feature almost broke your game?

My favorite part of gamedev is when all breaks and then you trying to find out reason of this and then fix it.

And after hours and maybe days of trying to fix it, it becomes not a bug, but feature and another game mechanic

#Devruary

Isn't she cute? uwu~

Happy Devruary! Devruary Day 18 celebrates @lazyguygames ! He's the game dev between I Need to ESCAPE and more! We also have a question for the devs of Game Jolt: Which game dev inspires you most?

I am making one myself

#Devruary