← Torna al blog

Numeri di danno fluttuanti: accettazione del handoff e implementazione nel motore

Criteri di fallimento quando i popup sono sfocati, mancano glifi, ordinano male o scattano; scelta tra TMP e cifre bitmap, pool e ordine Canvas, passi di accettazione Unity UGUI e come si integra l'arte delle cifre.

Pubblicato
  • game-ui-design
  • game-dev-ai
  • ui-to-engine
  • bitmap-font
  • unity
  • godot
  • cocos
  • vberai
  • 2026
Numeri di danno fluttuanti: accettazione del handoff e implementazione nel motore

Quando dieci colpi arrivano in un secondo, i problemi del testo fluttuante raramente si risolvono con un “font più grande”: nitido nell’Editor, sfocato sul dispositivo; il colore critico funziona ma manca la “K” o il meno; i numeri stanno sopra i pulsanti dell’HUD e rubano i tap; oppure Instantiate genera picchi di GC. I popup sono UI ad alta frequenza e breve durata—accettali separatamente dall’HUD statico.

Quanto segue si concentra su Unity UGUI / TextMeshPro (RectTransform, Canvas, sortingOrder). Godot: Label + Theme / bitmap; Cocos: Label + bitmap font + pool—stessi criteri e stesso ordine di passi. Guscio HUD statico: checklist motore + MCP. Voce 3 pre-lancio (“arte sfocata / numeri di danno”)—ritesta su dispositivi Release.

Criteri di fallimento (uno qualsiasi = non superato): leggibilità compromessa (sfocatura, clipping, glifi mancanti); tempo frame in combattimento chiaramente peggiore rispetto alla baseline senza popup sui dispositivi target; i popup bloccano i tap richiesti con i raycast ancora attivi; i visual di critico/cura/mancato non corrispondono alla specifica data-driven; formattazione dei numeri incoerente con la tabella di design (es. 1.2K vs 1200 mescolati).


Scegli prima: TMP o cifre bitmap

ScenarioPiù adattoTrappola tipica
Cifre + pochi simboli (0-9 . + - %)Bitmap / mesh di cifre personalizzataLacune nel charset; filtro sbagliato → sfocatura
Stringhe localizzate complete (“Critical”, “Immune”)TMP + string tableJitter di larghezza quando mescolate con cifre
Contorno pesante, gradiente, stile animatoBitmap o sequenza di frameStato mancante → fallback colore sbagliato
PrototipoTMP SDF predefinitoNessuna risoluzione di riferimento → sfocato sul dispositivo

Se la sfocatura sul dispositivo persiste: Canvas Scaler reference, TMP padding/atlas, bitmap Filter Mode (spesso Point)—poi charset o qualità SDF. Vedi pianificazione charset bitmap font e voce 3 pre-lancio.

Sharp in Editor vs soft on device

Bitmap digit atlas vs TMP/SDF text


Unity: costruzione e accettazione (6 passi)

1. Canvas dedicato o sort esplicito

  • Usa un Canvas dedicato (Screen Space - Camera allineato con la camera di combattimento) o un layer figlio dell’HUD.
  • Imposta sortingOrder sopra la UI del mondo, sotto i popup modali; raycastTarget = false sulla grafica dei popup.
  • Popup nel mondo: un unico World Canvas condiviso—non un Canvas per numero.

Popup Canvas sort above HUD, below modals, raycasts off

2. Object pool

  • Pre-riscalda ≥ il conteggio massimo a schermo (stress da abilità; spesso 16–32 minimo).
  • Al riciclo: resetta posizione, alpha, scala, stato animazione, testo.
  • Nessun Instantiate/Destroy per colpo.

3. Separa dati da presentazione

  • Il combattimento emette DamagePopupEvent (valore, tipo, posizione nel mondo/punto di aggancio, flag critico).
  • La presentazione sceglie colore, prefisso, abbreviazione (K/M/B), curve.
  • La tabella di design mappa tipo → Prefab di stile (Normal / Crit / Heal / Miss / Block).

4. Movimento e leggibilità

  • Tipico: float up + fade + leggera scala; 0.4–0.8s; stagger o coda sullo stesso ancoraggio.
  • Multi-colpo nello stesso frame: unisci o offset di 1–2 frame per evitare sovrapposizioni.
  • Se la dimensione segue la distanza della camera, usa una sola regola di scala nel mondo—non mescolare due volte con la scala del Canvas UI.

Multiple popup states with horizontal stagger

5. Charset e formattazione

  • Bitmap: verifica 0-9 . , + - % x K M B e le regole di abbreviazione del progetto.
  • TMP: dividi campi o sprite—non affidarti a un’unica stringa per cambiare font.
  • Con overflow di localizzazione: non rasterizzare intere frasi localizzate come arte dei popup.

6. Smoke test sul dispositivo

  • Dev e Release: 30s di sciame di mob, abilità boss multi-tick, dispositivo con poca RAM.
  • Confronta il tempo frame con e senza popup; screenshot di critico/cura/mancato una volta ciascuno.
  • I criteri di superamento vivono nel Prefab + configurazione pool, non solo nella Scene di test.

Handoff di design (cifre e stati)

ConsegnaUso
Arte delle cifre o stili TMP per stato (Normal/Crit/Heal/Miss)Prefab/Material guidato da tabella
Contorno/ombra alla risoluzione targetVerifica nitidezza sul dispositivo
Colore + icona di critico/combo sulle cifreEvita tinte hard-coded nel codice
Ambito charset (solo cifre vs unità localizzate)Bitmap o string table

Checklist handoff di design: se i popup sono raster, specifica per-locale o no; predefinito cifre bitmap + etichette TMP.


Instradamento delle correzioni

SintomoCausa probabileAzioneResponsabile
Sfocato sul dispositivo, nitido nell’EditorScaler / SDF / filtro bitmapAllinea risoluzione di riferimento; filtro Point; padding SDFEngineering
Glifi mancantiCharset / simboliEstendi charset; o TMPEngineering + Design
Blocca i pulsantiSort / raycastAbbassa l’ordine o disabilita raycastEngineering
ScattiNessun pool / troppi FX+testoPool; unisci popup nello stesso frameEngineering
Aspetto critico sbagliatoColori hard-codedTipo→Prefab; stati di designEngineering + Design
Diviso dallo stile HUDDue pipeline di fontUnifica la sorgente font o il ThemeDesign + Engineering

Domande frequenti

I popup devono essere World Space?
No. La 2D fissa spesso usa Screen Space - Camera; le camere 3D libere spesso usano World Canvas. Scegline uno e documentalo.

Particelle UI per l’effetto?
Va bene per gli FX; le cifre restano Label/TMP/mesh per localizzazione e pooling.

Un unico script con la logica del danno?
Emetti eventi dalla logica; toggle di presentazione (ShowDamageNumbers) per test e accessibilità.

Numeri grandi?
Una regola di formattazione dal design; implementazione unica—niente copia-incolla tra script UI.

Altre guide che potrebbero interessarti