correct spelling

This commit is contained in:
Mikhail 2024-06-16 15:17:33 +08:00
parent 31e315dfb6
commit 5e61ee1154

View File

@ -13,11 +13,11 @@
| Languages: | [Русский](https://github.com/DCFApixels/DragonECS/blob/main/README-RU.md) | [English(WIP)](https://github.com/DCFApixels/DragonECS) | | Languages: | [Русский](https://github.com/DCFApixels/DragonECS/blob/main/README-RU.md) | [English(WIP)](https://github.com/DCFApixels/DragonECS) |
| :--- | :--- | :--- | | :--- | :--- | :--- |
DragonECS - это [ECS](https://en.wikipedia.org/wiki/Entity_component_system) фреймворк нацеленный на максимальную удобность, модульность, расширяемость и производительность динамического изменения сущностей. Разработан на чистом C#, без зависимостей и генерации кода. Вднохновлен [LeoEcs](https://github.com/Leopotam/ecslite). DragonECS - это [ECS](https://en.wikipedia.org/wiki/Entity_component_system) фреймворк нацеленный на максимальную удобность, модульность, расширяемость и производительность динамического изменения сущностей. Разработан на чистом C#, без зависимостей и генерации кода. Вдохновлен [LeoEcs](https://github.com/Leopotam/ecslite).
> [!WARNING] > [!WARNING]
> Проект предрелизной версии, поэтому API может меняться. В ветке main акутальная и рабочая версия. </br> > Проект предрелизной версии, поэтому API может меняться. В ветке main актуальная и рабочая версия.</br>
> Readme еще не завершен, если есть не ястные моменты, вопросы можно задать тут [Обратная связь](#обратная-связь) > Readme еще не завершен, если есть не ясные моменты, вопросы можно задать тут [Обратная связь](#обратная-связь)
## Оглавление ## Оглавление
- [Установка](#установка) - [Установка](#установка)
@ -63,7 +63,7 @@ DragonECS - это [ECS](https://en.wikipedia.org/wiki/Entity_component_system)
+ Поддержка NativeAOT + Поддержка NativeAOT
+ Игровые движки с C#: Unity, Godot, MonoGame и т.д. + Игровые движки с C#: Unity, Godot, MonoGame и т.д.
Протестированно: Протестировано:
+ **Unity:** Минимальная версия 2020.1.0; + **Unity:** Минимальная версия 2020.1.0;
## Установка для Unity ## Установка для Unity
@ -73,7 +73,7 @@ DragonECS - это [ECS](https://en.wikipedia.org/wiki/Entity_component_system)
``` ```
https://github.com/DCFApixels/DragonECS.git https://github.com/DCFApixels/DragonECS.git
``` ```
* ### В виде иходников * ### В виде исходников
Фреймворк так же может быть добавлен в проект в виде исходников. Фреймворк так же может быть добавлен в проект в виде исходников.
</br> </br>
@ -121,7 +121,7 @@ if (entity.TryGetID(out int entityID)) { }
> **NOTICE:** Сущности не могут существовать без компонентов, пустые сущности будут автоматически удаляться сразу после удаления последнего компонента либо в конце тика. > **NOTICE:** Сущности не могут существовать без компонентов, пустые сущности будут автоматически удаляться сразу после удаления последнего компонента либо в конце тика.
## Component ## Component
**Компоненты** - это данные для сущностей. Обязаны реализовывать интерфейс `IEcsComponent` или другой указываюший вид компонента. **Компоненты** - это данные для сущностей. Обязаны реализовывать интерфейс `IEcsComponent` или другой указывающий вид компонента.
```c# ```c#
struct Health : IEcsComponent struct Health : IEcsComponent
{ {
@ -158,7 +158,7 @@ class SomeSystem : IEcsPreInit, IEcsInit, IEcsRun, IEcsDestroy
# Концепции фреймворка # Концепции фреймворка
## Пайплайн ## Пайплайн
Контейнер и движок систем. Отвечает за настройку поочередности вызова систем, предоставляет механизм для сообщений между системами и механизм внедрения зависимостей. Реализован в виде класса `EcsPipeline`. Контейнер и движок систем. Отвечает за настройку очереди вызова систем, предоставляет механизм для сообщений между системами и механизм внедрения зависимостей. Реализован в виде класса `EcsPipeline`.
### Построение ### Построение
За построение пайплайна отвечает Builder. В Builder добавляются системы, а в конце строится пайплайн. Пример: За построение пайплайна отвечает Builder. В Builder добавляются системы, а в конце строится пайплайн. Пример:
```c# ```c#
@ -217,6 +217,7 @@ class SomeSystem : IEcsInject<SomeDataA>, IEcsRun
} }
} }
``` ```
### Модули ### Модули
Группы систем реализующие общую фичу можно объединять в модули, и просто добавлять модули в Pipeline. Группы систем реализующие общую фичу можно объединять в модули, и просто добавлять модули в Pipeline.
``` c# ``` c#
@ -238,6 +239,7 @@ EcsPipelone pipeline = EcsPipeline.New()
//... //...
.BuildAndInit(); .BuildAndInit();
``` ```
### Слои ### Слои
Очередь систем можно разбить на слои. Слой определяет место в очереди для вставки систем. Если необходимо чтобы какая-то система была вставлена в конце очереди, вне зависимости от места добавления, эту систему можно добавить в слой EcsConsts.END_LAYER. Очередь систем можно разбить на слои. Слой определяет место в очереди для вставки систем. Если необходимо чтобы какая-то система была вставлена в конце очереди, вне зависимости от места добавления, эту систему можно добавить в слой EcsConsts.END_LAYER.
``` c# ``` c#
@ -252,17 +254,17 @@ EcsPipelone pipeline = EcsPipeline.New()
Встроенные слои расположены в следующем порядке: Встроенные слои расположены в следующем порядке:
* `EcsConst.PRE_BEGIN_LAYER` * `EcsConst.PRE_BEGIN_LAYER`
* `EcsConst.BEGIN_LAYER` * `EcsConst.BEGIN_LAYER`
* `EcsConst.BASIC_LAYER` (Если при добавблении системы не указать слой, то она будет доавблена сюда) * `EcsConst.BASIC_LAYER` (Если при добавлении системы не указать слой, то она будет добавлена сюда)
* `EcsConst.END_LAYER` * `EcsConst.END_LAYER`
* `EcsConst.POST_END_LAYER` * `EcsConst.POST_END_LAYER`
## Процессы ## Процессы
Процессы - это очереди систем реализующие общий интерфейс, например `IEcsRun`. Для запуска процессов используются Runner-ы. Втроенные процессы запускаются автоматически. Есть возможность реализации пользовательских процессов. Процессы - это очереди систем реализующие общий интерфейс, например `IEcsRun`. Для запуска процессов используются Runner-ы. Встроенные процессы запускаются автоматически. Есть возможность реализации пользовательских процессов.
<details> <details>
<summary>Встроенные процессы</summary> <summary>Встроенные процессы</summary>
* `IEcsPreInit`, `IEcsInit`, `IEcsRun`, `IEcsDestroy` - процессы жизненого цикла `EcsPipeline`. * `IEcsPreInit`, `IEcsInit`, `IEcsRun`, `IEcsDestroy` - процессы жизненного цикла `EcsPipeline`.
* `IEcsInject<T>` - Процессы системы [внедрения зависимостей](#Внедрение-зависимостей). * `IEcsInject<T>` - Процессы системы [внедрения зависимостей](#Внедрение-зависимостей).
* `IOnInitInjectionComplete` - Так же процесс системы [внедрения зависимостей](#Внедрение-зависимостей), но сигнализирует о завершении инициализирующей инъекции. * `IOnInitInjectionComplete` - Так же процесс системы [внедрения зависимостей](#Внедрение-зависимостей), но сигнализирует о завершении инициализирующей инъекции.
@ -298,13 +300,13 @@ _pipeline = EcsPipeline.New()
//Запуск раннера если раннер был добавлен. //Запуск раннера если раннер был добавлен.
_pipeline.GetRunner<IDoSomethingProcess>.Do() _pipeline.GetRunner<IDoSomethingProcess>.Do()
//Или если раннер небыл добавлен(Вызов GetRunnerInstance так же добавит раннер в пайплайн). //Или если раннер не был добавлен(Вызов GetRunnerInstance так же добавит раннер в пайплайн).
_pipeline.GetRunnerInstance<DoSomethingProcessRunner>.Do() _pipeline.GetRunnerInstance<DoSomethingProcessRunner>.Do()
``` ```
> Раннеры имеют ряд требований к реализации: > Раннеры имеют ряд требований к реализации:
> * Наследоваться от `EcsRunner<T>` можно только напрямую; > * Наследоваться от `EcsRunner<T>` можно только напрямую;
> * Раннер может содержать только один интерфейс(за исключением `IEcsProcess`); > * Раннер может содержать только один интерфейс(за исключением `IEcsProcess`);
> * Наследуемый класс `EcsRunner<T>,` далжен так же реализовавыть интерфейс `T`; > * Наследуемый класс `EcsRunner<T>,` должен так же реализовать интерфейс `T`;
> Не рекомендуется в цикле вызывать `GetRunner`, иначе кешируйте полученный раннер. > Не рекомендуется в цикле вызывать `GetRunner`, иначе кешируйте полученный раннер.
</details> </details>
@ -380,7 +382,7 @@ class Aspect : EcsAspect
public EcsTagPool<FreezedTag> freezedTags = Exc; public EcsTagPool<FreezedTag> freezedTags = Exc;
// При запросах будет проверяться наличие компонентов // При запросах будет проверяться наличие компонентов
// из включающего ограничения маски и отсутсвие из исключющего. // из включающего ограничения маски и отсутствие из исключающего.
// Так же есть Opt - только кеширует пул, не влияя на маску. // Так же есть Opt - только кеширует пул, не влияя на маску.
} }
``` ```
@ -540,7 +542,7 @@ EcsGroup newGroup = EcsGroup.Inverse(groupA);
``` ```
## Корень ECS ## Корень ECS
Это пользовательский класс который явялестя точкой входа для ECS. Основное назначение инициализация, запуск систем на каждый Update движка и очистка по окончанию сипользования. Это пользовательский класс который является точкой входа для ECS. Основное назначение инициализация, запуск систем на каждый Update движка и очистка по окончанию использования.
### Пример для Unity ### Пример для Unity
``` c# ``` c#
using DCFApixels.DragonECS; using DCFApixels.DragonECS;
@ -551,7 +553,7 @@ public class EcsRoot : MonoBehaviour
private EcsDefaultWorld _world; private EcsDefaultWorld _world;
private void Start() private void Start()
{ {
//Создание мира для сущностей икомпонентов //Создание мира для сущностей и компонентов
_world = new EcsDefaultWorld(); _world = new EcsDefaultWorld();
//Создание пайплайна длясистем //Создание пайплайна длясистем
_pipeline = EcsPipeline.New() _pipeline = EcsPipeline.New()
@ -567,7 +569,7 @@ public class EcsRoot : MonoBehaviour
// Завершение построения пайплайна. // Завершение построения пайплайна.
.Build(); .Build();
//Иницивлизация пайплайна и запуск IEcsPreInit.PreInit //Инициализация пайплайна и запуск IEcsPreInit.PreInit
//и IEcsInit.Init у всех добавленных систем //и IEcsInit.Init у всех добавленных систем
_pipeline.Init(); _pipeline.Init();
} }
@ -597,7 +599,7 @@ public class EcsRoot
// Инициализация окружения. // Инициализация окружения.
public void Init() public void Init()
{ {
//Создание мира для сущностей икомпонентов. //Создание мира для сущностей и компонентов.
_world = new EcsDefaultWorld(); _world = new EcsDefaultWorld();
//Создание пайплайна для систем. //Создание пайплайна для систем.
_pipeline = EcsPipeline.New() _pipeline = EcsPipeline.New()
@ -613,7 +615,7 @@ public class EcsRoot
// Завершение построения пайплайна. // Завершение построения пайплайна.
.Build(); .Build();
// Иницивлизация пайплайна и запуск IEcsPreInit.PreInit // Инициализация пайплайна и запуск IEcsPreInit.PreInit
// и IEcsInit.Init у всех добавленных систем. // и IEcsInit.Init у всех добавленных систем.
_pipeline.Init(); _pipeline.Init();
} }
@ -735,7 +737,7 @@ using (marker.Auto())
</br> </br>
# Расширение фреймворка # Расширение фреймворка
Для большей расширемости фреймворкеа есть дополнительные инструменты. Для большей расширяемости фреймворка есть дополнительные инструменты.
## Конфиги ## Конфиги
Конструкторы классов `EcsWorld` и `EcsPipeline` могут принимать контейнеры конфигов реализующие интерфейс `IConfigContainer` или `IConfigContainerWriter`. С помощью этих контейнеров можно передавать данные и зависимости. Встроенная реализация контейнера - `ConfigContainer`, но можно так же использовать свою реализацию.</br> Конструкторы классов `EcsWorld` и `EcsPipeline` могут принимать контейнеры конфигов реализующие интерфейс `IConfigContainer` или `IConfigContainerWriter`. С помощью этих контейнеров можно передавать данные и зависимости. Встроенная реализация контейнера - `ConfigContainer`, но можно так же использовать свою реализацию.</br>
@ -838,7 +840,7 @@ public struct WorldComponent : IEcsWorldComponent<WorldComponent>
# Расширения # Расширения
* [Интеграция с движком Unity](https://github.com/DCFApixels/DragonECS-Unity) * [Интеграция с движком Unity](https://github.com/DCFApixels/DragonECS-Unity)
* [Автоматическое внедрение зависимостей](https://github.com/DCFApixels/DragonECS-AutoInjections) * [Автоматическое внедрение зависимостей](https://github.com/DCFApixels/DragonECS-AutoInjections)
* [Классическоя C# многопоточность](https://github.com/DCFApixels/DragonECS-ClassicThreads) * [Классическая C# многопоточность](https://github.com/DCFApixels/DragonECS-ClassicThreads)
* [Hybrid](https://github.com/DCFApixels/DragonECS-Hybrid) * [Hybrid](https://github.com/DCFApixels/DragonECS-Hybrid)
* [One-Frame Components](https://gist.github.com/DCFApixels/46d512dbcf96c115b94c3af502461f60) * [One-Frame Components](https://gist.github.com/DCFApixels/46d512dbcf96c115b94c3af502461f60)
* Графы (Work in progress) * Графы (Work in progress)
@ -848,17 +850,17 @@ public struct WorldComponent : IEcsWorldComponent<WorldComponent>
# FAQ # FAQ
## 'ReadOnlySpan<>' could not be found ## 'ReadOnlySpan<>' could not be found
В версии юнити 2020.1.х в консоли может выпадать ошибка: В версии Unity 2020.1.х в консоли может выпадать ошибка:
``` ```
The type or namespace name 'ReadOnlySpan<>' could not be found (are you missing a using directive or an assembly reference?) The type or namespace name 'ReadOnlySpan<>' could not be found (are you missing a using directive or an assembly reference?)
``` ```
Чтобы починить добавте директиву `ENABLE_DUMMY_SPAN` в `Project Settings/Player/Other Settings/Scripting Define Symbols`. Чтобы починить добавьте директиву `ENABLE_DUMMY_SPAN` в `Project Settings/Player/Other Settings/Scripting Define Symbols`.
## Как Выключать/Включать системы? ## Как Выключать/Включать системы?
Напряму - никак. </br> Напрямую - никак. </br>
Обычно потребность выключить/включить систему появляется когда поменялось общее состояние игры, это может так же значить что нужно переключить сразу группу систем, все это в совокупности можно рассматривать как измннеия процессов. Есть 2 решения:</br> Обычно потребность выключить/включить систему появляется когда поменялось общее состояние игры, это может так же значить что нужно переключить сразу группу систем, все это в совокупности можно рассматривать как измннеия процессов. Есть 2 решения:</br>
+ Если измненеия процесса глобальные, то создать новый `EcsPipeline` и в цикле обновления движка запускать соотвествующий пайплайн. + Если изменения процесса глобальные, то создать новый `EcsPipeline` и в цикле обновления движка запускать соответствующий пайплайн.
+ Разделить `IEcsRun` на несколько процессов и в цикле обновления движка запускать соотвествующий процесс. Для этого создайте новый интерфейс процесса, раннер для запуска этого интерфейса и получайте раннер через `EcsPipeline.GetRunner<T>()`. + Разделить `IEcsRun` на несколько процессов и в цикле обновления движка запускать соответствующий процесс. Для этого создайте новый интерфейс процесса, раннер для запуска этого интерфейса и получайте раннер через `EcsPipeline.GetRunner<T>()`.
## Перечень рекомендаций [DragonECS-Vault](https://github.com/DCFApixels/DragonECS-Vault) ## Перечень рекомендаций [DragonECS-Vault](https://github.com/DCFApixels/DragonECS-Vault)
</br> </br>