Quick answer: Extend the font's character set or add fallback font assets covering the missing scripts, and use dynamic atlases during development to discover what real text actually needs.
TMP renders only glyphs baked into (or resolvable via fallbacks from) its atlas — everything else warns and shows tofu squares. Player-generated and localized text finds the gaps fast. Here is the coverage strategy.
How to fix it
1. Add fallbacks per script
Create fallback font assets for Latin-extended, Cyrillic, CJK, and emoji as your audience needs, and chain them in the primary asset's Fallback list — TMP walks the chain per missing glyph.
2. Bake what you can enumerate
For fixed UI strings, bake exactly the union of characters from your localization files into a static atlas — smallest memory, no runtime rasterizing.
3. Use dynamic atlases for the unknown
Player names and chat need Dynamic atlas population; give the dynamic asset headroom (multi atlas textures) so it does not fill and start dropping glyphs.
4. Test with worst-case strings
Run the longest localized strings and a torture sample (names with diacritics, emoji, CJK) through every text field before each release.
Catching the ones you can't reproduce
The hardest version of this to fix is the one you can't reproduce — it only happens on a player's hardware, OS, driver, or save state, under conditions that simply aren't present on your machine. A report that says “it crashed” or “it froze” gives you nothing to act on, so the bug survives release after release while quietly costing you players.
Automatic error capture closes that gap. Each failure arrives with its full stack trace, the device and OS, the build number, and a breadcrumb trail of what the player did right before it broke, so even a failure you have never seen becomes a specific, reproducible issue. Fold identical failures into one signature ranked by how many players each hits, and your worklist sorts itself worst-first instead of arriving as a stream of vague complaints.
This is where a tool like Bugnet earns its place. Its SDK captures every Unity error automatically with the full stack trace plus device, OS, memory, build, and game-state context, folds duplicates into one grouped issue with an occurrence count, and ties each to the build it first appeared on — so you fix the problem that hurts the most players first and confirm it is gone when its signature disappears from the next release.
The bug you can't reproduce isn't gone — it's just invisible until you capture it from the player's device.