Zpět na domů

Reflexe v Unreal Engine: jak funguje systém typů

Článek vysvětluje systém reflexe v Unreal Engine, včetně generování kódu prostřednictvím Unreal Header Tool, architekturu hierarchií UObject a FField a praktické použití pro přístup k typům v runtime. Materiál je určen pro vývojáře pracující s C++ a Blueprint v UE5.

Reflexe v Unreal Engine: vnitřní mechanismus pro vývojáře
Advertisement 728x90

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.

Google AdInline article slot

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:

Google AdInline article slot
  • 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í:

Google AdInline article slot
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

Advertisement 728x90

Číst dál