====== Subjects. Низко-уровневые Сущности. ======
//Subjects// - основополагающие легковесные сущности, управляемые Аппаратом. Главным образом, они UE-независимы и состоят из
[[ru:toolworks:docs:apparatus:trait|трейтов]] и [[ru:toolworks:docs:apparatus:flagmark|флажков]].
====== Хэндлеры сущностей ======
Сущности не используются напрямую и их внутреннее устройство спрятано от пользователя плагина. Вместо этого предлагается специальный концепт //Subject Handle//. В терминах Unreal-а хэндлеры похожи на [[ue>ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/SmartPointerLibrary/WeakPointer|слабые указатели (weak pointer)]]. Когда вы деспавните сущность, то все указывающие на неё хэндлеры автоматически становятся невалидными. Реализация этого подхода использует generation-based /* TODO: перевести это нормально */ технику подсчёта ссылок.
====== Уровень сущностных объектов ======
У сущности может быть дополнительная высоко-уровневая надстройка, которая называется [[ru:toolworks:docs:apparatus:subjective|Subjective или сущностный объект]]. Сущностные объекты - это UE-управляемые UObject-ы, которые могут содержать [[en:toolworks:docs:apparatus:detail|детали]]. Сущностные объекты с деталями, вообще говоря, предоставляют большую гибкость и имеют дополнительные особенности по сравнению с простыми сущностями и трейтами. Эта функциональность достигается за счёт потенциального уменьшения производительности и отсутствия поддержки кэша. Пожалуйста, обратите внимание, что Сущностные объекты - это опциальная фича Аппарата, и что вы можете реализовать логику своего проекта полностью на сущностях, если хотите.
Сущности без надстройки сущностного объекта над ними называются костяными (//barebone//) сущностями. Оба типа - сущности с объектом типа сущностный (Subjective-based Subjects) и костяные сущности (barebone Subjects) - можно называть просто сущностями - //Subjects//.
Это потому что каждый сущностный объект имеет в себе встроенную сущность и использует её как естественную свою часть. Выражаясь простым языком: Subjectives are Subjects. Это что-то наподобие наследственной связи, поэтому каждый сущностный объект может иметь трейты и флаги как часть своей программной структуры.
====== Спавн (Spawning) ======
//Spawning// (или спавн) - это процесс создания сущности как часть механизма.
===== Организация в C++ =====
Чтобы заспавнить новую сущность внутри Механизма, вам потребуется вызвать один из методов
[[appi>class_a_mechanism.html#a6a4cad7d03e86cc6c32b0bb27780a71d|SpawnSubject]]. Самый простой вариант это сделать:
FSubjectHandle Subject = Machine::SpawnSubject();
Если хотите, то можете спавнить сущности, указывая трейты, которые будут в неё установлены, и для этого вам потребуется специальный шаблонный метод с тем же названием:
FBurning Burning{10, 15.5f};
FSword Sword{2};
FSubjectHandle BurningSword = Machine::SpawnSubject(Burning, Sword);
Данный отрывок кода эффективно выделит память под слот для сущности в нужном чанке и проинициализирует его в соответствии с переданными трейтами.
===== Организация в Blueprint-ах =====
Спавн сущностей из блупринтов выполняется через выделенную Spawn Subject ноду:
{{:en:toolworks:docs:apparatus:spawn-subject-node.png?nolink|Spawn Subject Node}}
Вы также можете определить начальный набор [[ru:toolworks:docs:apparatus:flagmark|флажков]] через соответствующий аргумент.
====== Деспавн ======
Процесс //despawn//-а является прямой противоположностью процессу спавна и он означает удаление сущности. Удаление уже удалённого (или невалидного) хэндлера - легальная операция, которая ничего не делает и не вызывает ошибок.
===== Организация C++ =====
Чтобы удалить сущность в своём C++ коде, используйте [[appi>struct_f_subject_handle.html#ada8e65dcf50ee385748d6de603ccd4e4|Despawn]]
метод, предоставляемый хэндлером. Это можно делать так:
void PickPowerup(FSubjectHandle Player, FSubjectHandle Powerup)
{
// Добавление силы/скорости/жизней игроку.
...
// Удаление предмета из мира:
Powerup.Despawn();
}