mirror of
https://github.com/DCFApixels/DragonECS.git
synced 2025-11-12 16:45:55 +08:00
Update README-RU.md
This commit is contained in:
parent
6354d91769
commit
32c218f852
74
README-RU.md
74
README-RU.md
@ -41,6 +41,7 @@
|
||||
* [Корень ECS](#Корень-ECS)
|
||||
* [Пример для Unity](#Пример-для-Unity)
|
||||
* [Общий пример](#Общий-пример)
|
||||
* [Гибридность](#Гибридность)
|
||||
* [Debug](#Debug)
|
||||
* [Атрибуты](#Атрибуты)
|
||||
* [EcsDebug](#EcsDebug)
|
||||
@ -556,7 +557,78 @@ 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
|
||||
Фреймворк предоставляет дополнительные инструменты для отладки и логирования, не зависящие от среды.
|
||||
## Атрибуты
|
||||
|
||||
Loading…
Reference in New Issue
Block a user