Merge branch 'main' into dev

This commit is contained in:
Mikhail 2024-09-09 10:01:47 +08:00
commit c0c06153a1
5 changed files with 120 additions and 51 deletions

View File

@ -5,20 +5,41 @@
<p align="center"> <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="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"> <img alt="GitHub" src="https://img.shields.io/github/license/DCFApixels/DragonECS-Unity?color=ff4e85&style=for-the-badge">
<a href="https://discord.gg/kqmJjExuCf"><img alt="Discord" src="https://img.shields.io/discord/1111696966208999525?color=%2300b269&label=Discord&logo=Discord&logoColor=%23ffffff&style=for-the-badge"></a> <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&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>
</p> </p>
# Интеграция с Unity для [DragonECS](https://github.com/DCFApixels/DragonECS) # Интеграция с 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) | <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>
Расширение добавит набор инструментов для дебага и связи с движком Unity. </br>
Расширение добавит набор инструментов для отладки и связи с движком Unity.
> [!WARNING] > [!WARNING]
> Проект в стадии разработки. API может меняться. > Проект в стадии разработки. 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) - [Связь с GameObject](#связь-с-gameobject)
- [World Provider](#world-provider) - [World Provider](#world-provider)
- [FixedUpdate LateUpdate ](#fixedupdate-lateupdate) - [FixedUpdate LateUpdate ](#fixedupdate-lateupdate)
- [Документация проекта](#документация-проекта)
- [Окно настроек](#окно-настроек)
- [FAQ](#faq) - [FAQ](#faq)
</br> </br>
@ -39,10 +62,10 @@
## Окружение ## Окружение
Обязательные требования: Обязательные требования:
+ Зависимость: [DragonECS](https://github.com/DCFApixels/DragonECS) + Зависимость: [DragonECS](https://github.com/DCFApixels/DragonECS)
+ Минимальная версия C# 7.3; + Минимальная версия C# 8.0;
+ Минимальная версия Unity 2021.2.0; + Минимальная версия Unity 2021.2.0;
Протестированно: Протестировано:
+ **Unity:** Минимальная версия 2021.2.0; + **Unity:** Минимальная версия 2021.2.0;
## Установка для Unity ## Установка для Unity
@ -51,7 +74,7 @@
``` ```
https://github.com/DCFApixels/DragonECS-Unity.git https://github.com/DCFApixels/DragonECS-Unity.git
``` ```
* ### В виде иходников * ### В виде исходников
Фреймворк так же может быть добавлен в проект в виде исходников. Фреймворк так же может быть добавлен в проект в виде исходников.
</br> </br>
@ -71,17 +94,17 @@ _pipeline = EcsPipeline.New()
.BuildAndInit(); .BuildAndInit();
``` ```
## Debug Сервис ## 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# ```c#
//Ручная активация. //Ручная активация.
UnityDebugService.Activate(); UnityDebugService.Activate();
//Выведет сообщение в консоле Unity. //Выведет сообщение в консоли Unity.
EcsDebug.Print(); EcsDebug.Print();
var someMarker = new EcsProfilerMarker("SomeMarker"); var someMarker = new EcsProfilerMarker("SomeMarker");
someMarker.Begin(); someMarker.Begin();
//время выполнения этого участка будет отражено в профайлере юнити. //время выполнения этого участка будет отражено в профайлере Unity.
someMarker.End(); someMarker.End();
//Остановка игрового режима. //Остановка игрового режима.
@ -106,7 +129,7 @@ EcsDebug.Break();
----- -----
* ### `PipelineProcessMonitor` * ### `PipelineProcessMonitor`
Отображает в виде матрицы процессы и сситемы. Системы отображабтся в порядке их выполнения. Точка в пересечении системы и процесса означает что эта система является частью этого процесса. Отображает в виде матрицы процессы и системы. Системы отображаются в порядке их выполнения. Точка в пересечении системы и процесса означает что эта система является частью этого процесса.
<p align="center"> <p align="center">
<img src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/c1a7960a-d65a-4f22-9597-fd863ff2b00c"> <img src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/c1a7960a-d65a-4f22-9597-fd863ff2b00c">
@ -124,7 +147,7 @@ EcsDebug.Break();
----- -----
* ### `EntityMonitor` * ### `EntityMonitor`
Показывает состояние сущности мира. На кажду сущность в мире создается отдельынй монитор. Все мониторы сущностей помещаются в монитор мира. Показывает состояние сущности мира. На каждую сущность в мире создается отдельный монитор. Все мониторы сущностей помещаются в монитор мира.
<p align="center"> <p align="center">
<img src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/509ff472-05b5-4fd8-a0e6-739d7fa81ab1"> <img src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/509ff472-05b5-4fd8-a0e6-739d7fa81ab1">
@ -135,25 +158,25 @@ EcsDebug.Break();
</br> </br>
# Шаблоны # Шаблоны
Шаблоны - это настраиваемые наборы компонентов которые можно применить к сущностям. Шаблоны должны реализовавыть интерфейс `ITemplateNode`. Шаблоны - это настраиваемые наборы компонентов которые можно применить к сущностям. Шаблоны должны реализовывать интерфейс `ITemplateNode`.
```c# ```c#
ITemplateNode someSamplate = /*...*/; ITemplateNode someTemplate = /*...*/;
//... //...
foreach (var e in _world.Where(out Aspect a)) foreach (var e in _world.Where(out Aspect a))
{ {
// Применение шаблона сущности. // Применение шаблона сущности.
someSamplate.Apply(e, _world.id); someTemplate.Apply(e, _world.id);
} }
``` ```
```c# ```c#
// Применение шаблона сразу при создании сущности. // Применение шаблона сразу при создании сущности.
int e = _world.NewEntity(someSamplate); int e = _world.NewEntity(someTemplate);
``` ```
По умолчанию расширение содержит 2 вида шаблонов: `ScriptableEntityTemplate`, `MonoEntityTemplate`. По умолчанию расширение содержит 2 вида шаблонов: `ScriptableEntityTemplate`, `MonoEntityTemplate`.
## ScriptableEntityTemplate ## ScriptableEntityTemplate
Хранится как отдельынй ассет. Наследуется от `ScriptableObject`. Хранится как отдельный ассет. Наследуется от `ScriptableObject`.
Дейсвия чтобы создать `ScriptableEntityTemplate` ассет: Действия чтобы создать `ScriptableEntityTemplate` ассет:
<details> <details>
<summary>Создать ассет: Asset > Create > DragonECS > ScriptableEntityTemplate.</summary> <summary>Создать ассет: Asset > Create > DragonECS > ScriptableEntityTemplate.</summary>
@ -173,7 +196,7 @@ int e = _world.NewEntity(someSamplate);
----- -----
## MonoEntityTemplate ## MonoEntityTemplate
Крепится к GameObject. Наследуется от `MonoBehaviour`. Крепится к `GameObject`. Наследуется от `MonoBehaviour`.
<details> <details>
<summary>Повесить компонент: Add Component > DragonECS > MonoEntityTemplate.</summary> <summary>Повесить компонент: Add Component > DragonECS > MonoEntityTemplate.</summary>
@ -193,20 +216,22 @@ int e = _world.NewEntity(someSamplate);
----- -----
## Шаблон компонента ## Шаблон компонента
### Реализация
Чтобы компонент попал в меню `Add Component` нужно реализовать шаблон компонента. Шаблоны компонента это типы реализующие `IComponentTemplate`. Чтобы компонент попал в меню `Add Component` нужно реализовать шаблон компонента. Шаблоны компонента это типы реализующие `IComponentTemplate`.
* Упрощенная реализация: * Упрощенная реализация:
```c# ```c#
// Обязательно добавить [Serializable] к ттипу компонента // Обязательно добавить [Serializable] к типу компонента.
[Serializable] [Serializable]
struct SomeComponent : IEcsComponent { /*...*/ } struct SomeComponent : IEcsComponent { /* ... */ }
class SomeComponentTemplate : ComponentTemplate<SomeComponent> { } class SomeComponentTemplate : ComponentTemplate<SomeComponent> { }
``` ```
* Упрощенная реализация для компонентов-тегов:
```c# ```c#
// Тоже самое но для компонентов-тегов.
[Serializable] [Serializable]
struct SomeTagComponent : IEcsTagComponent { /*...*/ } struct SomeTagComponent : IEcsTagComponent { }
class SomeTagComponentTemplate : TagComponentTemplate<SomeComponent> { } class SomeTagComponentTemplate : TagComponentTemplate<SomeComponent> { }
``` ```
@ -215,7 +240,7 @@ class SomeTagComponentTemplate : TagComponentTemplate<SomeComponent> { }
```c# ```c#
[Serializable] [Serializable]
struct SomeComponent : IEcsComponent { /*...*/ } struct SomeComponent : IEcsComponent { /* ... */ }
class SomeComponentTemplate : IComponentTemplate class SomeComponentTemplate : IComponentTemplate
{ {
[SerializeField] [SerializeField]
@ -233,18 +258,24 @@ class SomeComponentTemplate : IComponentTemplate
``` ```
</details> </details>
</br>
В раскрывающемся при нажатии `Add Component` меню выбора компонента поддердивается иерархическое группирование. Производится группирование на основе мета-атрибута `[MetaGroup]`.
Компоненты в инспектрре по умолчанию отображаются окрашенными в случайный цвет сгенерированный на основе имени компонента, выбрать другой режим окраски можно в настройках фреймворка. Задать конкретный цвет можно при помощи мета-атрибута `[MetaColor]`. ### Кастомизирование отображения
В раскрывающемся при нажатии `Add Component` меню выбора компонента поддерживается иерархическое группирование. Производится группирование на основе мета-атрибута `[MetaGroup]`.
Если у компонента есть мета-атрибут `[MetaDescription]`, то рядом с крестиком удаления компонента будет иконка подсказки, при наведении курсора отобразится в виде подсказки информация из `[MetaDescription]`. Компоненты в инспекторе по умолчанию отображаются окрашенными в случайный цвет сгенерированный на основе имени компонента, выбрать другой режим окраски можно в [окне настроек](#окно-настроек) фреймворка. Задать конкретный цвет можно при помощи мета-атрибута `[MetaColor]`.
Если редактор смог автоматически определить связанный с компонентом скрипт, то слева от крестика удаления компонента будет иконка файла. Клик по иконке выделит файл скрипта в папке проекта, двойной клик откроет скрип для редактирования. Связанный файл ищется по сопоставлению имени типа и имени файла скрипта.
Если у компонента есть мета-атрибут `[MetaDescription]`, то слева от крестика удаления компонента будет иконка подсказки, при наведении курсора покажется информация из `[MetaDescription]`.
</br> </br>
При необходимости создания кастомного шаблона, шаблоны компонентов поддерживают отображение вне стандартных `MonoEntityTemplate` и `ScriptableEntityTemplate`. ### Применение шаблонов компонентов вне стандартных шаблонов сущностей
При необходимости создания пользовательского шаблона, шаблоны компонентов поддерживают отображение вне стандартных `MonoEntityTemplate` и `ScriptableEntityTemplate`.
```c# ```c#
// ComponentTemplateReference добавляет кнопку выбора доступной реализации IComponentTempalte // ComponentTemplateReference добавляет кнопку выбора доступной реализации IComponentTemplate
// и отображает шаблон компонента аналогично компонентам в MonoEntityTemplate или ScriptableEntityTemplate. // и отображает шаблон компонента аналогично компонентам в MonoEntityTemplate или ScriptableEntityTemplate.
[SerializeReference, ComponentTemplateReference] [SerializeReference, ComponentTemplateReference]
private IComponentTempalte _someComponent1; private IComponentTempalte _someComponent1;
@ -266,11 +297,11 @@ EcsEntityConnect connect = /*...*/;
entlong entity = _world.NewEntityLong(); entlong entity = _world.NewEntityLong();
// Связывание сущности с GameObject. // Связывание сущности с GameObject.
// Автоматически добавляется GameObjectConnect в сущность. // Автоматически добавляется GameObjectConnect в сущность
// Автоматическки применяются шаблоны. // и применяются шаблоны.
connect.ConnectWith(entity); connect.ConnectWith(entity);
// Или создать без применения шаблнов. // Или создать без применения шаблонов.
connect.ConnectWith(entity, false); connect.ConnectWith(entity, false);
// Отвязать. // Отвязать.
@ -296,7 +327,7 @@ connect.Disconnect();
--- ---
`AutoEntityCreator` автоматический создает сущность и связывает с GameObject. В инспекторе ему нужно указать `EcsEntityConnect` с которым связывать сущность и [Провайдер мира](#world-provider) в котормо создать сущность. `AutoEntityCreator` автоматический создает сущность и связывает с GameObject. В инспекторе ему нужно указать `EcsEntityConnect` с которым связывать сущность и [Провайдер мира](#world-provider) в котором создать сущность.
<details> <details>
<summary>Повесить компонент: Add Component > DragonECS > AutoEntityCreator.</summary> <summary>Повесить компонент: Add Component > DragonECS > AutoEntityCreator.</summary>
@ -409,6 +440,24 @@ public class EcsRoot : MonoBehaviour
</br> </br>
# Документация проекта
В интеграции так же есть окно документации проекта на основе Мета-Атрибутов. Открыть документацию: `Tools > DragonECS > Documentation`. Документация формируется при первом открытии окна и при нажатии кнопки `Update`.
<p align="center">
<img src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/f5795823-aeae-45df-8e25-db64df837513">
</p>
</br>
# Окно настроек
В окне настроек есть несколько опций, включая возможность менять режимы отображения компонентов в инспекторе. Внизу расположены удобные переключатели для используемых в фреймворке define значения для директив процессора. Открыть документацию: `Tools > DragonECS > Settings`.
<p align="center">
<img src="https://github.com/DCFApixels/DragonECS-Unity/assets/99481254/c794be8d-6884-4415-b24a-0a1a28f577a6">
</p>
</br>
# FAQ # FAQ
## Не могу повесить EcsEntityConncet или другие компоненты ## Не могу повесить EcsEntityConncet или другие компоненты
Такое может происходить после обновления пакета, решается либо через `Assets -> Reimport All` или перезапуск окна Unity с удалением папки `*project name*/Library`. Такое иногда может происходить после обновления пакета, решается либо через `Assets -> Reimport All` или перезапуск окна Unity с удалением папки `*project name*/Library`.

View File

@ -5,13 +5,35 @@
<p align="center"> <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="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"> <img alt="GitHub" src="https://img.shields.io/github/license/DCFApixels/DragonECS-Unity?color=ff4e85&style=for-the-badge">
<a href="https://discord.gg/kqmJjExuCf"><img alt="Discord" src="https://img.shields.io/discord/1111696966208999525?color=%2300b269&label=Discord&logo=Discord&logoColor=%23ffffff&style=for-the-badge"></a> <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>
</p> </p>
# Integration with Unity for [DragonECS](https://github.com/DCFApixels/DragonECS) # 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) | <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/7bc29394-46d6-44a3-bace-0a3bae65d755"></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/3c699094-f8e6-471d-a7c1-6d2e9530e721"></br>
<span>English(WIP)</span>
</a>
</td>
</tr>
</table>
</br>
The extension will add a set of tools for debugging and communicating with the Unity engine. 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 ## Environment
Requirements: Requirements:
+ Dependency: [DragonECS](https://github.com/DCFApixels/DragonECS) + 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; + Minimum version of Unity 2021.2.0;
Tested with: Tested with:

View File

@ -8,7 +8,7 @@
"displayName": "DragonECS-Unity", "displayName": "DragonECS-Unity",
"description": "Integration with Unity for DragonECS", "description": "Integration with Unity for DragonECS",
"unity": "2021.2", "unity": "2021.2",
"version": "0.4.1", "version": "0.4.3",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/DCFApixels/DragonECS-Unity.git" "url": "https://github.com/DCFApixels/DragonECS-Unity.git"

View File

@ -145,8 +145,8 @@ namespace DCFApixels.DragonECS
{ {
var unityGameObjects = _world.GetPool<GameObjectConnect>(); var unityGameObjects = _world.GetPool<GameObjectConnect>();
unityGameObjects.TryDel(oldEntityID); unityGameObjects.TryDel(oldEntityID);
_connectedEntities.Remove(GetInstanceID());
} }
_connectedEntities.Remove(GetInstanceID());
_world = null; _world = null;
_entity = entlong.NULL; _entity = entlong.NULL;
} }

View File

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Runtime.InteropServices;
using UnityEngine; using UnityEngine;
using static DCFApixels.DragonECS.IComponentTemplate; using static DCFApixels.DragonECS.IComponentTemplate;
@ -50,11 +51,14 @@ namespace DCFApixels.DragonECS
#endregion #endregion
} }
[Serializable] [Serializable]
[StructLayout(LayoutKind.Sequential)]
public abstract class ComponentTemplateBase<T> : ComponentTemplateBase public abstract class ComponentTemplateBase<T> : ComponentTemplateBase
{ {
protected static TypeMeta Meta = EcsDebugUtility.GetTypeMeta<T>(); protected static TypeMeta Meta = EcsDebugUtility.GetTypeMeta<T>();
[SerializeField] [SerializeField]
protected T component; 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 #region Properties
public sealed override Type Type { get { return typeof(T); } } public sealed override Type Type { get { return typeof(T); } }
@ -66,14 +70,8 @@ namespace DCFApixels.DragonECS
#endregion #endregion
#region Methods #region Methods
public override object GetRaw() public sealed override object GetRaw() { return component; }
{ public sealed override void SetRaw(object raw) { component = (T)raw; }
return component;
}
public override void SetRaw(object raw)
{
component = (T)raw;
}
#endregion #endregion
} }