tag@ao_serialize

La anotación @ao_serialize controla qué campos se persisten y son editables en el inspector.

@ao_serialize es la anotación que colocas en los campos de struct/class para integrarlos en el sistema de serialización del motor. Sin ella, un campo es solo de tiempo de ejecución — no se guardará, no aparecerá en el inspector y no se incluirá cuando la escena se escriba en disco.

Enemy :: class : Component {
    // Guardado, mostrado en el inspector, incluido en los datos de la escena
    max_health: int @ao_serialize;
    patrol_radius: float @ao_serialize;

    // Solo en tiempo de ejecución — no se guarda, no está en el inspector
    current_target: v2;
    aggro_timer: float;
}

Qué hace

Cuando marcas un campo con @ao_serialize, el motor hará lo siguiente:

  1. Mostrarlo en el inspector para que puedas editarlo en las entidades en el editor.

  2. Guardarlo con la escena para que el valor se restaure cuando se cargue la escena.

  3. Incluirlo en la serialización JSON (Save.set_json / Save.try_get_json).

Los campos sin @ao_serialize existen solo en memoria en tiempo de ejecución. Comienzan con su valor predeterminado (cero) cada vez que se crea el componente o se carga la escena.

Tipos compatibles

@ao_serialize funciona con todos los tipos comunes de CSL:

Tipo
Ejemplo

Enteros

s8, s16, s32, s64 / int

Sin signo

u8, u16, u32, u64 / uint

Flotantes

f32 / float, f64

Booleanos

bool

Cadenas

string

Vectores

v2, v3, v4

Enums

Cualquier enum definido por el usuario

Arrays fijos

[N]T

Arrays dinámicos

[..]T

Structs / clases

Tipos anidados (sus @ao_serialize campos se incluyen recursivamente)

circle-info

Para structs/clases anidados, solo se serializan los campos marcados @ao_serialize dentro del tipo anidado. La anotación no se hereda — debes marcar cada campo individualmente.

Uso con componentes

El uso más común es en campos de componentes. Estos pasan a ser editables en el inspector del editor y se guardan como parte de la escena.

Puedes establecer capacity, loot_table, y is_locked por entidad en el editor. Cuando se carga la escena, esos valores se restauran automáticamente.

Uso con el sistema de guardado

@ao_serialize también controla qué campos se incluyen cuando usas las API de guardado en JSON. Solo los campos marcados se escriben en JSON.

Para obtener detalles completos sobre el sistema de guardado, consulta Sistema de guardado y Serialización JSON.

Uso con JSON independiente

Puedes serializar cualquier tipo anotado hacia/desde una cadena JSON, independientemente del sistema de guardado:

Valores predeterminados y relleno con ceros

Al deserializar, los campos que faltan en los datos (por ejemplo, añadiste un campo nuevo después de que los jugadores ya tuvieran partidas guardadas) se rellenan con ceros:

  • Números → 0

  • Booleanos → false

  • Cadenas → ""

  • Arrays → vacíos

Si cero no es un valor predeterminado razonable, comprueba y establece tus propios valores después de cargar:

Qué NO serializar

No todos los campos deben serializarse. Deja @ao_serialize desactivados los campos que sean:

  • Derivados en tiempo de ejecución (posiciones calculadas en cada fotograma, búsquedas en caché)

  • Estado temporal (temporizadores, contadores de enfriamiento, banderas locales del fotograma)

  • Grandes cantidades de datos que cambian en cada fotograma (sobrecarga de guardado innecesaria)

Una buena regla general: si el valor se establece una vez (en el editor o al cargar) y rara vez cambia, sérialo. Si se recalcula en cada fotograma, no lo hagas.

Patrones comunes

Enums para selección de modo

Structs anidados

Referencias a recursos

Algunos campos hacen referencia a recursos del motor (texturas, prefabs, sonidos). Estos se serializan como identificadores de recurso y se resuelven automáticamente al cargar. Consulta los componentes integrados (como Sprite_Renderer) para ver ejemplos.

Última actualización