Sistema de HUD
Un HUD es un conjunto de elementos anclados y vinculados a datos reales del juego mediante cadenas configuradas — se construye visualmente, se valida automáticamente y evoluciona sin migraciones.
Para qué sirve este sistema
Un HUD en Unity suele empezar como un puñado de componentes Text e Image actualizados desde llamadas a Update() dispersas, una por cada sistema que necesita mostrar algo. La vida, la munición y los temporizadores acaban cada uno con su propio cableado a medida, y añadir un elemento nuevo significa escribir código de binding nuevo en lugar de configurarlo.
El sistema de HUD de Serenity trata el HUD como datos configurados, no como componentes cableados a mano. Cada elemento se ancla a una de nueve posiciones con la dirección de crecimiento como eje independiente, puede reflejarse por jugador y se vincula a datos de juego en vivo mediante una cadena de lecturas sobre los servicios de Serenity basados en snapshots — todo configurado visualmente en HUD Builder y editado directamente en HUD Preview.
El problema en Unity
Los elementos de HUD cableados a mano acoplan el código de interfaz directamente a los servicios del juego: cada elemento nuevo es C# nuevo, y cada método renombrado, una rotura silenciosa en tiempo de ejecución. Colocar un elemento para un segundo jugador suele implicar duplicar el layout a mano, y un elemento que no puede resolver su fuente de datos normalmente lanza una excepción o no muestra nada, sin explicar el motivo.
Sin una representación compartida de cómo se dibuja un valor, las barras de vida, los contadores de munición y los temporizadores reinventan cada uno su formato — precisión, relleno, capacidad — y un diseñador que quiere mover un elemento medio píxel a la izquierda necesita un programador para hacerlo.
Cómo lo aborda Serenity
La posición de un elemento usa el UiAnchorType de nueve anclajes con la dirección de crecimiento como eje aparte, de modo que un contador de munición abajo a la derecha puede crecer de derecha a izquierda. Los elementos pueden asociarse a un jugador y reflejarse automáticamente — el elemento de P1 abajo a la izquierda se convierte en el de P2 abajo a la derecha sin configurarlo dos veces. Un binding es una fuente más una cadena ordenada de lecturas con argumentos constantes sobre los servicios basados en snapshots; los métodos de estilo Try aportan su valor out, una fuente de servicio se resuelve de forma diferida y queda fijada solo cuando resuelve con éxito, y un binding sin resolver muestra el texto de respaldo del elemento e informa del motivo en lugar de lanzar una excepción.
Siete representaciones cubren las formas de dibujar un valor: texto, número (precisión, relleno de ceros, separador de miles), tiempo (incluido el estilo arcade MM'SS"CC), pila, segmentado, medidor y conjunto de iconos. Las tres que dibujan la parte vacía además de la llena requieren un binding de capacidad, y esa regla vive en un único sitio compartido que leen el editor, el runtime y el validador.
Cómo encaja en Serenity
HUD Builder (Tools ▸ Serenity ▸ Create ▸ UI ▸ HUD Builder) crea y edita los assets de HUD con un selector de miembros guiado: el desplegable de cada paso se construye a partir del tipo que produjo el paso anterior, de modo que solo pueden configurarse cadenas que de verdad resuelven. Un validador dedicado, hud-bindings, detecta bindings que han dejado de resolver, representaciones sin su binding de capacidad e ids duplicados — de forma interactiva o headless en CI.
HUD Preview renderiza el HUD con las vistas de elemento reales del runtime en la resolución, el tema y el fondo elegidos, y es una superficie de edición por manipulación directa: arrastra para mover, tira de una esquina o un borde para escalar (deformación libre por defecto, con Shift para mantener proporciones), rota con el tirador tipo lollipop o justo fuera de una esquina, ajusta a la cuadrícula con Ctrl, fija el pivote en el centro con Alt y cancela con Escape — cada gesto es un único paso de deshacer. Los campos Rotation y Stretch por eje no requieren migrar los assets existentes, y el reflejo sigue siendo una imagen especular fiel. Cada tema puede aportar un slot HudElementTemplate para vestir los elementos con su propio lenguaje visual.
Flujo de trabajo práctico
- Abre HUD Builder y añade elementos, anclando cada uno con UiAnchorType y una dirección de crecimiento.
- Configura el binding de cada elemento como una cadena: elige un servicio de origen y encadena lecturas con el selector de miembros guiado hasta resolver un valor mostrable.
- Elige una representación — texto, número, tiempo, pila, segmentado, medidor o conjunto de iconos — y define el binding de capacidad en las que lo necesiten.
- Asocia a un jugador los elementos que lo requieran y deja que el reflejo genere el layout del lado opuesto en lugar de configurarlo dos veces.
- Abre HUD Preview para arrastrar, escalar y rotar los elementos directamente en la resolución y el tema de destino, con cada gesto como un único paso de deshacer.
- Ejecuta el validador hud-bindings, interactivo o en CI, para detectar bindings sin resolver, capacidades ausentes o ids duplicados antes de que lleguen a los jugadores.
Qué incluye
- Posicionamiento con UiAnchorType de nueve anclajes y dirección de crecimiento como eje independiente
- Elementos asociados a un jugador con reflejo automático — se configura una vez y sirve para los dos lados
- Cadenas de binding sobre servicios basados en snapshots, con resolución diferida que se fija al primer éxito
- Texto de respaldo con motivo informado, en lugar de excepciones, para los bindings sin resolver
- Siete representaciones: texto, número, tiempo (incl. MM'SS"CC), pila, segmentado, medidor y conjunto de iconos
- HUD Builder con selector de miembros guiado por tipos para configurar las cadenas de binding
- HUD Preview como superficie de manipulación directa — arrastrar, escalar y rotar, cada gesto en un único deshacer
- Validador hud-bindings para bindings sin resolver, capacidad ausente e ids duplicados, interactivo o en CI
Cuándo usarlo
- Juegos que necesitan barras de vida, contadores de munición, temporizadores o cualquier dato en vivo en pantalla sin escribir código de actualización por elemento.
- HUDs de pantalla dividida o multijugador local que necesitan el layout del segundo jugador reflejado sin duplicar configuración.
- Equipos que quieren un HUD editable por el diseñador — posición, binding y aspecto — sin un programador de por medio en cada ajuste.
- Proyectos que quieren que la CI detecte un binding roto por un renombrado antes de publicarse como un elemento en blanco.
Sistemas relacionados
Usa Serenity cuando quieras un HUD que sea datos configurados en lugar de código de interfaz disperso — vinculado a servicios reales, editable arrastrando y validado antes de llegar al jugador.
English
Español
Català