Správa Dat v Unreal Engine

Správa Dat v Unreal Engine Tagy: Vývoj aplikací
| Publikováno dne

Data v Unreal Engine - to nejsou jen data vázaná na uživatele. Pod daty si je nutné představit veškeré informace vážící se k “hernímu” designu i veškerému obsahu použitému v aplikaci.

Jestliže chceme tvořit efektivní škálovatelné systémy, snadno spravovatelné, udržovatelné a pochopitelné jak pro vývojáře, tak herní designéry, musíme rozumět možnostem principům uložení dat v Unreal Engine a jejich správě. Tento článek představí metody uložení dat v rámci mnoha struktur, včetně samotné správy dat z pohledu modifikovatelnosti, přístupnosti a filtrovatelnosti. Po přečtení by jste měli být schopni navrhovat logicky uspořádané komplexnější datové struktury, které jsou nejen efektivní z hlediska výkonu a údržby, ale rovněž předchází zanášení lidských chyb při jejich správě.

Design řízený daty

Data jako taková jsou řídícím prvkem. Jsou využívaná k nastavení aplikačních komponent, celých scén i filtrování obsahu. Abychom udržovali v systémech navázaných na data celistvost, je třeba při návrhu datové architektury aplikace uvažovat následující:

  • Zpřístupnění dat vývojářům a designerům takovým způsobem, kdy je funkce konkrétních dat v konkrétním umístění zřejmá a tedy je eliminován strach, kdy zásahem do dat dojde k narušení designu či rozbiti funkční struktury
  • Poskytnutí struktury, při které je možné na data nahlížet v souvislostech a v rámci uceleného pohledu - ideálně z jednoho místa
  • Poskytnout způsoby testování, automatizace a ověřování dat
  • Škálovatelnost systému - lze konkrétní model praktikovat i při zvyšujícím se počtem dat a assetů?
  • Správa verzí obsahu v závislosti od množství assetů a jejich změn (z anglického content versioning and management)
  • Potřeby externí reprezentace dat (na webu / dalších platformách po integraci)
  • Potřeby stahovatelného obsahu (DLC) - balíčky, patche… a především obsah, při němž je nutné řešit škálovatelnost (typicky uživatelsky generovaný obsah)
  • Bobtnání aplikace a rostoucí časy zapékání při rostoucím počtu assetů

Spojení výše popsaných vlastností lze dosáhnout návrhem vhodné struktury dat a jejich vzájemné interakce.

Držení dat v proměnných

Nejprimitivnější způsob držení dat, který existuje ve všech programovacích jazycích - C++ a Blueprint nevyjímaje. Vytvoří se proměnná určitého typu a k ní přiřadí hodnota. Proměnné mohou být základního typu (integer, float, string…), stejně jako komplexních struktur (viz tvorba struktur v Unreal Engine).

Tento typ proměnných budeme tvořit i dále, avšak v rámci strukturovanějších a komplexnějších celků.

Data Table

Data table, jak již název vypovídá, je tabulkový formát uložení dat. Daná tabulka je strukturovaná a umožňuje ukládání jak jednoduchých, tak i komplexních datových struktur. V Unreal Engine jsou tada tables reprezentovány jako UDataTable class.

Vytvoření tabulky lze provést kliknutím pravého tlačítka myši v okně Content → Miscellaneous → Data table

Vlastnosti Data table

  • Umožňuje náhled na data, jako je tomu například v Microsoft Excel. Hodnotu dat je možné editovat přímo v dané tabulce. Je to formát, kterému každý rozumí.
  • Na každý řádek Data Table lze pohlížet jako na samostatnou položku nebo záznam, stejně jako může jít o sled záznamů vážících se k 1 položce. Co je však shodné, je struktura dat každého řádku. V řeči běžných proměnných by šlo o array hodnot téže struktury.
  • Data table je single binary asset (veškerá data jsou uložena v rámci jednoho souboru). Z toho vyplývá následující:
    • Snadný import a export z JSON a CSV pouhým přetažením souboru do Unreal Engine. To je super vlastnost např. při pipeline, kdy se s daty pracuje v externím programu (např. Microsoft Excel) a do Unreal Engine jsou vkládány již “hotová” data.
    • reimportem téže souboru dochází k nahrazení (a tím přepisu) souboru stávajícího - a tedy i veškerých změn, které případně byly provedeny v dané tabulce. V případě pipeline pracující s importy dat do Data tables tedy musíme dbát na dodržení tzv. “single source of Authority” - tedy upravovat údaje vždy i ve zdrojovém souboru (např. Excel), pokud je upravíme v Data table, nebo naopak, měnit je pouze ve zdrojovém souboru (např. v Excel) a poté provést reimport .json / .csv souboru do Unreal Engine.
    • Umožňuje práci pouze jednoho uživatele, jelikož při reimportech by si jednotliví uživatelé data v tabulce přepisovali (pokud by nepracovali ze zesynchronizovaného zdrojového souboru). Řešením je použití CompositeDataTables.
  • Struktura dat je definována prostřednictvím UStruct.
    Přístup ke strukturám (např. pro designéra levelů) lze omezovat pomocí (RowType=”USTRUCT”) sloužícím k filtrování datových tabulek. Tím lze omezit vznik lidské chyby (kdy by designér používal chybnou strukturu) a tím usnadnit zadávání dat
  • Nemá podporu dědičnosti
  • Řádky v tabulce jsou přístupné pomocí RowName
  • Řádky lze jednotlivě odkazovat pomocí FDataTableRowHandle proměnné jak v Blueprint, tak i v C++
  • Na Data tables lze odkazovat s hard i soft referencemi. Nastavení referencí uvažujte s rozmyslem - chybné záznamy mají extrémní vliv na zatížení.
  • Hodnoty v Data Tables lze aktualizovat v rámci editoru (před spuštěním aplikace) i v realtime běhu
  • Podporují diffing - sledování provedených změn. Ty si zobrazíme kliknutím pravým tlačítkem myši na Data table a zvolíme možnost “Source control” → “Diff against depot”

Composite Data Tables

Composite Data Table je jednoduchá struktura, která přebírá záznamy z námi určených jednotlivých Data tables a všechny záznamy těchto tabulek slučuje do jedné nové Composite Data Table. Samotná Composite Data Table má poté shodné vlastnosti s Data Table a můžeme tak s ní i pracovat.

Composite Data Table se tvoří skrze “Miscellaneous → Composite Data Table”

Příklad použití:

Pro snazší správu dat můžeme používat několik Data Tables, kdy každá bude obsahovat data dle určité kategorie. Tím, každá tato tabulka může být i ve správě jiného designéra - designéři mohou na datech pracovat současně, kdy každý si řeší pouze Datovou Tabulku vážící se k jeho agendě.

Composite Data table poté automaticky slučuje veškeré tyto Data Tables do jedné. Kdykoli jakýkoli designér provede změnu ve své Data Table, tato změna se automaticky reflektuje v Composite Data Table. Composite Data Table pak může sloužit nejen pro náhled veškerých dat z jednoho místa, ale rovněž jako jediná tabulka, se kterou se v rámci kódu a běhu aplikace pracuje.

Vytvoření Data Table struktury

  • V C++

    • Využívá dědičnost z rodiče FTableRowBase
    • USTRUCT typ je BlueprintType
    USTRUCT(BlueprintType)
    struct StructName: public FTableRowBase
    {
        GENERATED_BODY();
     
        UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
        float t = 0.0f;
     
        UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
        int32 active = 0;
    
        UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Location")
        float x = 0.0f;
    
        UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Location")
        float y = 0.0f;
    
        UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
        FString attractor;
    
        ...
  • V Blueprint

    “Content Drawer” se zvolí “Blueprint → Structure”. V záložce “Structure” se definuje struktura, v záložce “Default values” poté defaultní hodnoty.

Vložení dat do Unreal Engine

  1. Vytvořením

    V “Content Drawer” se zvolí “Miscellaneous → Data table” a zvolí struktura dat tabulky (viz krok tvorba struktury). Poté soubor tabulky rozklikne a naplní ručně daty.

  2. Importem

    Data Table lze v Unreal Engine tvořit přetažením .json / .csv souboru do okna “All/Content” v Content Drawer. V “Import As” se zvolí “DataTable” a jako “Choose DataTable Row Type” se zvolí struktura reflektující data dané tabulky / importovaného souboru. (Struktura byla vytvořena v předchozím kroku)

Vložení dat do Unreal Engine pomocí C++

Link výše zahrnuje příklady užití C++ pro správu dat a assetů různých formátů.

Curve Tables

Curve Tables jsou tabulky obdobných vlastností jako Data Tables, nicméně slouží pro ukládání jiného typu dat, a to křivek. Pod daty křivek si můžete představit taková data, jejichž hodnota se průběžně mění - šlo by nad nimi vytvořit například liniový (čárový) graf. A právě tím jsou v Unreal Engine i reprezentována, nicméně, přistupovat lze vždy ke konkrétním hodnotám - například k hodnotě osy y na základě hodnoty osy x.

Name 1 5 10 20
Item.Damage 10 1.5 100 10
Item.ValueMultiplier 30 1.8 600 60
Item.ExúerienceNeeded 80 2.9 1200 130
Item.HealAmount 150 4.6 2400 280

Vlastnosti Curve Tables

  • Umožňují ukládání křivek - podpora křivek typu “Linear”, “Constant” a “Cubic
  • Podporují ruční vytvoření, stejně jako na zákaldě importu z .json / .csv souboru
  • Jsou ukládány stejně jako Data Tables ve formě single binary file, z čeho vychází i jejich vlastnosti napojení v rámci vývojové pipeline
  • Podporují Combined Curves Data Table (ekvivalent Combined Data Table)
  • Mají Curve Data Table Row Handle type (ekvivalent Data Table Row handle Type)
  • Unreal Engine je schopen navrhovat další data na základě interpolace
  • Curve Table fungují velmi dobře i s typem FScalableFloat (scalable floats) - jsou tedy velmi vhodné pro hodnoty, které v čase mění svůj “scale” (koeficient / měřítko)

FScalableFloat (Scalable Floats)

Jde o datový typ, který:

  • Umožňuje kombinaci hodnoty typu float a záznamů řádku v Data Curve. Tato vlastnost umožňuje měnit výstupní parametry Data Curve na základě hodnoty float (součinitel). Ten lze nastavovat prostřednictvím slideru.
  • Je spojen s okamžitým náhledem výstupních hodnot - uživatel po změně součinitele ihned vidí nové hodnoty křivky
  • Jde o část GameplayAbilities modulu

Tvořit je lze přímo v UI - pravé tlačítko myši → “Miscellaneous” → “Curve Table” - specify type

Blueprint Asset (raw UObjects)

Jde o alternativu k Data Tables, často jsou nazývány rovněž raw UObjects. Jde o Blueprint class s dědičností od UObject, tu se však zde nesnažíme napodobovat - namísto toho, chceme pracovat s výchozími hodnotami.

O UObject lze uvažovat jako o ekvivalentu řádků v Data table - každý UObject je zde jedním řádkem (tedy 1 položkou). Přesto UObject má všechny výhody DataTable z hlediska pohledu na více „řádků“ dat současně, avšak je třeba počítat s určitými omezeními vycházející z zprostředkování skrze property matrix.

Blueprint Asset má následující vlastnosti:

  • Jde o individuální asset, který uchovává data. Je “zapečen” a vyžaduje paměť. Vysoký počet UObjects může zvýšit “baking” a načítací časy
  • Nastavování nových Blueprint assetů je časově náročnější a pro nové uživatele může být složitější na pochopení oproti data tables. Především pak při využívání soft referencí.
  • Velmi výkonný, dokonce i v čistých Blueprint projektech
  • Může být instancí nebo být použita k uchovávání dat
  • Podporuje dědičnost, což je užitečné z pohledu přepisu individuálních hodnot. Obdobným příkladem, kde je této vlastnosti hojně využíváno, jsou instance materiálů. Pokud změníme základní rodičovskou třídu, změna je replikována dolů do dětské třídy. Přesně to samé lze dělat právě v rámci struktury při dědičnosti v UObject.
  • Na rozdíl od Data Tables:
    • nativně nepodporují import/export externích dat skrze .json / .csv formát - tuto funkcionalitu je nutné vlastnoručně doplnit, je-li vyžadována
    • Podporují Instanced Properties

Vytvoření Blueprint Asset:

V Content Drawer klikneme pravým tlačítkem myši a zvolíme možnost “Blueprints” → “Blueprint Class”. Poté v rámci Search All classes najdeme “UObject”, z kterého budeme inherovat (dědit).

Novou Blueprint class s dědictvím od “UObject” pojmenujeme a přidáme proměnné pro hodnoty, které potřebujeme k dané class přiřadit.

Jestliže tuto strukturu budeme používat jako například skladovou strukturu - tuto class můžeme použít k vytvoření podřízených class, které budou držet vždy individuální položku skladu (položka 1, položka 2 …). K těm poté přiřadíme data.

Právě základní class, ze které odvozujeme položky skladu, přitom nebudeme chtít v rámci Unreal Engine editoru ukazovat, abychom předešli situaci, kdy ji my nebo některý z designérů omylem použije. To zařídíme zaškrtnutím boxu “Generate Abstract Class” v “Details” okně dané class, čímž předejdeme jejímu zobrazování v menu nabídkách.

Blueprint asset lze následně nastavit jako typ proměnné v rámci jakéhokoliv Actoru, a to v rámci libovolné reference (Hard i Soft). Pokud použijeme soft referenci, musíme mít na paměti, že v momentě, kdy je načten náš actor, data proměnné nebudou automaticky načtena v rámci soft reference - dané načtení je nutné zařídit prostřednictvím funkce, respektive úkonu “getClassDefaults()”.

Hromadný náhled na Blueprint assets data

Výše jsem zmínil, že na Blueprint Assets lze pohlížet jako na jednotlivé řádky Data Tables. Přitom je lze prostřednictvím Bulk Property matrix zobrazit i v tabulc, čímž je možné nahlížet na data vybraných Blueprint Assets současně. To se provede tak, že označíme všechny Blueprint Assets, jejichž data nás zajímají, poté klikneme pravým tlačítkem myši a zvolíme “Asset Actions” → “Bulk Edit via Property Matrix”. V rámci okna “Display” lze pak volit, které proměnné mají být zobrazeny. Dále jsou dostupné funkce pro seřazení dat, hromadný update hodnot apod.

Data Assets

  • Data assets fungují obdobně jako Blueprint Assets, ovšem jde o účelově vytvořená datová aktiva obsahující statická data uložená přímo na disku, kde jsou rovněž zapálená (baked).
  • Načítána jsou na základě požadavku
  • Podporují dědičnost, avšak jen na úrovni class a už ne na úrovni instance, jak tomu bylo u Blueprint Assets. Jinými slovy, podpora instancí v tomto případě umožňuje přidávat extra proměnné a funkce jen na úrovni konkrétní Data Asset class a nikoliv na úrovni instance.
  • Vyžadují minimální množství C++ kódu k dědění z UDataAsset. Rovněž fungují s Blueprint rodičem, avšak toto použití se nedoporučuje.
  • V rámci C++ umožňují přidávat funkce, avšak neumožňují přepisovat defaultní funkce třídy. Tedy lze použít jen tehdy, pokud přepis výchozí funkcionality této class není vyžadován.
  • Díky “zeštíhlenému” rozhraní a omezenosti funkcí mohou být “transparentnější” a jasnější jak pro vývojáře, tak designéry. Designéři je dále milují, protože mohou změnit jejich hodnoty i v průběhu hraní, kdy hodnoty jsou okamžitě reflektovány do hry. To je super užitečné, když se snažíte najít správnou hodnotu pro něco.
  • Podporují diffing (sledování změn) - ty si zobrazíme kliknutím pravým tlačítkem na vybraný “Data Asset” (bez ohledu zda jde o C++ nebo Blueprint typ) v Content Drawer okně a zvolíme možnost “Source Control” → “Diff Against Depot”. V nově otevřeném okně máme poté přehledný přehled změn, mezi nimiž můžeme prostřednictvím okna vlevo přepínat.
  • Pomocí widgetů editoru lze vytvářet různé pohledy na Data Assets
  • Na rozdíl od Data Tables:
    • nativně nepodporují import/export externích dat skrze .json / .csv formát - tuto funkcionalitu je nutné vlastnoručně doplnit, je-li vyžadována
    • Podporují Instanced Properties

Vytvoření Data Asset

“Add C++ class”, kdy v seznamu “Common Classes” najdeme položku “DataAsset”, od níž budeme dědit naši novou Data Asset class. Po jejím otevření v editoru kódů můžeme přidat proměnnou, například ItemData typu FInventoryItem, kdy FInventoryItem je námi vytvořená struktura dle postupu v bodě “Vytvoření data table struktury”. Tuto strukturu nemusíme používat jen pro definici tabulky, ale v případě jakéhokoliv typu proměnné.

UCLASS(BlueprintType)
class DATAINUNERAL_API UInventoryItemAsset : public UDataAsset
{
  GENERATED_BODY()

public:
  UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Item")
  FInventoryItem ItemData;
}

Tuto námi vytvořenou DataAsset nalezneme díky použití UClass(BlueprintType) rovnež v nabídce “Miscellaneous” → “Data Asset”, v níž ji můžeme zvolit a vytvořit na jejím základě Blueprint Data Asset. Ten můžeme vyplnit hodnotami obdobně jako v případě Blueprint Asset. Obdobný je i princip, stejně jako u Blueprint Asset, i na Data Asset lze v kontextu Data table pohlížet jako na řádek tabulky, tedy individuální asset.

Na náš ObjectType: Data Asset opět můžeme odkazovat libovolnou referencí z libovolného Actoru. Přemýšlejte o tom jako o getDefaultOnly() z Blueprint Asset typu, avšak pamatujte, že zde míříme spíše na data zapsaná na disku.

Přístup k datům v Data Assets

Pokud bychom používali instanci, mohli bychom na data odkazovat přímo. Jestliže používáme propojení s ObejctType: Data Asset skrze soft referenci (abychom se vyhnuli automatickému načítání tohoto assetu), musíme nejdříve opět danou třídu nejdříve inicializovat. Výhodou je, že tato možnost umožňuje prostřednictvím kódu nahlédnout na seznam všech data assets. Rovnež se není potřeba starat o abstraktní třídy.

Blueprint kód výše lze zjednodušit definováním nových funkcí pro návrat tížených hodnot v námi používané a vytvořené C++ class.

UCLASS(BlueprintType)
class DATAINUNERAL_API UInventoryItemAsset : public UDataAsset
{
  GENERATED_BODY()

private:
  UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Item")
  FInventoryItem ItemData;

public:
  UFUNCTION(BlueprintCallable, BlueprintPure)
  FText GetItemName();
  UFUNCTION(BlueprintCallable, BlueprintPure)
  TSoftObjectPtr<UTexture2D> GetItemIcon();
  UFUNCTION(BlueprintCallable, BlueprintPure)
  int32 GetItemCost();
}

Tyto funkce lze následně používat v BluePrint

Gameplay Tags

Prostřednictvím GamePlay tags lze přiřazovat (označovat) jednoltivé objekty pod určité globálně předdefinované tagy.

  • Jde o FName typ s globálním předdefinováním - dostupné pro kterýkoli objekt
  • Umožňují snadný výběr uvnitř uživatelského rozhraní editoru
  • Používáním předdefinovaných tagů se předchází lidským chybám
  • Je možné je používat i v rámci kontejnerů - kdy Gameplay tag je kontejnerem obsahujícím poddružené tagy
  • Mají vlastní hierarchii, takže můžeme najít vztahy mezi tagy - například spojení s nadřazenými tagy prostřednictvím dotazu. IsChildOf(), kterým zjistíme, zda se jedná o potomek, nebo ne. Popř “.HasTag()” - je daný tag obsahem konkrétního kontejneru?
  • Jsou podporovány v prohlížeči referencí - příkladem využití je, že tímto způsobem lze například vizuálně zjistit všechny instance a objekty v našem projektu, které mají konkrétní FTag
  • Podporují přesměrovače pro přejmenování - pokud se provedou změny, nedojde k porušení sestavení
  • Lze je zapéct do indexových ID pro replikaci – takže mohou být výkonově efektivní

Přidání Gameplay tagů do projektu

Nastavení GamePlay tagů nalezneme v okně “Project Settings → Gameplay tags”.

První možností přidání nového tagu je použití tlačítka “+” v sekci GamePlay Tags List, načež se otevře box přidání tagu (Název, koment, zdroj), viz screenshot výše.

Druhou možností je vytvoření tabulky tagů (pravé tlačítko myši v Content Drawer → “Miscellaneous” → “Data Table”) se strukturou (Row structure = GameplayTagTableRow). Tuto tabulku je poté možné přidat do Gameplay tags nastavení projektu, jmenovitě do sekce “Gameplay Tag Table List”.

Přidání možnosti volby tagu u Actoru

Jednoduše vytvoříme novou proměnnou “GameplayTag” typu “GamePlay Tag”, prostřednictvím níž následně budeme moci vybírat ze seznamu herních tagů.

Asset Registry

Asset Registry data jsou jakýmisi metadaty, které vidíme, když najedeme na náhled konkrétního Actoru či Assetu. Přitom, jejich funkce je více než jen vizuální, soužící k zobrazení tooltipů a nezbytných informací bez potřeby načtení samotného souboru - lze na jejich základě například filtrovat - jak v editoru, tak play módu.

  • Lze se na ně dotazovat bez načtení souboru do mezipaměti
  • V Content Drawer, lze na jejich základě vyhledávat soubory. Stejně tak lze na základě určitých metadat vyhledávat assety jak v editor tak play módu - lze je využívat k načítání a filtrování dat - například jen map pro 8 a více lidí.
  • Lze je k assetům snadno přidávat prostřednictvím UPROPERTY “AssetRegisterySearchable”
  • Na Asset registry data jde nahlížet jak v Asset Audit okně, tak i uceleně přímo v Content Drawer okně (např. při zobrazení typu Columns)
  • Je užitečný pro stahovatelný obsah (DLC) – například dotazování na balíček položek, který byl stažen
  • Registr aktiv je v editoru asynchronní, nicméně je synchronní v sestavení aplikace

Příklady filtrace v Asset Registry v Content Drawer:

  • Číselné typy: ItemCost >= 100; ItemCost == 100 …
  • Boolean type: IsInCategoryX == true; IsInCategoryX == false…

Tyto příklady jsou funkční díky specifikaci “AssetRegistrySearchable” v URegistryAsset a funguje tam, kde dává smysl přímá konverze do tagů formátu “AssetRegistry”.

Jestliže bychom chtěli vyhledávat i na základě tagů, můžeme to zajistit přidáním tížené funkcionality skrze override funkce GetAssetRegistryTags. Je nutné přitom zahrnout volání rodičovské funkce k zachycení nadřazené funkce. Poté můžeme přidat libovolný tag do registrace vyhledávání.

#include "DataAssets/ComplexInventoryItem.h"

void UComplexInventoryItem::GetAssetRegistryTags(TArray& OutTags) const override
{
	Super::GetAssetRegistryTags(OutTags);
	
	// Alfanumerický tag
	OutTags.Add(FAssetRegistryTag(
		"ItemName",
		ItemData.ItemName.ToString(),
		FAssetRegistryTag::TT_Alphabetical
	));

	OutTags.Add(FAssetRegistryTag(
		"CanStack",
		ItemData.CanStack? "true" : "false",
		FAssetRegistryTag::TT_Alphabetical
	));

	// Numerický tag - (použitelný i pro řazení)
	OutTags.Add(FAssetRegistryTag(
		"ItemCost",
		FString::SanitizeFloat(ItemData.ItemCost),
		FAssetRegistryTag::TT_Numerical
	));
}

Do Asset registry můžeme přistupovat skrze referenci (nodeGetAssetRegistry() v Blueprint), a na základě tohoto náhledu přistupovat k metadatům jakéhokoli assetu (spadajícího např pod určitou class), aniž bychom jej museli načíst.

V momentě, kdy máme přístup k metadatům, můžeme již snadno například porovnávat assety vůči určitému gameplay tagu.

Náhled na Asset registry data

Na Asset registry data je možné nahlížet přímo v Content Drawer okně. Formát zobrazení lze upravovat v nastavení zobrazení (view type → Tiles / List / Columns). Vedle klasického formátu je možné používat např. Opět tabulkový.

Kombinace forem uložení dat

Každý způsob ukládání je určen pro určitý typ dat i funkcionality - má své výhody i nevýhody. Nelze se naučit metodu jednu využívat ji všude - při takovém způsobu se brzy dojde do komplikované nepřehledné struktury, v níž se po čase nevyzná ani sám tvůrce.

Projděte si tedy zde popsané metody důkladně a při tvorbě struktury přemýšlejte, zda právě ta používaná je dostatečně funkční a přehledná.

Další nástroje, o kterých byste měli vědět

  • UPROPERTY Meta tagy umožňují mnoho super věcí v Detail okně
  • Úprava zobrazení panelů jde provádět i skrze Detail Panel Customization a Editor pluginy (IDetailCustomization class)
  • Unreal Engine nabízí Data Validation Plugin