DragonECS/README.md

69 lines
4.8 KiB
Markdown
Raw Normal View History

2023-03-29 00:21:25 +08:00
<p align="center">
2023-03-29 00:43:37 +08:00
<img src="https://user-images.githubusercontent.com/99481254/228309579-729cc600-af83-41e2-8474-96fb96859ae6.png">
2023-03-29 00:21:25 +08:00
</p>
# DragonECS - C# Entity Component System Framework
2023-03-13 05:43:27 +08:00
2023-04-24 17:24:29 +08:00
> **ВАЖНО!** Проект в стадии разработки. API может меняться.
2023-03-13 05:43:27 +08:00
# Основные концепции
## Сущьность
Сущьности реализованы двумя типами:
2023-04-24 17:24:29 +08:00
* `int` - явялется временным идентификатором, применяется в пределах одного тика
* `EcsEntity` - долговременный идентификатор сущьности, хранит в себе полный набор информации для однозначной идентификации
2023-03-13 05:43:27 +08:00
## Компонент
2023-04-24 17:24:29 +08:00
Компоненты - это даные для сущьностей. Могут быть тольно struct и обязаны наследовать один из интерфейсов который определяют тип компонента. самый базовый IEcsComponent.
2023-03-13 05:43:27 +08:00
```c#
2023-04-24 17:24:29 +08:00
struct Health : IEcsComponent
{
2023-03-13 05:43:27 +08:00
public float health;
public int armor;
}
```
## Система
Системы - это основная логика, тут задается поведение сущьностей. Существуют в виде пользовательских классов, реализующих как минимум один из IEcsInitSystem, IEcsDestroySystem, IEcsRunSystem интерфейсов.
```c#
2023-04-24 17:24:29 +08:00
class UserSystem : IEcsPreInitSystem, IEcsInitSystem, IEcsRunSystem, IEcsDestroySystem
{
2023-03-13 05:43:27 +08:00
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()
}
//Для реализации дополнительных сообщений используйте Раннеры
}
```
2023-04-24 17:24:29 +08:00
## Pipeline
Является двжиком систем, определяя поочередность их вызова и предоставляющий механизм для сообщений между системами.
## Раннеры/Сообщения
Раннеры это система сообщений для систем. Может использоваться для создания реактивного поведения или для управления очередью вызовов систем. Сообщения это просто интерфейсы наследуемые от IEcsSystem, чтобы интерфейс работал как сообщение нужно реализоват соотсветующий раннер.
Сообщения реализованные по умолчанию:
`IEcsPreInitSystem`, `IEcsInitSystem`, `IEcsRunSystem`, `IEcsDestroySystem` - сообщения жизненого цикла Pipeline
`IEcsPreInject`, `IEcsInject<T>` - сообщения системы внедрения зависимостей для Pipeline. Через них прокидываются зависимости
`IEcsPreInitInjectCallbacks` - Так же сообщение системы внедрения зависимостей, но работает в пределах до сообщения IEcsInitSystem, сигнализирует о инициализации предварительных внедрений и окончании.
2023-03-13 05:43:27 +08:00
2023-04-24 17:24:29 +08:00
## Реализация Раннеров и сообщений
Новые сообщения реализуются через интефейсы наследованные от IEcsSystem, например, стандартное IEcsRunSystem.Run(EcsSession session) запускается у всех систем при помощи Runner-а. Runner-а можно получить вызыввав EcsSession.GetRunner<TInterface>().
2023-03-13 05:43:27 +08:00
Однако чтобы этто метод вернул нужный Runner, нужно его реализовать, вот пример реаилзации Runner-а для IEcsRunSystem:
```c#
public sealed class EcsRunRunner : EcsRunner<IEcsRunSystem>, IEcsRunSystem
{
void IEcsRunSystem.Run(EcsSession session)
{
foreach (var item in targets) item.Run(session);
}
}
```