Update README.md

This commit is contained in:
Mikhail 2023-05-03 05:15:20 +08:00 committed by GitHub
parent ec4f8325b6
commit 113b896def
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -9,12 +9,12 @@
# Основные концепции # Основные концепции
## Сущьность ## Сущьность
Сущьности реализованы двумя типами: Сущьности - это идентификаторы, к которым крепятся данные. Есть2 вида идентификатора:
* `int` - явялется временным идентификатором, применяется в пределах одного тика * `int` - однократный идентификатор, применяется в пределах одного тика. Не рекомендуется хранить `int` идентификаторы, в место этого используйте `entlong`;
* `EcsEntity` - долговременный идентификатор сущьности, хранит в себе полный набор информации для однозначной идентификации * `entlong` - долговременный идентификатор, содержит в себе полный набор информации для однозначной идентификации;
## Компонент ## Компонент
Компоненты - это даные для сущьностей. Могут быть тольно struct и обязаны наследовать один из интерфейсов который определяют тип компонента. самый базовый IEcsComponent. Компоненты - это даные для сущностей. Могут быть тольно struct и обязаны реализовывать интерфейс IEcsComponent или другой указываюший разновидность кмпонента.
```c# ```c#
struct Health : IEcsComponent struct Health : IEcsComponent
{ {
@ -23,21 +23,21 @@ struct Health : IEcsComponent
} }
``` ```
## Система ## Система
Системы - это основная логика, тут задается поведение сущьностей. Существуют в виде пользовательских классов, реализующих как минимум один из IEcsInitSystem, IEcsDestroySystem, IEcsRunSystem интерфейсов. Системы - это основная логика, тут задается поведение сущьностей. Существуют в виде пользовательских классов, реализующих как минимум один из IEcsInitProcess, IEcsDestroyProcess, IEcsRunProcess интерфейсов.
```c# ```c#
class UserSystem : IEcsPreInitSystem, IEcsInitSystem, IEcsRunSystem, IEcsDestroySystem class UserSystem : IEcsPreInitProcess, IEcsInitProcess, IEcsRunProcess, IEcsDestroyProcess
{ {
public void PreInit (EcsSession session) { public void PreInit (EcsSession session) {
// Будет вызван один раз в момент работы EcsSession.Init() и до срабатывания IEcsInitSystem.Init() // Будет вызван один раз в момент работы EcsSession.Init() и до срабатывания IEcsInitProcess.Init()
} }
public void Init (EcsSession session) { public void Init (EcsSession session) {
// Будет вызван один раз в момент работы EcsSession.Init() и после срабатывания IEcsPreInitSystem.PreInit() // Будет вызван один раз в момент работы EcsSession.Init() и после срабатывания IEcsPreInitProcess.PreInit()
} }
public void Run (EcsSession session) { public void Run (EcsSession session) {
// Будет вызван один раз в момент работы EcsSession.Run(). // Будет вызван один раз в момент работы EcsSession.Run().
} }
public void Destroy (EcsSession session) { public void Destroy (EcsSession session) {
// Будет вызван один раз в момент работы EcsSession.Destroy() и до срабатывания IEcsPostDestroySystem.PostDestroy() // Будет вызван один раз в момент работы EcsSession.Destroy()
} }
//Для реализации дополнительных сообщений используйте Раннеры //Для реализации дополнительных сообщений используйте Раннеры
@ -47,23 +47,29 @@ class UserSystem : IEcsPreInitSystem, IEcsInitSystem, IEcsRunSystem, IEcsDestroy
## Pipeline ## Pipeline
Является двжиком систем, определяя поочередность их вызова, предоставляющий механизм для сообщений между системами и механизм внедрения зависимостей системы. Является двжиком систем, определяя поочередность их вызова, предоставляющий механизм для сообщений между системами и механизм внедрения зависимостей системы.
## Раннеры/Сообщения ## Процесс/Раннер
Раннеры это система сообщений для систем. Может использоваться для создания реактивного поведения или для управления очередью вызовов систем. Сообщения это просто интерфейсы наследуемые от IEcsSystem, чтобы интерфейс работал как сообщение нужно реализоват соотсветующий раннер. Процессы - это очереди систем реализующие общий интерфейс. Раннеры запускюат выполнение процессов. Система раннеров и процессов может использоваться для создания реактивного поведения или для управления очередью вызова систем. Встроенные процессы вызываются автоматически, для ручного запуска испольщуйте раннеры получаемые из EcsPipeline.GetRunner<TInterface>().
> Метод GetRunner относительно медленный, поэтому рекомендуется кешировать полученные раннеры.
Сообщения реализованные по умолчанию: Встроенные процессы:
* `IEcsPreInitSystem`, `IEcsInitSystem`, `IEcsRunSystem`, `IEcsDestroySystem` - сообщения жизненого цикла Pipeline * `IEcsPreInitProcess`, `IEcsInitProcess`, `IEcsRunProcess`, `IEcsDestroyProcess` - процессы жизненого цикла Pipeline
* `IEcsPreInject`, `IEcsInject<T>` - сообщения системы внедрения зависимостей для Pipeline. Через них прокидываются зависимости * `IEcsPreInject`, `IEcsInject<T>` - процессы системы внедрения зависимостей для Pipeline. Через них прокидываются зависимости
* `IEcsPreInitInjectCallbacks` - Так же сообщение системы внедрения зависимостей, но работает в пределах до сообщения IEcsInitSystem, сигнализирует о инициализации предварительных внедрений и окончании. * `IEcsPreInitInjectProcess` - Так же процесс системы внедрения зависимостей, но работает в пределах до выполнения IEcsInitProcess, сигнализирует о инициализации предварительных внедрений и окончании.
## Реализация Раннеров и сообщений ## Реализация Раннеров и Процессов
Новые сообщения реализуются через интефейсы наследованные от IEcsSystem, например, стандартное IEcsRunSystem.Run(EcsSession session) запускается у всех систем при помощи Runner-а. Runner-а можно получить вызыввав EcsSession.GetRunner<TInterface>(). Для добавления нового процесса создайте интерфейс наследованный от IEcsSystem и создайте раннер для него. Раннеры это классы реализующие интерфейс запускаемого процесса и наследуемые от EcsRunner<TInterface>. Пример реализации раннера для IEcsRunProcess:
Однако чтобы этто метод вернул нужный Runner, нужно его реализовать, вот пример реаилзации Runner-а для IEcsRunSystem:
```c# ```c#
public sealed class EcsRunRunner : EcsRunner<IEcsRunSystem>, IEcsRunSystem public sealed class EcsRunRunner : EcsRunner<IEcsRunProcess>, IEcsRunProcess
{ {
void IEcsRunSystem.Run(EcsSession session) public void Run(EcsSession session)
{ {
foreach (var item in targets) item.Run(session); foreach (var item in targets) item.Run(session);
} }
} }
``` ```
> Раннеры имеют ряд требований к реализации:
> * Для одного интерфейса может быть только одна реализация раннера;
> * Наследоваться от `EcsRunner<TInterface>` можно только напрямую;
> * Раннер может содержать только один интерфейс(за исключением `IEcsSystem`);
> * Наследуемый класс `EcsRunner<TInterface>,` в качестве `TInterface` должен принимать реализованный интерфейс;
> * Раннер не может быть размещен внутри другого класса.