ru:toolworks:docs:apparatus:trait

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
ru:toolworks:docs:apparatus:trait [2021/10/19 09:49] vladiusru:toolworks:docs:apparatus:trait [2022/06/07 10:53] (текущий) – обновил в соответствии с англоязычной версией jispar
Строка 1: Строка 1:
-====== Черты (Traits) ======+====== Трейты (Traits) ======
  
-Черты - низкоуровневые блоки данных (компоненты) в составе сущностей. В отличие от [[ru:toolworks:docs:apparatus:detail|деталей]], черты являются простыми UStruct данными. Плагином они управляются вручную кэш-эффективным способом и главным образом направлены на runtime-производительность.+Трейты - низкоуровневые блоки данных (компоненты) в составе сущностей. В отличие от [[ru:toolworks:docs:apparatus:detail|деталей]], трейты являются простыми UStruct данными. Плагином они управляются вручную кэш-эффективным способом и главным образом направлены на runtime-производительность.
  
-===== Создание черт =====+===== Изменение трейтов =====
  
-Все Unreal структуры типа UStruct должны быть доступными в Apparatus'е автоматически. Если вы не можете найти свою структуру в списке черт, дважды кликните на неё в Content-браузере, чтобы она загрузилась. В целом вы должны сделать это только один раз, потому что она будет загружена автоматически, если где-либо есть на неё ссылки.+Трейт - это то, что в других языках программирования называется 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 должны быть доступными в Аппарате автоматически. Если вы не можете найти свою структуру в списке структур, дважды кликните на неё в Content-браузере, чтобы она загрузилась. В целом вы должны сделать это только один раз, потому что она будет загружена автоматически, если где-либо есть на неё ссылки.
  
 ==== Организация в C++ ==== ==== Организация в C++ ====
Строка 11: Строка 23:
 Вы, главным образом, обращайтесь к официальному 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()
Строка 37: Строка 47:
 </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]].
  • ru/toolworks/docs/apparatus/trait.1634626141.txt.gz
  • Последнее изменение: 2021/10/19 09:49
  • vladius