https://github.com/dcfapixels/dragonecs-hybrid
https://github.com/dcfapixels/dragonecs-hybrid
Last synced: 3 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/dcfapixels/dragonecs-hybrid
- Owner: DCFApixels
- License: mit
- Created: 2024-02-24T17:10:25.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-03-19T08:35:23.000Z (3 months ago)
- Last Synced: 2025-03-19T09:31:50.274Z (3 months ago)
- Language: C#
- Homepage:
- Size: 60.5 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README-RU.md
- License: LICENSE.md
Awesome Lists containing this project
README
![]()
# 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);
// ...
```