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)
| Languages: | [Русский ](https://github.com/DCFApixels/DragonECS-Unity/blob/main/README-RU.md ) | [English(WIP) ](https://github.com/DCFApixels/DragonECS-Unity ) |
| :--- | :--- | :--- |
2024-06-16 12:01:30 +08:00
Расширение добавит набор инструментов для отладки и связи с движком Unity.
2024-03-11 01:54:15 +08:00
> [!WARNING]
> Проект в стадии разработки. API может меняться.
> Readme еще не завершен
2024-03-11 01:51:02 +08:00
# Оглавление
- [Установка ](#установка )
2024-03-11 02:40:13 +08:00
- [Debug ](#debug )
- [Debug Модуль ](#debug-модуль )
- [Debug Сервис ](#debug-сервис )
- [Визуальная отладка ](#визуальная-отладка )
- [Шаблоны ](#шаблоны )
2024-03-28 23:47:09 +08:00
- [Связь с GameObject ](#связь-с -gameobject )
- [World Provider ](#world-provider )
- [FixedUpdate LateUpdate ](#fixedupdate-lateupdate )
2024-06-16 01:39:23 +08:00
- [Документация проекта ](#документация-проекта )
2024-06-16 12:09:34 +08:00
- [Окно настроек ](#окно-настроек )
2024-05-20 05:32:48 +08:00
- [FAQ ](#faq )
2024-03-11 01:51:02 +08:00
< / br >
# Установка
Семантика версионирования - [Открыть ](https://gist.github.com/DCFApixels/e53281d4628b19fe5278f3e77a7da9e8#file-dcfapixels_versioning_ru-md )
## Окружение
Обязательные требования:
+ Зависимость: [DragonECS ](https://github.com/DCFApixels/DragonECS )
+ Минимальная версия C# 7.3;
+ Минимальная версия Unity 2021.2.0;
2024-06-16 12:01:30 +08:00
Протестировано:
2024-03-11 01:51:02 +08:00
+ **Unity:** Минимальная версия 2021.2.0;
## Установка для Unity
* ### Unity-модуль
Поддерживается установка в виде Unity-модуля в при помощи добавления git-URL [в PackageManager ](https://docs.unity3d.com/2023.2/Documentation/Manual/upm-ui-giturl.html ) или ручного добавления в `Packages/manifest.json` :
```
https://github.com/DCFApixels/DragonECS-Unity.git
```
2024-06-16 12:01:30 +08:00
* ### В виде исходников
2024-03-11 01:51:02 +08:00
Фреймворк так же может быть добавлен в проект в виде исходников.
< / br >
2024-03-11 02:40:13 +08:00
# Debug
## Debug Модуль
Подключение модуля отладки в Unity.
```c#
EcsDefaultWorld _world = new EcsDefaultWorld();
EcsEventWorld _eventWorld = new EcsDefaultWorld();
_pipeline = EcsPipeline.New()
//...
// Подключение и инициализация отладки для миров _world и _eventWorld
.AddUnityDebug(_world, _eventWorld)
//...
.BuildAndInit();
```
## Debug Сервис
2024-06-16 12:01:30 +08:00
`UnityDebugService` - реализация [Debug-сервиса для `EcsDebug` ](https://github.com/DCFApixels/DragonECS/blob/main/README-RU.md#ecsdebug ). В редакторе по умолчанию автоматически инициализируется и связывает `EcsDebug.Print` с консолью Unity, `EcsProfilerMarker` c профайлером и т.д.
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();
```
## Визуальная отладка
2024-03-11 06:55:39 +08:00
Выполнена в виде специальных объектов-мониторов в которых отображается состояние разных аспектов фреймворка. Найти эти мониторы можно в Play Mode в разделе `DontDestroyOnLoad` .
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`
Показывает состояние `EcsWorld` . на каждый казанный мир создается отдельный монитор.
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/7b6455fc-9211-425c-b0b8-288077e61543" >
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-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/509ff472-05b5-4fd8-a0e6-739d7fa81ab1" >
2024-03-11 07:38:29 +08:00
< / p >
-----
< / br >
2024-03-11 05:43:31 +08:00
2024-03-11 02:40:13 +08:00
# Шаблоны
2024-03-11 06:32:13 +08:00
Шаблоны - это настраиваемые наборы компонентов которые можно применить к сущностям. Шаблоны должны реализовавыть интерфейс `ITemplateNode` .
```c#
ITemplateNode someSamplate = /*...*/;
//...
foreach (var e in _world.Where(out Aspect a))
{
// Применение шаблона сущности.
someSamplate.Apply(e, _world.id);
}
```
```c#
// Применение шаблона сразу при создании сущности.
int e = _world.NewEntity(someSamplate);
```
2024-03-11 10:21:31 +08:00
По умолчанию расширение содержит 2 вида шаблонов: `ScriptableEntityTemplate` , `MonoEntityTemplate` .
## ScriptableEntityTemplate
2024-06-16 12:01:30 +08:00
Хранится как отдельный ассет. Наследуется от `ScriptableObject` .
2024-03-11 10:21:31 +08:00
Дейсвия чтобы создать `ScriptableEntityTemplate` ассет:
< 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 >
Чтобы добавить компонент в меню `Add Component` Нужен [Шаблон компонента ](#шаблон-компонента ). Пример:
< 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 >
Чтобы добавить компонент в меню `Add Component` Нужен [Шаблон компонента ](#шаблон-компонента ). Пример:
< 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
### Реализация
2024-05-17 11:29:25 +08:00
Чтобы компонент попал в меню `Add Component` нужно реализовать шаблон компонента. Шаблоны компонента это типы реализующие `IComponentTemplate` .
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 >
< summary > * Полная реализация:< / summary >
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); } }
public void Apply(int worldID, int entityID)
{
2024-05-14 06:24:23 +08:00
EcsWorld.GetPoolInstance< EcsPool < SomeComponent > >(worldID).TryAddOrGet(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-06-16 12:09:34 +08:00
< / br >
2024-05-17 11:35:21 +08:00
2024-06-16 12:09:34 +08:00
### Кастомизирование отображения
2024-06-16 01:39:23 +08:00
В раскрывающемся при нажатии `Add Component` меню выбора компонента поддерживается иерархическое группирование. Производится группирование на основе мета-атрибута `[MetaGroup]` .
2024-05-17 11:29:25 +08:00
2024-06-16 12:09:34 +08:00
Компоненты в инспекторе по умолчанию отображаются окрашенными в случайный цвет сгенерированный на основе имени компонента, выбрать другой режим окраски можно в [окне настроек ](#окно-настроек ) фреймворка. Задать конкретный цвет можно при помощи мета-атрибута `[MetaColor]` .
2024-03-11 05:43:31 +08:00
2024-06-16 01:39:23 +08:00
Если редактор смог автоматически определить связанный с компонентом скрипт, то слева от крестика удаления компонента будет иконка файла. Клик по иконке выделит файл скрипта в папке проекта, двойной клик откроет скрип для редактирования. Связанный файл ищется по сопоставлению имени типа и имени файла скрипта.
Если у компонента есть мета-атрибут `[MetaDescription]` , то слева от крестика удаления компонента будет иконка подсказки, при наведении курсора покажется информация из `[MetaDescription]` .
2024-05-22 03:23:10 +08:00
< / br >
2024-06-16 12:09:34 +08:00
### Применение шаблонов компонентов вне стандартных шаблонов сущностей
2024-05-22 03:23:10 +08:00
При необходимости создания кастомного шаблона, шаблоны компонентов поддерживают отображение вне стандартных `MonoEntityTemplate` и `ScriptableEntityTemplate` .
```c#
// ComponentTemplateReference добавляет кнопку выбора доступной реализации IComponentTempalte
// и отображает шаблон компонента аналогично компонентам в MonoEntityTemplate или ScriptableEntityTemplate.
[SerializeReference, ComponentTemplateReference]
private IComponentTempalte _someComponent1;
// Обертка над IComponentTempalte, которая работает аналогично примеру с атрибутом ComponentTemplateReference.
private ComponentTemplateProperty _someComponent2;
// В с е это работает и для массивов.
[SerializeReference, ComponentTemplateReference]
private IComponentTempalte[] _components;
```
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 >
# FixedUpdate LateUpdate
```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 >
2024-06-16 01:39:23 +08:00
# Документация проекта
2024-06-16 12:09:34 +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 >
# Окно настроек
2024-06-16 12:09:34 +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 >
2024-05-20 05:32:48 +08:00
# FAQ
2024-05-20 05:33:38 +08:00
## Н е могу повесить EcsEntityConncet или другие компоненты
2024-05-20 05:32:48 +08:00
Такое может происходить после обновления пакета, решается либо через `Assets -> Reimport All` или перезапуск окна Unity с удалением папки `*project name*/Library` .