# Sistema de Reflexión de Unreal Engine: Cómo Maneja los Tipos en Tiempo de Ejecución
Unreal Engine depende de su propio sistema de reflexión para acceder a la información de tipos durante la ejecución. Esto impulsa la serialización de objetos, la visualización de propiedades en el editor, la integración entre C++ y Blueprint, y la comunicación en red. El sistema se basa en la generación de código mediante el Unreal Header Tool y dos jerarquías de tipos paralelas.
Arquitectura de Reflexión: UHT y Archivos Generados
El Unreal Header Tool (UHT) analiza los archivos de cabecera C++, detecta macros como UCLASS y UPROPERTY, y genera código para registrar los tipos. Esto crea dos archivos clave:
- .generated.h — contiene macros y declaraciones adelantadas.
- .gen.cpp — incluye el código de registro de tipos que puede abarcar miles de líneas.
El código generado almacena metadatos como nombres de propiedades, flags y desplazamientos de memoria. Por ejemplo, la propiedad CurrentValue en FAbilityAttribute registra su desplazamiento mediante STRUCT_OFFSET, permitiendo que el motor acceda directamente a los datos en tiempo de ejecución.
Dos Jerarquías de Tipos: UObject y FField
UE5 utiliza dos sistemas para describir tipos, separados para optimizar el rendimiento.
Jerarquía Basada en UObject
Gestionada por el recolector de basura, incluye:
- UClass para clases C++.
- UFunction para funciones.
- UScriptStruct para estructuras.
- UEnum para enumeraciones.
Jerarquía Basada en FField
Introducida en UE 4.25 para reducir sobrecarga, las propiedades aquí evitan la recolección de basura:
- FField — clase base.
- FProperty — describe propiedades individuales, como FIntProperty o FFloatProperty.
- Enlace entre jerarquías: UStruct contiene un puntero a una lista enlazada de propiedades FField.
Características clave de FField:
- Usa una lista enlazada para elementos hijos.
- Incluye FFieldClass con casteo rápido de tipos mediante máscaras de bits.
- FFieldVariant combina punteros UObject y FField, usando el bit bajo para distinguir tipos.
Anatomía de FProperty: Acceso a Datos
FProperty proporciona herramientas para manejar propiedades en memoria. Elementos principales:
- Offset_Internal — desplazamiento de memoria de la propiedad, calculado con STRUCT_OFFSET.
- EPropertyFlags — flags que dictan el comportamiento, como CPF_Edit para ajustes en el editor.
- Métodos de acceso como ContainerPtrToValuePtr para lectura/escritura directa.
Ejemplo en acción:
UAbilityComponent* Comp = ...;
FProperty* HealthProp = Comp->GetClass()->FindPropertyByName(TEXT("HealthAttribute"));
FAbilityAttribute* HealthPtr = HealthProp->ContainerPtrToValuePtr<FAbilityAttribute>(Comp);
float CurrentHealth = HealthPtr->CurrentValue;
Usos Prácticos de la Reflexión
El sistema de reflexión de Unreal Engine impulsa funciones clave:
- Serialización — guardar y cargar objetos desde archivos.
- Editor — mostrar propiedades en el panel Detalles con categorías y widgets personalizados.
- Integración con Blueprint — exponer propiedades y funciones C++ al scripting visual.
- Replicación en Red — sincronizar datos entre cliente y servidor.
- Recolección de Basura — rastrear la propiedad de objetos para gestión de memoria.
Conclusiones Clave
- La reflexión de Unreal Engine se basa en la generación de código del Unreal Header Tool, no en funciones nativas de C++.
- La separación de jerarquías UObject y FField mejora el rendimiento y la gestión de memoria.
- Los desplazamientos de memoria en FProperty permiten acceso rápido a datos en tiempo de ejecución.
- El sistema sustenta funciones centrales del motor como serialización, edición y redes.
- Dominar la reflexión es esencial para crear sistemas avanzados como componentes de habilidades o herramientas de editor personalizadas.
— Editorial Team
Aún no hay comentarios.