An open API service indexing awesome lists of open source software.

https://github.com/dcfapixels/dragonecs-hybrid


https://github.com/dcfapixels/dragonecs-hybrid

Last synced: 3 months ago
JSON representation

Awesome Lists containing this project

README

        




Version
License
Discord
QQ

# DragonECS-Hybrid

`IEcsHybridComponent` - Гибридные компоненты. Используются для реализации гибридности.

`EcsHybridPool` - пул для гибридных компонентов. Используются для реализации гибридности, хранит class-компоненты `IEcsHybridComponent`;

Для смешивания архитектурных подходов классического OOP и ECS используется специальный пул `EcsHybridPool`. Принцип работы этого пула несколько от других и он добавляет поддержу наследования и полиморфизма в компоненты.

Как это работает?

При добавлении элемента в пул, пул сканирует его иерархию наследования и реализуемые интерфейсы в поиске типов у которых есть интерфейс `IEcsHybridComponent` и автоматически добавляет компонент в соответствующие этим типам пулы. Таким же образом происходит удаление. Сканирование происходит не для типа T а для типа экземпляра, поэтому в примере ниже строчка в `_world.GetPool().Add(entity, _rigidbody);` добавляет не только в пул `EcsHybridPool` но и в остальные.

Пример использования:
``` csharp
public interface ITransform : IEcsHybridComponent
{
Vector3 Position { get; set; }
// ...
}
public class Transform : ITransform
{
public Vector3 Position { get; set; }
// ...
}
public class Rigidbody : Transform
{
public Vector3 Position { get; set; }
public float Mass { get; set; }
// ...
}
public class Camera : ITransform
{
Vector3 Position { get; set; }
// ...
}
public TransformAspect : EcsAspect
{
public EcsHybridPool transforms;
public Aspect(Builder b)
{
transforms = b.Include();
}
}
// ...

EcsWorld _world;
Rigidbody _rigidbody;
// ...

// Создадим пустую сущность.
int entity = _world.NewEmptyEntity();
// Получаем пул EcsHybridPool и добавляем в него для сущности компонент _rigidbody.
// Если вместо ITransform подставить Transform или Rigidbody, то результат будет одинаковый
_world.GetPool().Add(entity, _rigidbody);
// ...

//Все эти строчки вернут экземпляр _rigidbody.
ITransform iTransform = _world.GetPool().Get(entity);
Transform transform = _world.GetPool().Get(entity);
Rigidbody rigidbody = _world.GetPool().Get(entity);
//Исключение - отсутствует компонент. Camera не является наследником или наследуемым классом для _rigidbody.
Camera camera = _world.GetPool().Get(entity);

//Вернет True. Поэтому фишка гибридных пулов будет работать и в запросах сущностей
bool isMatches = _world.GetAspect().IsMatches(entity);

//Все эти строчки вернут True.
bool isITransform = _world.GetPool().Has(entity);
bool isTransform = _world.GetPool().Has(entity);
bool isRigidbody = _world.GetPool().Has(entity);
//Эта строчка вернет False.
bool isCamera = _world.GetPool().Has(entity);
// ...

// Удалим у сущности компонент.
_world.GetPool().Del(entity);
// ...
//Все эти строчки вернут False.
bool isITransform = _world.GetPool().Has(entity);
bool isTransform = _world.GetPool().Has(entity);
bool isRigidbody = _world.GetPool().Has(entity);
bool isCamera = _world.GetPool().Has(entity);
// ...
```