diff --git a/README-RU.md b/README-RU.md
index 6e52345..b55dad2 100644
--- a/README-RU.md
+++ b/README-RU.md
@@ -5,20 +5,41 @@
-
-
+
+
# Интеграция с 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) |
-| :--- | :--- | :--- |
+
-Расширение добавит набор инструментов для дебага и связи с движком Unity.
+
+
+Расширение добавит набор инструментов для отладки и связи с движком Unity.
> [!WARNING]
> Проект в стадии разработки. API может меняться.
-> Readme еще не завершен
+> 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)
# Оглавление
- [Установка](#установка)
@@ -30,6 +51,8 @@
- [Связь с GameObject](#связь-с-gameobject)
- [World Provider](#world-provider)
- [FixedUpdate LateUpdate ](#fixedupdate-lateupdate)
+- [Документация проекта](#документация-проекта)
+- [Окно настроек](#окно-настроек)
- [FAQ](#faq)
@@ -39,10 +62,10 @@
## Окружение
Обязательные требования:
+ Зависимость: [DragonECS](https://github.com/DCFApixels/DragonECS)
-+ Минимальная версия C# 7.3;
++ Минимальная версия C# 8.0;
+ Минимальная версия Unity 2021.2.0;
-Протестированно:
+Протестировано:
+ **Unity:** Минимальная версия 2021.2.0;
## Установка для Unity
@@ -51,7 +74,7 @@
```
https://github.com/DCFApixels/DragonECS-Unity.git
```
-* ### В виде иходников
+* ### В виде исходников
Фреймворк так же может быть добавлен в проект в виде исходников.
@@ -71,17 +94,17 @@ _pipeline = EcsPipeline.New()
.BuildAndInit();
```
## Debug Сервис
-`UnityDebugService`- реализация [Debug-сервиса для `EcsDebug`](https://github.com/DCFApixels/DragonECS/blob/main/README-RU.md#ecsdebug). В редакторе по умолчанию автоматически инициализируется и связывает `EcsDebug.Print` с консолью юнити, `EcsProfilerMarker` c профайлером и т.д.
+`UnityDebugService`- реализация [Debug-сервиса для `EcsDebug`](https://github.com/DCFApixels/DragonECS/blob/main/README-RU.md#ecsdebug). В редакторе по умолчанию автоматически инициализируется и связывает `EcsDebug.Print` с консолью Unity, `EcsProfilerMarker` c профайлером и т.д.
```c#
//Ручная активация.
UnityDebugService.Activate();
-//Выведет сообщение в консоле Unity.
+//Выведет сообщение в консоли Unity.
EcsDebug.Print();
var someMarker = new EcsProfilerMarker("SomeMarker");
someMarker.Begin();
-//время выполнения этого участка будет отражено в профайлере юнити.
+//время выполнения этого участка будет отражено в профайлере Unity.
someMarker.End();
//Остановка игрового режима.
@@ -106,7 +129,7 @@ EcsDebug.Break();
-----
* ### `PipelineProcessMonitor`
-Отображает в виде матрицы процессы и сситемы. Системы отображабтся в порядке их выполнения. Точка в пересечении системы и процесса означает что эта система является частью этого процесса.
+Отображает в виде матрицы процессы и системы. Системы отображаются в порядке их выполнения. Точка в пересечении системы и процесса означает что эта система является частью этого процесса.
@@ -124,7 +147,7 @@ EcsDebug.Break();
-----
* ### `EntityMonitor`
-Показывает состояние сущности мира. На кажду сущность в мире создается отдельынй монитор. Все мониторы сущностей помещаются в монитор мира.
+Показывает состояние сущности мира. На каждую сущность в мире создается отдельный монитор. Все мониторы сущностей помещаются в монитор мира.
@@ -135,25 +158,25 @@ EcsDebug.Break();
# Шаблоны
-Шаблоны - это настраиваемые наборы компонентов которые можно применить к сущностям. Шаблоны должны реализовавыть интерфейс `ITemplateNode`.
+Шаблоны - это настраиваемые наборы компонентов которые можно применить к сущностям. Шаблоны должны реализовывать интерфейс `ITemplateNode`.
```c#
-ITemplateNode someSamplate = /*...*/;
+ITemplateNode someTemplate = /*...*/;
//...
foreach (var e in _world.Where(out Aspect a))
{
// Применение шаблона сущности.
- someSamplate.Apply(e, _world.id);
+ someTemplate.Apply(e, _world.id);
}
```
```c#
// Применение шаблона сразу при создании сущности.
-int e = _world.NewEntity(someSamplate);
+int e = _world.NewEntity(someTemplate);
```
По умолчанию расширение содержит 2 вида шаблонов: `ScriptableEntityTemplate`, `MonoEntityTemplate`.
## ScriptableEntityTemplate
-Хранится как отдельынй ассет. Наследуется от `ScriptableObject`.
-Дейсвия чтобы создать `ScriptableEntityTemplate` ассет:
+Хранится как отдельный ассет. Наследуется от `ScriptableObject`.
+Действия чтобы создать `ScriptableEntityTemplate` ассет:
Создать ассет: Asset > Create > DragonECS > ScriptableEntityTemplate.
@@ -173,7 +196,7 @@ int e = _world.NewEntity(someSamplate);
-----
## MonoEntityTemplate
-Крепится к GameObject. Наследуется от `MonoBehaviour`.
+Крепится к `GameObject`. Наследуется от `MonoBehaviour`.
Повесить компонент: Add Component > DragonECS > MonoEntityTemplate.
@@ -193,20 +216,22 @@ int e = _world.NewEntity(someSamplate);
-----
## Шаблон компонента
+
+### Реализация
Чтобы компонент попал в меню `Add Component` нужно реализовать шаблон компонента. Шаблоны компонента это типы реализующие `IComponentTemplate`.
* Упрощенная реализация:
```c#
-// Обязательно добавить [Serializable] к ттипу компонента
+// Обязательно добавить [Serializable] к типу компонента.
[Serializable]
-struct SomeComponent : IEcsComponent { /*...*/ }
+struct SomeComponent : IEcsComponent { /* ... */ }
class SomeComponentTemplate : ComponentTemplate { }
```
-* Упрощенная реализация для компонентов-тегов:
```c#
+// Тоже самое но для компонентов-тегов.
[Serializable]
-struct SomeTagComponent : IEcsTagComponent { /*...*/ }
+struct SomeTagComponent : IEcsTagComponent { }
class SomeTagComponentTemplate : TagComponentTemplate { }
```
@@ -215,7 +240,7 @@ class SomeTagComponentTemplate : TagComponentTemplate { }
```c#
[Serializable]
-struct SomeComponent : IEcsComponent { /*...*/ }
+struct SomeComponent : IEcsComponent { /* ... */ }
class SomeComponentTemplate : IComponentTemplate
{
[SerializeField]
@@ -233,18 +258,24 @@ class SomeComponentTemplate : IComponentTemplate
```
+
-В раскрывающемся при нажатии `Add Component` меню выбора компонента поддердивается иерархическое группирование. Производится группирование на основе мета-атрибута `[MetaGroup]`.
-Компоненты в инспектрре по умолчанию отображаются окрашенными в случайный цвет сгенерированный на основе имени компонента, выбрать другой режим окраски можно в настройках фреймворка. Задать конкретный цвет можно при помощи мета-атрибута `[MetaColor]`.
+### Кастомизирование отображения
+В раскрывающемся при нажатии `Add Component` меню выбора компонента поддерживается иерархическое группирование. Производится группирование на основе мета-атрибута `[MetaGroup]`.
-Если у компонента есть мета-атрибут `[MetaDescription]`, то рядом с крестиком удаления компонента будет иконка подсказки, при наведении курсора отобразится в виде подсказки информация из `[MetaDescription]`.
+Компоненты в инспекторе по умолчанию отображаются окрашенными в случайный цвет сгенерированный на основе имени компонента, выбрать другой режим окраски можно в [окне настроек](#окно-настроек) фреймворка. Задать конкретный цвет можно при помощи мета-атрибута `[MetaColor]`.
+
+Если редактор смог автоматически определить связанный с компонентом скрипт, то слева от крестика удаления компонента будет иконка файла. Клик по иконке выделит файл скрипта в папке проекта, двойной клик откроет скрип для редактирования. Связанный файл ищется по сопоставлению имени типа и имени файла скрипта.
+
+Если у компонента есть мета-атрибут `[MetaDescription]`, то слева от крестика удаления компонента будет иконка подсказки, при наведении курсора покажется информация из `[MetaDescription]`.
-При необходимости создания кастомного шаблона, шаблоны компонентов поддерживают отображение вне стандартных `MonoEntityTemplate` и `ScriptableEntityTemplate`.
+### Применение шаблонов компонентов вне стандартных шаблонов сущностей
+При необходимости создания пользовательского шаблона, шаблоны компонентов поддерживают отображение вне стандартных `MonoEntityTemplate` и `ScriptableEntityTemplate`.
```c#
-// ComponentTemplateReference добавляет кнопку выбора доступной реализации IComponentTempalte
+// ComponentTemplateReference добавляет кнопку выбора доступной реализации IComponentTemplate
// и отображает шаблон компонента аналогично компонентам в MonoEntityTemplate или ScriptableEntityTemplate.
[SerializeReference, ComponentTemplateReference]
private IComponentTempalte _someComponent1;
@@ -266,11 +297,11 @@ EcsEntityConnect connect = /*...*/;
entlong entity = _world.NewEntityLong();
// Связывание сущности с GameObject.
-// Автоматически добавляется GameObjectConnect в сущность.
-// Автоматическки применяются шаблоны.
+// Автоматически добавляется GameObjectConnect в сущность
+// и применяются шаблоны.
connect.ConnectWith(entity);
-// Или создать без применения шаблнов.
+// Или создать без применения шаблонов.
connect.ConnectWith(entity, false);
// Отвязать.
@@ -296,7 +327,7 @@ connect.Disconnect();
---
-`AutoEntityCreator` автоматический создает сущность и связывает с GameObject. В инспекторе ему нужно указать `EcsEntityConnect` с которым связывать сущность и [Провайдер мира](#world-provider) в котормо создать сущность.
+`AutoEntityCreator` автоматический создает сущность и связывает с GameObject. В инспекторе ему нужно указать `EcsEntityConnect` с которым связывать сущность и [Провайдер мира](#world-provider) в котором создать сущность.
Повесить компонент: Add Component > DragonECS > AutoEntityCreator.
@@ -409,6 +440,24 @@ public class EcsRoot : MonoBehaviour
+# Документация проекта
+В интеграции так же есть окно документации проекта на основе Мета-Атрибутов. Открыть документацию: `Tools > DragonECS > Documentation`. Документация формируется при первом открытии окна и при нажатии кнопки `Update`.
+
+
+
+
+
+
+
+# Окно настроек
+В окне настроек есть несколько опций, включая возможность менять режимы отображения компонентов в инспекторе. Внизу расположены удобные переключатели для используемых в фреймворке define значения для директив процессора. Открыть документацию: `Tools > DragonECS > Settings`.
+
+
+
+
+
+
+
# FAQ
## Не могу повесить EcsEntityConncet или другие компоненты
-Такое может происходить после обновления пакета, решается либо через `Assets -> Reimport All` или перезапуск окна Unity с удалением папки `*project name*/Library`.
+Такое иногда может происходить после обновления пакета, решается либо через `Assets -> Reimport All` или перезапуск окна Unity с удалением папки `*project name*/Library`.
diff --git a/README.md b/README.md
index f099b3f..ed6d6ee 100644
--- a/README.md
+++ b/README.md
@@ -5,13 +5,35 @@
-
+
+
# Integration with Unity for [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) |
-| :--- | :--- | :--- |
+
+
+
The extension will add a set of tools for debugging and communicating with the Unity engine.
@@ -27,7 +49,7 @@ Versioning semantics - [Open](https://gist.github.com/DCFApixels/e53281d4628b19f
## Environment
Requirements:
+ Dependency: [DragonECS](https://github.com/DCFApixels/DragonECS)
-+ Minimum version of C# 7.3;
++ Minimum version of C# 8.0;
+ Minimum version of Unity 2021.2.0;
Tested with:
diff --git a/package.json b/package.json
index f15b6cf..47c9522 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,7 @@
"displayName": "DragonECS-Unity",
"description": "Integration with Unity for DragonECS",
"unity": "2021.2",
- "version": "0.4.1",
+ "version": "0.4.3",
"repository": {
"type": "git",
"url": "https://github.com/DCFApixels/DragonECS-Unity.git"
diff --git a/src/Connectors/EcsEntityConnect.cs b/src/Connectors/EcsEntityConnect.cs
index 50fa666..03822fe 100644
--- a/src/Connectors/EcsEntityConnect.cs
+++ b/src/Connectors/EcsEntityConnect.cs
@@ -145,8 +145,8 @@ namespace DCFApixels.DragonECS
{
var unityGameObjects = _world.GetPool();
unityGameObjects.TryDel(oldEntityID);
- _connectedEntities.Remove(GetInstanceID());
}
+ _connectedEntities.Remove(GetInstanceID());
_world = null;
_entity = entlong.NULL;
}
diff --git a/src/EntityTemplate/Templates/ComponentTemplateBase.cs b/src/EntityTemplate/Templates/ComponentTemplateBase.cs
index 39404d3..8d7ec95 100644
--- a/src/EntityTemplate/Templates/ComponentTemplateBase.cs
+++ b/src/EntityTemplate/Templates/ComponentTemplateBase.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
+using System.Runtime.InteropServices;
using UnityEngine;
using static DCFApixels.DragonECS.IComponentTemplate;
@@ -50,11 +51,14 @@ namespace DCFApixels.DragonECS
#endregion
}
[Serializable]
+ [StructLayout(LayoutKind.Sequential)]
public abstract class ComponentTemplateBase : ComponentTemplateBase
{
protected static TypeMeta Meta = EcsDebugUtility.GetTypeMeta();
[SerializeField]
protected T component;
+ [SerializeField]
+ private byte _offset; // Fucking Unity drove me crazy with the error "Cannot get managed reference index with out bounds offset". This workaround helps avoid that error.
#region Properties
public sealed override Type Type { get { return typeof(T); } }
@@ -66,14 +70,8 @@ namespace DCFApixels.DragonECS
#endregion
#region Methods
- public override object GetRaw()
- {
- return component;
- }
- public override void SetRaw(object raw)
- {
- component = (T)raw;
- }
+ public sealed override object GetRaw() { return component; }
+ public sealed override void SetRaw(object raw) { component = (T)raw; }
#endregion
}
@@ -86,7 +84,7 @@ namespace DCFApixels.DragonECS
}
}
public abstract class TagComponentTemplate : ComponentTemplateBase
- where T : struct, IEcsTagComponent
+ where T : struct, IEcsTagComponent
{
public override void Apply(short worldID, int entityID)
{