Следующая версия | Предыдущая версия |
ru:toolworks:docs:apparatus:trait [2021/06/14 18:56] – создано + переведено jispar | ru:toolworks:docs:apparatus:trait [2022/06/07 10:53] (текущий) – обновил в соответствии с англоязычной версией jispar |
---|
====== Трейты ====== | ====== Трейты (Traits) ====== |
| |
Трейты - низкоуровневые блоки данных (компоненты) в составе сущностей. В отличие от [[ru:toolworks:docs:apparatus:detail|деталей]], трейты являются простыми UStruct данными. Плагином они управляются вручную кэш-эффективным способом и главным образом направлены на runtime-производительность. | Трейты - низкоуровневые блоки данных (компоненты) в составе сущностей. В отличие от [[ru:toolworks:docs:apparatus:detail|деталей]], трейты являются простыми UStruct данными. Плагином они управляются вручную кэш-эффективным способом и главным образом направлены на runtime-производительность. |
| |
| ===== Изменение трейтов ===== |
| |
| Трейт - это то, что в других языках программирования называется value-type. Способ работы с ним достаточно родной для UE. Он заключается в том, что для изменения данных трейта, сперва надо его прочитать, изменить, затем записать обратно, применяя изменения к сущности. Эта процедура необходима для атомарного выполнения и безопасности. Не пугайтесь этой рутины копирования, потому что такая процедура - ещё один шанс для программы подвергнуться значительным улучшениям производительности вследствие локальности данных. |
| |
| ===== Заметки о Garbage Collection ===== |
| |
| Как было сказано ранее Аппарат использует свою низко-уровневую модель для эффективного хранения трейтов. Игра стоит свечей. Иными словами, вы должны сами гарантировать безопасность обращения к другим UObject-ам (Actor-ам, их компонентам и т.д.) в своих трейтах, потому что такие указатели должны быть подсчитаны Garbage Collector-ом, который отсутствует. |
| |
| К счастью, вы можете легко достичь этой безопасности тем, что будете ссылаться на те же объекты, что и трейты, в каких-нибудь других ассетах или объектах, или (второй вариант) будете использовать глобальный GC-управляемый инстанс UObject-а, - в обоих случаях GC не удалит объекты, на которые ссылаются трейты. Эта глобальная инстанция также может быть [[ue>API/Runtime/CoreUObject/UObject/UObjectBaseUtility/AddToRoot/|добавлена в корень (added to root)]], чтобы не стать собранной коллектором. Вы можете также добавить объекты, на которые ссылаетесь в своих трейтах, к корню, чтобы достичь того же результата. |
| |
| Ссылки на остальные сущности (Subjects) через хэндлеры (Subject Handles) - прекрасное решение, поскольку управляются самим плагином. Просто запомните, что эти хэндлеры - как слабые ссылки (weak references). Они не поддерживают ссылаемую сущность, просто становятся невалидными, когда сущность была удалена. |
| |
===== Создание трейтов ===== | ===== Создание трейтов ===== |
| |
Все Unreal структуры типа UStruct должны быть доступными в Apparatus'е автоматически. Если вы не можете найти свою структуру в списке трейтов, дважды кликните на неё в Content-браузере, чтобы она загрузилась. В целом вы должны сделать это только один раз, потому что она будет загружена автоматически, если где-либо есть на неё ссылки. | Все Unreal структуры типа UStruct должны быть доступными в Аппарате автоматически. Если вы не можете найти свою структуру в списке структур, дважды кликните на неё в Content-браузере, чтобы она загрузилась. В целом вы должны сделать это только один раз, потому что она будет загружена автоматически, если где-либо есть на неё ссылки. |
| |
==== Организация в C++ ==== | ==== Организация в C++ ==== |
Вы, главным образом, обращайтесь к официальному Unreal Engine мануалу по созданию [[ue>ProgrammingAndScripting/GameplayArchitecture/Structs/UsingStructs|UStruct]]-ов. | Вы, главным образом, обращайтесь к официальному Unreal Engine мануалу по созданию [[ue>ProgrammingAndScripting/GameplayArchitecture/Structs/UsingStructs|UStruct]]-ов. |
| |
По существу, вы создаёте хеадер (.h) файл и (опциально) файл-ресурс (.cpp). Пример трейта, объявленного с помощью только заголовочного файла:<code cpp> | По существу, вы создаёте хеадер (''.h'') файл и (опциально) файл-ресурс (''.cpp''). Пример трейта, объявленного с помощью только заголовочного файла:<code cpp> |
// Fill out your copyright notice in the Description page of Project Settings. | |
#pragma once | #pragma once |
| |
#include "CoreMinimal.h" | #include "CoreMinimal.h" |
#include "MyTrait.generated.h" | #include "Moving.generated.h" |
| |
/** | /** |
* | * Состояние перемещения с определённой скоростью. |
*/ | */ |
USTRUCT(BlueprintType) | USTRUCT(BlueprintType) |
struct MY_API FMyTrait | struct MY_API FMoving |
{ | { |
GENERATED_BODY() | GENERATED_BODY() |
</code> | </code> |
| |
Вы можете опустить спецификации UPROPERTY, но с указанными ключевыми словами у вас появляется возможность использовать ''MyTrait'' как в C++ коде, так и в блупринтах. | Вы можете опустить спецификации [[ue>ProgrammingAndScripting/GameplayArchitecture/Properties|UPROPERTY]], но с указанными ключевыми словами у вас появляется возможность использовать ''FMoving'' как в C++ коде, так и в блупринтах. |
| |
| ==== Организация в Blueprint ==== |
| |
| Поскольку каждый ''USTRUCT'' в Unreal Engine является трейтом, то создать новый можно просто через Редактор. Нажмите правой кнопкой мыши на пустое место в Content Browser и выберете **Blueprints** → **Structure**. |
| |
==== Пара слов о Garbage Collection ==== | {{ :en:toolworks:docs:apparatus:ue-create-bp-struct.png?nolink |}} |
| |
Как уже упоминалось раньше, Apparatus использует свою собственную низкоуровневую модель памяти, чтобы хранить трейты эффективно. Это достигается некоторой ценой. Вам приходится вручную гарантировать безопасность ссылок на другие U-Объекты (на Actor-ы, Component-ты и т.д.) внутри своих трейтов, потому что последние должны были бы быть подсчитаны сборщиком мусора, который в рассматриваемом контексте недействителен. | Это создаст новый файл-ассет внутри выбранной папки. Вам, скорее всего, потребуется дать ему соответствующее имя после этого. |
| |
К счастью, вы можете сделать это достаточно просто при помощи ссылок на эти же объекты в определённых ассетах или объектах через некоторый GC-зависимый инстанциированный UObject, тем самым задерживая объекты в памяти. Эта глобальная инстанция также может быть [[ue>API/Runtime/CoreUObject/UObject/UObjectBaseUtility/AddToRoot/|добавлена в корень (added to root)]], чтобы не стать собранной коллектором. Вы можете также добавить объекты, на которые ссылаетесь в своих трейтах, к корню, чтобы достичь того же результата. | {{ :en:toolworks:docs:apparatus:ue-name-bp-struct.png?nolink |}} |
| |
Ссылки на остальные сущности (Subjects) через хэндлеры (Subject Handles) - прекрасное решение, поскольку управляются самим плагином. Просто запомните, что эти хэндлеры - как слабые ссылки (Handles are like weak references). Они не поддерживают ссылаемую сущность, просто становятся невалидными, когда сущность была уничтожена (удалена). | На этом всё. Созданную структуру можно использовать в своих фильтрах [[ru:toolworks:docs:apparatus:filter|Filters]]. |