Pure C# Entity Component System framework
Go to file
2023-04-24 17:27:44 +08:00
src update queries 2023-04-24 16:48:18 +08:00
.gitattributes Initial commit 2023-02-01 17:05:08 +08:00
.gitignore Update .gitignore 2023-04-03 05:44:56 +08:00
DragonECS.asmdef Update WIP, add table members 2023-02-06 01:27:32 +08:00
DragonECS.asmdef.meta Update WIP 2023-02-05 19:59:45 +08:00
LICENSE Initial commit 2023-02-01 17:05:08 +08:00
README.md Update README.md 2023-04-24 17:27:44 +08:00

DragonECS - C# Entity Component System Framework

ВАЖНО! Проект в стадии разработки. API может меняться. README так же не завершен.

Основные концепции

Сущьность

Сущьности реализованы двумя типами:

  • int - явялется временным идентификатором, применяется в пределах одного тика
  • EcsEntity - долговременный идентификатор сущьности, хранит в себе полный набор информации для однозначной идентификации

Компонент

Компоненты - это даные для сущьностей. Могут быть тольно struct и обязаны наследовать один из интерфейсов который определяют тип компонента. самый базовый IEcsComponent.

struct Health : IEcsComponent
{
    public float health;
    public int armor;
}

Система

Системы - это основная логика, тут задается поведение сущьностей. Существуют в виде пользовательских классов, реализующих как минимум один из IEcsInitSystem, IEcsDestroySystem, IEcsRunSystem интерфейсов.

class UserSystem : IEcsPreInitSystem, IEcsInitSystem, IEcsRunSystem, IEcsDestroySystem 
{
    public void PreInit (EcsSession session) {
        // Будет вызван один раз в момент работы EcsSession.Init() и до срабатывания IEcsInitSystem.Init()
    }
    public void Init (EcsSession session) {
        // Будет вызван один раз в момент работы EcsSession.Init() и после срабатывания IEcsPreInitSystem.PreInit()
    }
    public void Run (EcsSession session) {
        // Будет вызван один раз в момент работы EcsSession.Run().
    }
    public void Destroy (EcsSession session) {
        // Будет вызван один раз в момент работы EcsSession.Destroy() и до срабатывания IEcsPostDestroySystem.PostDestroy()
    }
    
    //Для реализации дополнительных сообщений используйте Раннеры
}

Pipeline

Является двжиком систем, определяя поочередность их вызова, предоставляющий механизм для сообщений между системами и механизм внедрения зависимостей системы.

Раннеры/Сообщения

Раннеры это система сообщений для систем. Может использоваться для создания реактивного поведения или для управления очередью вызовов систем. Сообщения это просто интерфейсы наследуемые от IEcsSystem, чтобы интерфейс работал как сообщение нужно реализоват соотсветующий раннер.

Сообщения реализованные по умолчанию:

  • IEcsPreInitSystem, IEcsInitSystem, IEcsRunSystem, IEcsDestroySystem - сообщения жизненого цикла Pipeline
  • IEcsPreInject, IEcsInject<T> - сообщения системы внедрения зависимостей для Pipeline. Через них прокидываются зависимости
  • IEcsPreInitInjectCallbacks - Так же сообщение системы внедрения зависимостей, но работает в пределах до сообщения IEcsInitSystem, сигнализирует о инициализации предварительных внедрений и окончании.

Реализация Раннеров и сообщений

Новые сообщения реализуются через интефейсы наследованные от IEcsSystem, например, стандартное IEcsRunSystem.Run(EcsSession session) запускается у всех систем при помощи Runner-а. Runner-а можно получить вызыввав EcsSession.GetRunner(). Однако чтобы этто метод вернул нужный Runner, нужно его реализовать, вот пример реаилзации Runner-а для IEcsRunSystem:

public sealed class EcsRunRunner : EcsRunner<IEcsRunSystem>, IEcsRunSystem
{
   void IEcsRunSystem.Run(EcsSession session)
   {
       foreach (var item in targets) item.Run(session);
   }
}