Quick answer: Squares (also called tofu) appear when the TMP font asset does not contain the characters being displayed. This happens when the font atlas was generated with a limited character set that does not include the characters your text uses.

Here is how to fix Unity TextMeshPro font asset missing. Your UI text renders as squares, rectangles, or falls back to a completely different font than the one you assigned. TextMeshPro is the standard text rendering system in Unity, but its font asset pipeline has several steps that can silently fail or produce incomplete results. This guide covers every reason TMP text might display incorrectly and how to fix each one.

Understanding TMP Font Assets vs Font Files

TextMeshPro does not use .ttf or .otf font files directly. It uses pre-generated font assets that contain a Signed Distance Field (SDF) atlas—a texture where each pixel encodes the distance to the nearest character edge. This is what allows TMP text to scale cleanly at any size without blurring.

The most common mistake is dragging a .ttf file directly into a TMP component’s font field. Unity may accept it without an error but will generate a low-quality runtime font asset that lacks many characters. Always generate a proper font asset through the Font Asset Creator.

To create a font asset correctly, open Window → TextMeshPro → Font Asset Creator and configure these settings:

// Font Asset Creator settings for a typical game
Source Font File:     YourFont.ttf
Sampling Point Size:  90        // Higher = better quality, larger atlas
Padding:              5         // Space between glyphs in the atlas
Packing Method:       Optimum
Atlas Resolution:     2048 x 2048
Character Set:        Extended ASCII   // Or Custom Range for localization
Render Mode:          SDFAA            // SDF with anti-aliasing

Click Generate Font Atlas and wait for the process to finish. The preview will show you every character that was included. If any characters show a red X, they were not found in the source font file. Click Save to create the .asset file.

Fixing Missing Characters (Tofu Squares)

When TMP encounters a character that is not in the font atlas, it displays a square glyph (sometimes called “tofu”). This happens in several scenarios:

Wrong character set: If you generated the font asset with ASCII (128 characters) but your game text includes accented characters like é or ü, those characters will appear as squares. Switch to Extended ASCII or a custom Unicode range that covers your needs.

Localization characters missing: If your game supports multiple languages, you need to include those character ranges in the atlas. For CJK (Chinese, Japanese, Korean), this requires a much larger atlas or a separate font asset.

// Custom Unicode ranges for common language support
// Basic Latin + Latin Supplement (Western European)
"32-126,160-255"

// Add Cyrillic for Russian
"32-126,160-255,1024-1279"

// Add CJK Unified Ideographs (Chinese/Japanese)
// WARNING: This requires a 4096x4096 or larger atlas
"32-126,160-255,19968-40959"

Atlas too small: If you try to fit too many characters into a small atlas, the Font Asset Creator will silently drop characters that do not fit. Increase the atlas resolution to 4096x4096 or split across multiple font assets.

You can check which characters are in a font asset by selecting it in the Project window and looking at the Character Table in the inspector. This table lists every character with its Unicode value and atlas coordinates.

The Fallback Font Chain

Instead of trying to fit every character into a single font atlas, TMP supports a fallback font chain. When a character is not found in the primary font, TMP searches through a list of fallback fonts in order until it finds a match.

To configure fallbacks, select your TMP font asset and expand the Fallback Font Asset List in the inspector. Add font assets in priority order:

// Typical fallback chain for a multi-language game
Primary Font:     GameFont-SDF          // Your custom game font (Latin)
Fallback 1:       NotoSans-Cyrillic-SDF // Russian/Ukrainian support
Fallback 2:       NotoSansCJK-SDF       // Chinese/Japanese/Korean
Fallback 3:       NotoSansArabic-SDF    // Arabic/Hebrew
Fallback 4:       Symbols-SDF           // Emoji and special symbols

You can also set a project-wide default fallback in TMP_Settings. Create this asset via Window → TextMeshPro → Settings. The Default Font Asset and Fallback Font Assets fields here apply to every TMP component that does not have its own font explicitly assigned.

A common gotcha: the fallback search has a depth limit. By default, TMP will only search through 5 levels of fallback nesting. If your fallback fonts themselves have fallback chains, you can hit this limit. Increase it in TMP_Settings if needed.

Runtime Font Loading and Dynamic SDF

For games with user-generated content or chat systems where you cannot predict every character in advance, TMP supports dynamic font assets that generate SDF glyphs at runtime on demand.

using TMPro;
using UnityEngine;

public class DynamicFontLoader : MonoBehaviour
{
    [SerializeField] private TMP_FontAsset primaryFont;

    void Start()
    {
        // Enable dynamic font rendering for characters not in the atlas
        primaryFont.atlasPopulationMode = AtlasPopulationMode.Dynamic;
    }

    // Load a font at runtime from a file path
    public TMP_FontAsset LoadFontFromPath(string path)
    {
        Font runtimeFont = new Font(path);
        if (runtimeFont == null)
        {
            Debug.LogError($"Failed to load font from: {path}");
            return null;
        }
        TMP_FontAsset fontAsset = TMP_FontAsset.CreateFontAsset(runtimeFont);
        fontAsset.atlasPopulationMode = AtlasPopulationMode.Dynamic;
        return fontAsset;
    }
}

Dynamic SDF generation adds a small performance cost when new characters are first encountered, as it needs to rasterize the glyph and add it to the atlas texture. For most games, this cost is negligible. However, if you are rendering thousands of unique characters simultaneously (like a CJK chat feed), you may see a frame spike. Pre-populate the atlas with TMP_FontAsset.TryAddCharacters() during a loading screen to avoid runtime hitches.

Common TMP Font Errors and Their Fixes

“The character with Unicode value \uXXXX was not found” in the console means a character is missing from all fonts in the chain. Add a fallback font that covers that Unicode range, or regenerate your atlas with a wider character set.

Text appears but in the wrong font: The primary font asset reference is null or missing on the TMP component. This happens after moving or renaming font assets. Reassign the font in the inspector. Use Edit → Project Settings → TextMeshPro → Settings to verify the default font is set correctly.

Text looks blurry at certain sizes: The SDF atlas resolution or sampling point size is too low for the display size. Regenerate the font asset with a higher Sampling Point Size (90–120 for body text, 150+ for large headers) and a larger atlas.

Font works in the editor but shows default font in builds: The font asset is not included in the build. Ensure it is referenced by a scene or prefab that is in the build, or add it to a Resources folder, or include it in an Addressables group. TMP font assets that are only referenced via code need explicit inclusion.

“The Font Asset Creator is a tool you will use dozens of times during a project. Every time you add localization support, change your UI font, or discover a missing character in QA, you will regenerate an atlas. Automate this with a build script if you can.”

Related Issues

If your TMP text is rendering but your UI buttons are not responding to clicks, see Fix: Unity UI Button Not Responding to Clicks. For general issues with assets missing in builds, check Fix: Unity Build Missing Scenes or Resources. For automating bug reports that capture font rendering issues with screenshots, read Bug Reporting Tools for Unity Developers.

TMP font assets are not the same as font files. Generate them properly, set up a fallback chain, and check the character table when squares appear. Most TMP font issues are solved in the Font Asset Creator, not in code.