Systém reflexe v Unreal Engine: jak pracuje s typy za běhu
Unreal Engine používá vlastní systém reflexe pro přístup k informacím o typech během běhu. To umožňuje motoru serializovat objekty, zobrazovat vlastnosti v editoru, integrovat C++ s Blueprint a spravovat síťovou interakci. Systém je postaven na generování kódu přes Unreal Header Tool a dvou paralelních hierarchiích typů.
Architektura reflexe: UHT a generované soubory
Unreal Header Tool analyzuje hlavičkové soubory C++, najde makra jako UCLASS a UPROPERTY, a generuje kód pro registraci typů. Tento proces vytváří dva soubory:
- .generated.h — obsahuje makra a forward declarations.
- .gen.cpp — zahrnuje kód registrace typů, který může dosáhnout tisíců řádků.
Generovaný kód ukládá metadata, jako jsou názvy vlastností, flagy a posuny v paměti. Například pro vlastnost CurrentValue ve struktuře FAbilityAttribute je registrován její posun přes STRUCT_OFFSET, což umožňuje motoru přímo přistupovat k datům během běhu.
Dvě hierarchie typů: UObject a FField
V UE5 existují dva systémy pro popis typů, oddělené pro optimalizaci výkonu.
UObject-based hierarchie
Tato hierarchie je spravována garbage collector a zahrnuje:
- UClass pro třídy C++.
- UFunction pro funkce.
- UScriptStruct pro struktury.
- UEnum pro výčty.
FField-based hierarchie
Zavedena v UE 4.25 pro snížení režie, vlastnosti zde nejsou součástí garbage collection:
- FField — základní třída.
- FProperty — popisuje jednotlivé vlastnosti, jako FIntProperty nebo FFloatProperty.
- Vztah mezi hierarchiemi: UStruct obsahuje ukazatel na linked list vlastností FField.
Klíčové vlastnosti FField:
- Používá linked list pro ukládání podřízených prvků.
- Zahrnuje FFieldClass se systémem rychlého přetypování přes bitové masky.
- FFieldVariant spojuje ukazatele na UObject a FField, využívající nejnižší bit pro rozlišení typů.
Anatomie FProperty: přístup k datům
FProperty poskytuje mechanismy pro práci s vlastnostmi v paměti. Hlavní prvky:
- Offset_Internal — posun vlastnosti v paměti, vypočítaný přes STRUCT_OFFSET.
- EPropertyFlags — flagy, které určují chování, například CPF_Edit pro editaci v editoru.
- Metody přístupu, jako ContainerPtrToValuePtr, pro přímé čtení a zápis hodnot.
Příklad použití:
UAbilityComponent* Comp = ...;
FProperty* HealthProp = Comp->GetClass()->FindPropertyByName(TEXT("HealthAttribute"));
FAbilityAttribute* HealthPtr = HealthProp->ContainerPtrToValuePtr<FAbilityAttribute>(Comp);
float CurrentHealth = HealthPtr->CurrentValue;
Praktické využití reflexe
Systém reflexe je využíván v různých komponentech Unreal Engine:
- Serializace — ukládání a načítání objektů ze souborů.
- Editor — zobrazování vlastností v Details panelu s podporou kategorií a widgetů.
- Integrace s Blueprint — poskytování přístupu k vlastnostem a funkcím C++ z vizuálního skriptování.
- Síťová replikace — synchronizace dat mezi klientem a serverem.
- Garbage collection — sledování vlastnictví objektů pro správu paměti.
Co je důležité
- Reflexe v Unreal Engine je založena na generování kódu přes Unreal Header Tool, a ne na možnostech C++.
- Oddělení hierarchií UObject a FField optimalizuje výkon a správu paměti.
- Posuny v paměti, uložené v FProperty, umožňují efektivně přistupovat k datům během běhu.
- Systém podporuje klíčové funkce motoru, včetně serializace, editace a síťové interakce.
- Porozumění reflexi je nezbytné pro vývoj složitých systémů, jako jsou ability-komponenty nebo vlastní editorové nástroje.
— Editorial Team
Zatím žádné komentáře.