Update README-RU.md

This commit is contained in:
Mikhail 2023-11-08 16:37:41 +08:00 committed by GitHub
parent 6354d91769
commit 32c218f852
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -41,6 +41,7 @@
* [Корень ECS](#Корень-ECS)
* [Пример для Unity](#Пример-для-Unity)
* [Общий пример](#Общий-пример)
* [Гибридность](#Гибридность)
* [Debug](#Debug)
* [Атрибуты](#Атрибуты)
* [EcsDebug](#EcsDebug)
@ -556,6 +557,77 @@ public class EcsRoot
}
}
```
## Гибридность
Для смешивания архитектурных подходов классического OOP и ECS используется специальный пул `EcsHybridPool<T>`. Принцип работы этого пула несколько отличается от других, он упрощает поддержу наследования и полиморфизма.
<details>
<summary>Как это работает?</summary>
При добавлении элемента в пул, пул сканирует его иерархию наследования и реализуемые интерфейсы в поиске типов у которых есть интерфес `IEcsHybridComponent` и автоматически добавляет компонент в соответсвующие этим типам пулы. Таким же образом происходит удаление. Сканирвоание просиходит не для типа T а для типа экземпляра, поэтому в примере ниже строчка в `_world.GetPool<ITransform>().Add(entity, _rigidbody);` добавляет не только в пул `EcsHybridPool<ITransform>` но и в остальные.
</details>
Пример использования:
``` csharp
public interface ITransform : IEcsHybridComponent
{
Vector3 Position { get; set; }
// ...
}
public class Transform : ITransform
{
public Vector3 Position { get; set; }
// ...
}
public class Rigidbody : ITransform
{
public Vector3 Position { get; set; }
public float Mass { get; set; }
// ...
}
public class Camera : ITransform
{
Vector3 Position { get; set; }
// ...
}
// ...
EcsWorld _world;
Rigidbody _rigidbody;
// ...
// Создадим пустую сущность.
int entity = _world.NewEmptyEntity();
// Получаем пул EcsHybridPool<ITransform> и добавляем в него для сущности компонент _rigidbody.
// Если вместо ITransform подставить Transform или Rigidbody, то результат будет одинаковый
_world.GetPool<ITransform>().Add(entity, _rigidbody);
// ...
//Все эти строчки вернут экземпляр _rigidbody.
ITransform iTransform = _world.GetPool<ITransform>().Get(entity);
Transform transform = _world.GetPool<Transform>().Get(entity);
Rigidbody rigidbody = _world.GetPool<Rigidbody>().Get(entity);
//Исключение - отсутсвует компонент. Camera не является наследником или наследуемым классом для _rigidbody.
Camera camera = _world.GetPool<Camera>().Get(entity);
//Все эти строчки вернут True.
bool isITransform = _world.GetPool<ITransform>().Has(entity);
bool isTransform = _world.GetPool<Transform>().Has(entity);
bool isRigidbody = _world.GetPool<Rigidbody>().Has(entity);
//Эта строчка вернет False.
bool isCamera = _world.GetPool<Camera>().Has(entity);
// ...
// Удалим у сущности компонент.
_world.GetPool<ITransform>().Del(entity);
// ...
//Все эти строчки вернут False.
bool isITransform = _world.GetPool<ITransform>().Has(entity);
bool isTransform = _world.GetPool<Transform>().Has(entity);
bool isRigidbody = _world.GetPool<Rigidbody>().Has(entity);
bool isCamera = _world.GetPool<Camera>().Has(entity);
// ...
```
# Debug
Фреймворк предоставляет дополнительные инструменты для отладки и логирования, не зависящие от среды.