DragonECS-Unity/README-RU.md

619 lines
29 KiB
Markdown
Raw Normal View History

2024-03-10 22:30:17 +08:00
<p align="center">
<img width="400" src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/3bb780b7-ab64-4f02-a9be-9632fcfe1b47">
</p>
<p align="center">
<img alt="Version" src="https://img.shields.io/github/package-json/v/DCFApixels/DragonECS-Unity?color=%23ff4e85&style=for-the-badge">
<img alt="GitHub" src="https://img.shields.io/github/license/DCFApixels/DragonECS-Unity?color=ff4e85&style=for-the-badge">
2024-06-16 01:21:34 +08:00
<a href="https://discord.gg/kqmJjExuCf"><img alt="Discord" src="https://img.shields.io/badge/Discord-JOIN-00b269?logo=discord&logoColor=%23ffffff&style=for-the-badge"></a>
<a href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=IbDcH43vhfArb30luGMP1TMXB3GCHzxm&authKey=s%2FJfqvv46PswFq68irnGhkLrMR6y9tf%2FUn2mogYizSOGiS%2BmB%2B8Ar9I%2Fnr%2Bs4oS%2B&noverify=0&group_code=949562781"><img alt="QQ" src="https://img.shields.io/badge/QQ-JOIN-00b269?logo=tencentqq&logoColor=%23ffffff&style=for-the-badge"></a>
2024-03-10 22:30:17 +08:00
</p>
2024-03-11 01:51:02 +08:00
# Интеграция с Unity для [DragonECS](https://github.com/DCFApixels/DragonECS)
2024-08-24 21:37:36 +08:00
<table>
<tr></tr>
<tr>
<td colspan="3">Readme Languages:</td>
</tr>
<tr></tr>
<tr>
<td nowrap width="100">
<a href="https://github.com/DCFApixels/DragonECS-Unity/blob/main/README-RU.md">
<img src="https://github.com/user-attachments/assets/3c699094-f8e6-471d-a7c1-6d2e9530e721"></br>
<span>Русский</span>
</a>
</td>
<td nowrap width="100">
<a href="https://github.com/DCFApixels/DragonECS-Unity">
<img src="https://github.com/user-attachments/assets/30528cb5-f38e-49f0-b23e-d001844ae930"></br>
<span>English(WIP)</span>
</a>
</td>
</tr>
</table>
</br>
2024-03-11 01:51:02 +08:00
2026-04-01 13:07:24 +08:00
Этот пакет делает работу с DragonECS в Unity удобнее и нагляднее: встроенная визуальная отладка и профайлинг, редакторские шаблоны и инструменты для привязки сущностей к `GameObject`.
2024-03-11 01:54:15 +08:00
> [!WARNING]
> Проект в стадии разработки. API может меняться.
2024-08-24 21:37:36 +08:00
> Readme еще не завершен, если есть не ясные моменты, вопросы можно задать тут [Обратная связь](https://github.com/DCFApixels/DragonECS/blob/main/README-RU.md#%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F-%D1%81%D0%B2%D1%8F%D0%B7%D1%8C)
2024-03-11 01:54:15 +08:00
2025-03-29 16:25:29 +08:00
> [!WARNING]
2025-03-29 16:39:19 +08:00
> Встроенные реализации шаблонов `UnityComponent<T>` были перенесены [СЮДА](https://gist.github.com/DCFApixels/c250f2561f09e09ab3e6a4bd4f3013cb#file-unitycomponenttemplates-cs) Так как некоторые модули Unity отключаемы, и например отключение модуля физики приведет к тому что код реализации `UnityComponent<Rigidbody>` или `UnityComponent<Collider>` не будет компилироваться.
2025-03-29 16:25:29 +08:00
//https://gist.github.com/DCFApixels/c250f2561f09e09ab3e6a4bd4f3013cb#file-unitycomponenttemplates-cs
2024-03-11 01:51:02 +08:00
# Оглавление
- [Установка](#установка)
2024-03-11 02:40:13 +08:00
- [Debug](#debug)
- [Debug Сервис](#debug-сервис)
2026-03-02 17:01:46 +08:00
- [Debug Модуль](#debug-модуль)
2024-03-11 02:40:13 +08:00
- [Визуальная отладка](#визуальная-отладка)
2026-03-02 17:01:46 +08:00
- [Шаблоны](#шаблоны)
2024-03-28 23:47:09 +08:00
- [Связь с GameObject](#связь-с-gameobject)
- [World Provider](#world-provider)
2024-10-19 19:47:20 +08:00
- [Шаблон Пайплайна](#шаблон-пайплайна)
2026-04-01 13:07:24 +08:00
- [FixedUpdate LateUpdate](#fixedupdate-lateupdate)
2026-04-17 13:35:35 +08:00
- [Кастомизация инспектора](#Кастомизация-инспектора)
- [Поддержка Jobs](#Поддержка-Jobs)
2024-06-16 01:39:23 +08:00
- [Документация проекта](#документация-проекта)
2024-06-16 12:09:34 +08:00
- [Окно настроек](#окно-настроек)
2026-04-01 15:08:53 +08:00
- [Reference Repairer](#Reference-Repairer)
2024-05-20 05:32:48 +08:00
- [FAQ](#faq)
2024-03-11 01:51:02 +08:00
</br>
# Установка
2026-03-30 12:17:16 +08:00
Семантика версионирования - [Открыть](https://gist.github.com/DCFApixels/af79284955bf40e9476cdcac79d7b098#file-dcfapixels_versioning-md)
2024-03-11 01:51:02 +08:00
## Окружение
Обязательные требования:
+ Зависимость: [DragonECS](https://github.com/DCFApixels/DragonECS)
2024-06-16 15:26:45 +08:00
+ Минимальная версия C# 8.0;
2024-03-11 01:51:02 +08:00
+ Минимальная версия Unity 2021.2.0;
## Установка для Unity
* ### Unity-модуль
2026-03-30 12:17:16 +08:00
Поддерживается установка в виде Unity-модуля при помощи добавления git-URL [в PackageManager](https://docs.unity3d.com/2023.2/Documentation/Manual/upm-ui-giturl.html):
2024-03-11 01:51:02 +08:00
```
https://github.com/DCFApixels/DragonECS-Unity.git
```
2026-03-30 12:17:16 +08:00
Или ручного добавления этой строчки в `Packages/manifest.json`:
```
"com.dcfa_pixels.dragonecs-unity": "https://github.com/DCFApixels/DragonECS-Unity.git",
```
2024-06-16 12:01:30 +08:00
* ### В виде исходников
2026-03-30 12:17:16 +08:00
Можно также напрямую скопировать исходники пакета в проект.
2024-03-11 01:51:02 +08:00
</br>
2024-03-11 02:40:13 +08:00
# Debug
## Debug Сервис
2026-03-02 17:01:46 +08:00
`UnityDebugService` - реализация [Debug-сервиса для `EcsDebug`](https://github.com/DCFApixels/DragonECS/blob/main/README-RU.md#ecsdebug). В редакторе он инициализируется автоматически и обеспечивает интеграцию: например, вызовы `EcsDebug.Print` направляются в консоль Unity, а `EcsProfilerMarker` подключается к встроенному профайлеру и т.д.
2024-03-11 02:40:13 +08:00
```c#
//Ручная активация.
UnityDebugService.Activate();
2024-06-16 12:01:30 +08:00
//Выведет сообщение в консоли Unity.
2024-03-11 02:40:13 +08:00
EcsDebug.Print();
var someMarker = new EcsProfilerMarker("SomeMarker");
someMarker.Begin();
2024-06-16 12:01:30 +08:00
//время выполнения этого участка будет отражено в профайлере Unity.
2024-03-11 02:40:13 +08:00
someMarker.End();
//Остановка игрового режима.
EcsDebug.Break();
```
2026-03-02 17:01:46 +08:00
2024-03-11 02:40:13 +08:00
## Визуальная отладка
2026-03-02 17:01:46 +08:00
2026-03-30 12:17:16 +08:00
Реализовано в виде объектов-мониторов, в которых отображается состояние разных частей фреймворка. Найти эти мониторы можно в `Play Mode` в разделе `DontDestroyOnLoad`.
2026-03-02 17:01:46 +08:00
```c#
_pipeline = EcsPipeline.New()
//...
// Инициализация отладки для пайплайна и миров
.AddUnityDebug(_world, _eventWorld)
//...
.BuildAndInit();
```
2024-03-11 02:40:13 +08:00
2024-03-11 07:38:29 +08:00
<p align="center">
2024-03-11 07:04:15 +08:00
<img src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/54e3f6d1-13c4-4226-a983-c672a29d33bb">
2024-03-11 07:38:29 +08:00
</p>
-----
2024-03-11 06:32:13 +08:00
2024-03-11 06:55:39 +08:00
* ### `PipelineMonitor`
Показывает состояние `EcsPipeline`. Системы отображаются в порядке их выполнения.
2024-03-11 06:46:06 +08:00
2024-03-11 07:38:29 +08:00
<p align="center">
2024-03-11 07:19:52 +08:00
<img width="270px" src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/3682fd0f-f47a-40ed-9d4c-cbad5d512e5d">
2024-03-11 07:38:29 +08:00
</p>
-----
2024-03-11 06:46:06 +08:00
2024-03-11 06:55:39 +08:00
* ### `PipelineProcessMonitor`
2024-06-16 12:01:30 +08:00
Отображает в виде матрицы процессы и системы. Системы отображаются в порядке их выполнения. Точка в пересечении системы и процесса означает что эта система является частью этого процесса.
2024-03-11 06:46:06 +08:00
2024-03-11 07:38:29 +08:00
<p align="center">
2024-03-11 07:04:15 +08:00
<img src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/c1a7960a-d65a-4f22-9597-fd863ff2b00c">
2024-03-11 07:38:29 +08:00
</p>
-----
2024-03-11 06:32:13 +08:00
2024-03-11 06:55:39 +08:00
* ### `WorldMonitor`
2026-03-30 12:17:16 +08:00
Показывает состояние `EcsWorld`. На каждый мир, переданный в `AddUnityDebug(...)`, создается отдельный монитор.
2024-03-11 06:46:06 +08:00
2024-03-11 07:38:29 +08:00
<p align="center">
2026-04-17 13:51:21 +08:00
<img src="https://github.com/user-attachments/assets/83905e7a-a5d1-4470-883a-c3b318cb4726">
</p>
2026-04-17 15:06:51 +08:00
-----
2026-04-17 13:51:21 +08:00
2026-04-17 15:06:51 +08:00
* ### `WorldQueriesMonitor`
Расположен вместе с `WorldMonitor`, показывает список всех Where запросов которые выполняли системы. Вверху есть поле для поиска запросов по именам компонентам. Поисковую строку можно разделять символом `/` для одновременного поиска нескольких компонентов. Рядом с каждым Where запросом есть кнопка `Snapshot`, по нажатию откроется окно со списоком всех сущностей которые на данный момент удовлетворяют маске запроса.
2026-04-17 16:28:48 +08:00
2026-04-17 13:51:21 +08:00
<p align="center">
<img width="400px" src="https://github.com/user-attachments/assets/e6edf718-5c73-437e-abeb-c192ace9f927" />
2024-03-11 07:38:29 +08:00
</p>
-----
2024-03-11 06:32:13 +08:00
2024-03-11 06:55:39 +08:00
* ### `EntityMonitor`
2024-10-19 19:47:20 +08:00
Показывает состояние сущности мира, позволяет добавлять/изменять/удалять компоненты по время Play Mode. На каждую сущность в мире создается отдельный монитор. Все мониторы сущностей помещаются в монитор мира.
2024-03-11 06:46:06 +08:00
2024-03-11 07:38:29 +08:00
<p align="center">
2024-03-11 07:04:15 +08:00
<img src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/509ff472-05b5-4fd8-a0e6-739d7fa81ab1">
2024-03-11 07:38:29 +08:00
</p>
-----
</br>
2024-03-11 05:43:31 +08:00
2026-03-02 17:01:46 +08:00
# Шаблоны
2026-03-30 12:17:16 +08:00
Интеграция содержит шаблоны, расширяющие `ITemplateNode`, предназначенные для настройки сущностей из редактора.
2024-03-11 10:21:31 +08:00
## ScriptableEntityTemplate
2024-06-16 12:01:30 +08:00
Хранится как отдельный ассет. Наследуется от `ScriptableObject`.
2024-03-11 10:21:31 +08:00
<details>
2024-03-11 12:05:46 +08:00
<summary>Создать ассет: Asset > Create > DragonECS > ScriptableEntityTemplate.</summary>
2024-03-11 10:21:31 +08:00
<p align="center">
<img src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/8362e2d8-b83a-4dfc-91fd-38993746012f">
</p>
</details>
2026-04-01 13:07:24 +08:00
Чтобы добавить компонент в меню `Add Component` Нужен [Шаблон компонента](#шаблон-компонента).
2024-03-11 10:21:31 +08:00
<p align="center">
<img src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/26379ee5-cadd-4838-a3b6-5b46771012c1">
</p>
-----
## MonoEntityTemplate
2024-06-16 12:09:34 +08:00
Крепится к `GameObject`. Наследуется от `MonoBehaviour`.
2024-03-11 10:21:31 +08:00
<details>
2024-03-11 12:05:46 +08:00
<summary>Повесить компонент: Add Component > DragonECS > MonoEntityTemplate.</summary>
2024-03-11 10:21:31 +08:00
<p align="center">
<img src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/07a43cb7-96e5-440c-965d-2970803df330">
</p>
</details>
2026-04-01 13:07:24 +08:00
Чтобы добавить компонент в меню `Add Component` Нужен [Шаблон компонента](#шаблон-компонента).
2024-03-11 10:21:31 +08:00
<p align="center">
<img src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/7f6b722e-6f98-4d13-b2cd-5d576a3610bd">
</p>
-----
2024-03-11 08:24:22 +08:00
## Шаблон компонента
2024-06-16 12:09:34 +08:00
2026-04-01 15:08:53 +08:00
Чтобы компонент попал в меню `Add Component` требуется шаблон. Шаблоны компонента это типы реализующие `IComponentTemplate` или компоненты реализующие `ITemplateNode` вместе с `IEcsComponentMember`.
2026-03-02 17:01:46 +08:00
2024-06-16 12:09:34 +08:00
### Реализация
2024-03-11 08:24:22 +08:00
* Упрощенная реализация:
```c#
2024-06-16 01:39:23 +08:00
// Обязательно добавить [Serializable] к типу компонента.
2024-03-11 08:24:22 +08:00
[Serializable]
2024-06-16 01:39:23 +08:00
struct SomeComponent : IEcsComponent { /* ... */ }
2024-03-11 08:24:22 +08:00
class SomeComponentTemplate : ComponentTemplate<SomeComponent> { }
```
```c#
2024-06-16 01:39:23 +08:00
// Тоже самое но для компонентов-тегов.
2024-03-11 08:24:22 +08:00
[Serializable]
2024-06-16 01:39:23 +08:00
struct SomeTagComponent : IEcsTagComponent { }
2024-03-11 08:24:22 +08:00
class SomeTagComponentTemplate : TagComponentTemplate<SomeComponent> { }
```
2024-05-17 11:35:21 +08:00
<details>
2026-04-01 12:51:43 +08:00
<summary>Другие способы</summary>
2024-05-17 11:35:21 +08:00
2026-04-01 12:51:43 +08:00
#### Реализация `ITemplateNode` у компонента
Такой способ может быть удобен тем что не требует создания отдельного класса шаблона, компонент сам выступает как шаблон, и он так же прост в реализации. Минус данного подхода, что проще случайно переименовать компонент и получить Missing Reference в местах с атрибутом `[SerializeReference]`.
```c#
public struct Health : IEcsComponent, ITemplateNode
{
public float Points;
public void Apply(short worldID, int entityID)
{
EcsPool<Health>.Apply(worldID, entityID) = this;
}
}
```
#### Реализация кастомного шаблона
Если не подходят встроенные `ComponentTemplate<T>` или `TagComponentTemplate<T>`, можно создать свой шаблон реализующий `IComponentTemplate`. Например это может пригодиться для кастомного пула. В большинстве случаев достаточно использовать встроенные шаблоны.
2026-03-02 17:01:46 +08:00
2024-03-11 08:24:22 +08:00
```c#
[Serializable]
2024-06-16 01:39:23 +08:00
struct SomeComponent : IEcsComponent { /* ... */ }
2024-03-11 08:24:22 +08:00
class SomeComponentTemplate : IComponentTemplate
{
[SerializeField]
protected SomeComponent component;
public Type Type { get { return typeof(SomeComponent); } }
2026-03-02 17:01:46 +08:00
public bool IsUnique { get { return true; } }
2024-03-11 08:24:22 +08:00
public void Apply(int worldID, int entityID)
{
2026-04-01 13:07:24 +08:00
EcsPool<SomeComponent>.Apply(worldID, entityID) = component;
2024-03-11 08:24:22 +08:00
}
public object GetRaw() { return component; }
public void SetRaw(object raw) { component = (SomeComponent)raw; }
public void OnGizmos(Transform transform, IComponentTemplate.GizmosMode mode) { /*...*/ }
public void OnValidate(UnityEngine.Object obj) { /*...*/ }
}
```
2024-03-11 06:32:13 +08:00
2024-05-17 11:35:21 +08:00
</details>
2024-05-22 03:23:10 +08:00
2026-04-17 15:06:51 +08:00
> В разделе [Кастомизация инспектора](#Кастомизация-инспектора) описана кастомизация отображения компонентов и использование вне шаблонов сущьностей.
2024-03-11 10:21:31 +08:00
</br>
2024-03-11 07:38:29 +08:00
2024-03-11 10:21:31 +08:00
# Связь с GameObject
2024-05-17 11:29:25 +08:00
Связываются сущности и GameObject-ы с помощью коннектов. Коннекты со стороны GameObject - `EcsEntityConnect`, со стороны сущности - `GameObjectConnect`. `EcsEntityConnect` - управляющий коннект, `GameObjectConnect` - создается/удаляется автоматически.
2024-03-11 12:05:46 +08:00
```c#
EcsEntityConnect connect = /*...*/;
entlong entity = _world.NewEntityLong();
// Связывание сущности с GameObject.
2024-06-16 12:01:30 +08:00
// Автоматически добавляется GameObjectConnect в сущность
// и применяются шаблоны.
2024-03-11 12:05:46 +08:00
connect.ConnectWith(entity);
2024-03-11 06:32:13 +08:00
2024-06-16 12:01:30 +08:00
// Или создать без применения шаблонов.
2024-03-11 12:05:46 +08:00
connect.ConnectWith(entity, false);
// Отвязать.
// Автоматически удалится GameObjectConnect.
connect.Disconnect();
```
2024-03-11 10:21:31 +08:00
<details>
2024-03-11 12:05:46 +08:00
<summary>Повесить компонент: Add Component > DragonECS > EcsEntityConnect.</summary>
2024-03-11 06:32:13 +08:00
2024-03-11 10:21:31 +08:00
<p align="center">
<img src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/cfa6eb1c-82ba-47f6-bee1-7986c1e31be7">
</p>
2024-03-11 06:32:13 +08:00
2024-03-11 10:21:31 +08:00
</details>
2024-03-11 05:43:31 +08:00
2024-03-11 10:21:31 +08:00
<p align="center">
<img src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/3484ed12-5417-4450-9908-1d3eb2858a2b">
</p>
2024-03-11 07:38:29 +08:00
2024-03-11 12:05:46 +08:00
> Просмотреть все компоненты связанной сущности можно развернув `RUNTIME COMPONENTS`.
> На панели внизу есть вспомогательные кнопки: 1) Отвязать сущность. 2) Удалить сущность. 3) Автоматическое заполнение массива шаблонов. 4) Каскадный вызов автозаполнения для всех дочерних коннектов в иерархии.
---
2024-06-16 12:01:30 +08:00
`AutoEntityCreator` автоматический создает сущность и связывает с GameObject. В инспекторе ему нужно указать `EcsEntityConnect` с которым связывать сущность и [Провайдер мира](#world-provider) в котором создать сущность.
2024-03-11 08:24:22 +08:00
2024-03-11 10:21:31 +08:00
<details>
2024-03-11 12:05:46 +08:00
<summary>Повесить компонент: Add Component > DragonECS > AutoEntityCreator.</summary>
2024-03-11 07:38:29 +08:00
2024-03-11 10:21:31 +08:00
<p align="center">
<img src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/29bfef68-6e77-467c-84d3-14d73a9c614d">
</p>
2024-03-11 02:40:13 +08:00
2024-03-11 10:21:31 +08:00
</details>
2024-03-11 09:21:01 +08:00
2024-03-11 10:21:31 +08:00
<p align="center">
<img src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/55c11f1c-c0e0-435c-af9b-4c06678491a6">
</p>
2024-03-11 09:21:01 +08:00
2024-05-17 11:37:09 +08:00
> На панели внизу есть вспомогательные кнопки: 1) Автоматическое заполнение ссылки на коннект. 2) Каскадный вызов автозаполнения для всех дочерних экземпляров в иерархии.
2024-05-17 11:35:21 +08:00
2024-03-28 23:47:09 +08:00
</br>
2024-03-11 10:21:31 +08:00
# World Provider
2024-05-20 05:56:45 +08:00
`EcsWorldProvider<TWorld>` - это `ScriptableObject` обертка над `TWorld`, предназначенная для пробрасывания экземпляра мира и настройки через инспектор Unity. Для простых случаев достаточно будет использовать синглтон версию провайдера `EcsDefaultWorldSingletonProvider`.
2024-03-11 09:21:01 +08:00
2024-05-20 05:56:45 +08:00
```c#
// Синглтон провайдер создается автоматически в папке "Assets/Resource".
EcsDefaultWorldSingletonProvider provider = EcsDefaultWorldSingletonProvider.Instance;
// ...
EcsDefaultWorld world = new EcsDefaultWorld();
// Устанавливаем экземпляр мира в провайдер.
provider.Set(world);
// ...
//Получаем экземпляр мира, если провайдер был пуст, то он создаст новый мир.
EcsDefaultWorld world = provider.Get();
EcsPipeline pipeline = EcsPipeline.New()
//...
// Внедряем в системы полученный из провайдера мир.
.Inject(world)
//...
.BuildAndInit();
```
2024-05-20 05:59:48 +08:00
<details>
<summary>Пример реализации провайдера для своего типа мира</summary>
2024-05-20 05:56:45 +08:00
```c#
2024-05-20 05:59:48 +08:00
//Пример реализации своего провайдера для пробрасывания мира своего типа
2024-05-20 05:56:45 +08:00
[CreateAssetMenu(fileName = nameof(EcsMyWorldProvider), menuName = EcsConsts.FRAMEWORK_NAME + "/WorldProviders/" + nameof(EcsMyWorldProvider), order = 1)]
public class EcsMyWorldProvider : EcsWorldProvider<EcsMyWorld> { }
2024-05-20 05:59:48 +08:00
//Пример реализации синглтон версии для мира своего типа
2024-05-20 05:56:45 +08:00
public class EcsMyWorldSingletonProvider : EcsWorldProvider<EcsMyWorld>
{
private static EcsMyWorldSingletonProvider _instance;
public static EcsMyWorldSingletonProvider Instance
{
get
{
if (_instance == null) { _instance = FindOrCreateSingleton<EcsMyWorldSingletonProvider>("SingletonMyWorld"); }
return _instance;
}
}
}
```
2024-03-11 09:21:01 +08:00
2024-05-20 05:59:48 +08:00
</details>
2024-03-11 10:21:31 +08:00
<details>
2024-03-11 12:05:46 +08:00
<summary>Создать ассет провайдера: Asset > Create > DragonECS > WorldProviders > Выбрать тип мира.</summary>
2024-03-11 10:21:31 +08:00
<p align="center">
<img width="780px" src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/8aa1bd82-8a15-46ce-b950-3e74252243c6">
</p>
2024-03-11 09:21:01 +08:00
2024-03-11 10:21:31 +08:00
</details>
2024-03-11 09:21:01 +08:00
2024-03-11 10:21:31 +08:00
<p align="center">
<img src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/d01a671a-69e9-44b9-9ad1-e58d0e8857d7">
2024-03-28 23:47:09 +08:00
</p>
</br>
2024-10-19 19:47:20 +08:00
# Шаблон Пайплайна
Пайплайн как и сущности можно собирать из шаблонов. Шаблоны пайплайна это модули, реализующие интерфейс `IEcsModule`
По умолчанию расширение содержит 2 вида шаблонов: `ScriptablePipelineTemplate`, `MonoPipelineTemplate`.
## ScriptablePipelineTemplate
Хранится как отдельный ассет. Наследуется от `ScriptableObject`. Действия чтобы создать `ScriptableEntityTemplate` ассет: `Asset > Create > DragonECS > ScriptablePipelineTemplate`.
<p align="center">
2024-10-19 19:59:04 +08:00
<img width="450" src="https://github.com/user-attachments/assets/c61c483d-3f2f-4356-bf9d-62633fc06fce">
2024-10-19 19:47:20 +08:00
</p>
## MonoPipelineTemplate
Крепится к `GameObject`. Наследуется от `MonoBehaviour`. Повесить компонент: `Add Component > DragonECS > MonoPipelineTemplate`.
<p align="center">
2024-10-19 19:59:04 +08:00
<img width="450" src="https://github.com/user-attachments/assets/4ba4d594-e031-4588-bd36-3273611db820">
2024-10-19 19:47:20 +08:00
</p>
</br>
# EcsRootUnity
2026-03-30 12:17:16 +08:00
Упрощённая реализация Ecs Root для Unity; собирает пайплайн из шаблонов. Наследуется от `MonoBehaviour`. Чтобы добавить на GameObject: `Add Component > DragonECS > EcsRootUnity`.
2024-10-19 19:47:20 +08:00
<p align="center">
2024-10-19 19:59:04 +08:00
<img width="450" src="https://github.com/user-attachments/assets/3ff42747-0366-4db8-8015-9ea254d72feb">
2024-10-19 19:47:20 +08:00
</p>
2024-10-19 19:54:38 +08:00
2024-10-19 19:47:20 +08:00
</br>
2026-03-30 12:17:16 +08:00
# FixedUpdate и LateUpdate
2024-03-28 23:47:09 +08:00
```c#
using DCFApixels.DragonECS;
using UnityEngine;
public class EcsRoot : MonoBehaviour
{
private EcsPipeline _pipeline;
//...
private void Update()
{
// Стандартный Run из фреймворка.
_pipeline.Run();
}
private void FixedUpdate()
{
// Специальный Run для трансляции FixedUpdate.
_pipeline.FixedRun();
}
private void LateUpdate()
{
// Специальный Run для трансляции LateUpdate.
_pipeline.LateRun();
}
// ...
}
2024-05-14 06:24:23 +08:00
```
2024-05-20 05:32:48 +08:00
</br>
2026-04-17 13:35:35 +08:00
# Кастомизация инспектора
## Атрибуты инспектора
+ **[ReferenceDropDown]** -
Применяется к полю с `[SerializeReference]`. Добавляет кнопку выбора типа из списка. Можно ограничить набор доступных типов, передав список в конструктор.
+ **[ReferenceDropDownWithout]** -
Используется вместе с `[ReferenceDropDown]`, чтобы исключить указанные типы (и их наследников) из списка выбора.
+ **[DragonMetaBlock]** -
Отображает значение в инспекторе так же, как компоненты в шаблонах сущности. Учитывает meta-атрибуты (`MetaGroup`, `MetaColor`, `MetaDescription`, `MetaID` и др.).
## Поведение Meta-атрибутов
+ Иерархическая группировка элементов в меню `Add Component` или `[ReferenceDropDown]` задаётся через `[MetaGroup]`.
+ Цвет компонента в инспекторе по умолчанию определяется именем типа. Режим окраски можно изменить в окне настроек. Явный цвет задаётся через `[MetaColor]`.
+ При совпадении имени типа и файла (или при наличии `[MetaID]`) рядом с кнопкой удаления появляется иконка файла: один клик — выделение скрипта в проекте, двойной клик — открытие.
+ Если указан `[MetaDescription]`, рядом отображается иконка подсказки с текстом описания.
+ При восстановлении **Missing Reference** с помощью [**Reference Repairer**](#Reference-Repairer), инструмент ищет соответствие старого и нового имени типа по атрибуту `[MetaID(id)]`.
## Примеры:
Атрибут `DragonMetaBlock`:
```c#
// Отображение поля настраиваемое мета-атрибутами.
// Аналогично компонентам в MonoEntityTemplate или ScriptableEntityTemplate.
[DragonMetaBlock]
public SomeComponent Component;
// Можно применять к любому полю любого типа.
[DragonMetaBlock]
public Foo Foo;
```
`ReferenceDropDown` и `ReferenceDropDownWithout`:
```c#
// Добавляет кнопку выбора реализации ITemplateNode из выпадающего списка.
[SerializeReference]
[ReferenceDropDown]
public ITemplateNode Template;
```
```c#
// Так же можно применять к любому полю любого типа.
// В списке будут только тип Foo и его наследники, исключая FooExc и его наследников.
[SerializeReference]
[ReferenceDropDown(typeof(Foo))]
[ReferenceDropDownWithout(typeof(FooExc))]
public object Template;
```
Комбинирование и другие варианты использования:
```c#
// Атрибуты можно комбинировать.
[DragonMetaBlock]
[ReferenceDropDown]
public ITemplateNode Template;
// Обертка над ITemplateNode, аналогично примеру выше.
public ComponentTemplateProperty Template;
// Атрибуты корректно работают с массивами и листами.
[DragonMetaBlock]
[ReferenceDropDown]
public ITemplateNode[] Template;
```
</br>
# Поддержка Jobs
DragonECS по умолчанию совместим с Job системой Unity. Пример:
```c#
EcsWorld _world;
class Aspect : EcsAspect
{
// Пул для unmanaged компонентов.
public EcsValuePool<Cmp> Cmps = Inc;
}
public void Run()
{
var job = new Job()
{
// Идентично Where, но возвращает unmanaged список сущностей.
Entities = _world.WhereUnsafe(out Aspect a),
// Конвертация пула в unmanaged версию
Cmps = a.Cmps.AsNative(),
X = 10f,
};
JobHandle jobHandle = job.Schedule(job.Entities.Count, 64);
jobHandle.Complete();
}
```
```c#
// Unmanaged компонент.
public struct Cmp : IEcsValueComponent
{
public float A;
}
private struct Job : IJobParallelFor
{
public EcsUnsafeSpan Entities;
public NativeEcsValuePool<Cmp> Cmps;
public float X;
public Job(EcsUnsafeSpan entities, float x)
{
Entities = entities;
X = x;
}
public void Execute(int index)
{
var e = Entities[index];
Cmps[e].A += X;
}
}
```
</br>
2024-06-16 01:39:23 +08:00
# Документация проекта
2026-03-30 12:17:16 +08:00
В интеграции также есть окно документации проекта на основе мета-атрибутов. Открыть документацию: `Tools > DragonECS > Documentation`. Документация формируется при первом открытии окна и при нажатии кнопки `Update`.
2024-06-16 01:39:23 +08:00
2024-06-16 01:42:43 +08:00
<p align="center">
<img src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/f5795823-aeae-45df-8e25-db64df837513">
</p>
2024-06-16 01:39:23 +08:00
</br>
# Окно настроек
2026-03-30 12:17:16 +08:00
В окне настроек доступно несколько опций, включая режимы отображения компонентов в инспекторе. Внизу находятся переключатели для define-переменных, используемых в фреймворке. Открыть окно настроек: `Tools > DragonECS > Settings`.
2024-06-16 01:42:43 +08:00
<p align="center">
<img src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/c794be8d-6884-4415-b24a-0a1a28f577a6">
</p>
2024-06-16 01:39:23 +08:00
</br>
2026-04-01 15:08:53 +08:00
# Reference Repairer
Инструмент для восстановления Missing Reference. Некоторые части интеграции активно задействует `[SerializeReference]`, у которого есть известная проблема с потерей типов при переименовании. `Reference Repairer` упрощает процесс восстановления. Он может собирать все ассеты с потерянными типами, после этого предоставляет окно для указания новых имён потерянных типов и выполнит их восстановление в собранных ассетах. Открыть окно инструмента: `Tools > DragonECS > Reference Repairer`.
2026-03-30 12:17:16 +08:00
> Если потерянные типы имеют атрибут `[MetaID(id)]`, инструмент попытается автоматически сопоставить новое имя типа.
2024-10-19 19:47:20 +08:00
<p align="center">
2024-10-19 19:59:04 +08:00
<img width="700" src="https://github.com/user-attachments/assets/ffb2b78a-db43-445d-a371-6358250b8cee">
2024-10-19 19:47:20 +08:00
</p>
</br>
2024-05-20 05:32:48 +08:00
# FAQ
2026-03-30 12:17:16 +08:00
## Не могу повесить `EcsEntityConnect` или другие компоненты
Иногда это происходит после обновления пакета. Решения: выполните `Assets -> Reimport All` или перезапустите Unity после удаления папки `Library` в корне проекта.