| src | ||
| .gitattributes | ||
| .gitignore | ||
| DragonECS-AutoInjections.asmdef | ||
| DragonECS-AutoInjections.asmdef.meta | ||
| LICENSE | ||
| README.md | ||
DragonECS - Auto Injections Extension
Данное ресширение призвано скоратить объем кода, упростив инбъекцию зависимостей, делая их автоматическими.
Оглавление
Установка
Сначала убдитесь что в проекте установлен DragonECS.
-
Unity-модуль
Поддерживается установка в виде Unity-модуля в при помощи добавления git-URL в PackageManager или ручного добавления в Packages/manifest.json:
https://github.com/DCFApixels/DragonECS.git
-
В виде иходников
Фреймворк так же может быть добавлен в проект в виде исходников.
Инъекция зависимостей
Аттрибут [EcsInject] скрывает необходимость использования интерфейса IEcsInject<T>, поля помеченные таким атрибутом автоматически подхватят зависимости переданные в метод Inject.
Фабрикаа субъектов
Так же данное расширение упрощает построение субъектов, добавляя 3 сппециальных аттрибута [Inc], [Exc], [Opt]. Данные атрибуты аналогичны вызовам мтодов Include, Exclude, Optional в фабрике субъекта. Так же еще существует 2 атрибута для неявного задания ограничения [IncImplicit], [ExcImplicit], эти атрибуты в обход кеширования пула, задают ограничения длясубъекта.
Атрибуты
[Inc]-[Exc]-[Opt]-
Пример кода
class VelocitySystemDI : IEcsRunProcess
{
class Subject : EcsSubjectDI
{
[IncImplicit(typeof(PlayerTag))]
[Inc] public EcsPool<Pose> poses;
[Inc] public EcsPool<Velocity> velocities;
}
[EcsInject] EcsDefaultWorld _world;
[EcsInject] TimeService _time;
public void Run(EcsPipeline pipeline)
{
foreach (var e in _world.Where(out Subject s))
{
s.poses.Write(e).position += s.velocities.Read(e).value * _time.DeltaTime;
}
}
}
Тот же код но без AutoInjections
class VelocitySystem : IEcsRunProcess, IEcsInject<EcsDefaultWorld>, IEcsInject<TimeService>
{
class Subject : EcsSubject
{
public EcsPool<Pose> poses;
public EcsPool<Velocity> velocities;
public Subject(Builder b)
{
b.Include<PlayerTag>();
poses = b.Include<Pose>();
velocities = b.Include<Velocity>();
}
}
EcsDefaultWorld _world;
TimeService _time;
public void Inject(EcsDefaultWorld obj) => _world = obj;
public void Inject(TimeService obj) => _time = obj;
public void Run(EcsPipeline pipeline)
{
foreach (var e in _world.Where(out Subject s))
{
s.poses.Write(e).position += s.velocities.Read(e).value * _time.DeltaTime;
}
}
}
Не null инъекции
Чтобы поле помеченное [EcsInject] было проинициализированно даже в случае отстувия инъекции, в конструктор атрибута можно передать тип болванку. В примере ниже поле foo получит экземпляр класса Foo из инъекции или экземпляр FooDummy если инъекции небыло.
[EcsInject(typeof(FooDummy))] Foo foo;
Расширение так же сообщит если по заврешению предварительной инъекции, остались непроинициализированные поля с [EcsInject].