Volver al inicio

Reflexión en Unreal Engine: cómo funciona el sistema de tipos

El artículo explica el sistema de reflexión de Unreal Engine, incluyendo la generación de código a través de Unreal Header Tool, la arquitectura de jerarquía UObject y FField, y la aplicación práctica para el acceso a tipos en tiempo de ejecución. El material está destinado a desarrolladores que trabajan con C++ y Blueprint en UE5.

Reflexión en Unreal Engine: estructura interna para desarrolladores
Advertisement 728x90

# 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.

Google AdInline article slot

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:

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

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

Advertisement 728x90

Leer después