====== 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(); }