Quick answer: Generate a TMP_FontAsset from your TTF/OTF via Window → TextMeshPro → Font Asset Creator, then assign it to the Font Asset slot. Set fallbacks for multilingual glyph coverage.

A UI mockup uses a custom display font. In Unity TextMeshPro renders LiberationSans everywhere — the default packaged with TMP. Dragging your TTF into the Font Asset slot doesn’t work; TMP wants a Font Asset, not raw TTF.

TTF vs TMP_FontAsset

The legacy UI Text component accepts a TTF directly. TextMeshPro doesn’t. TMP needs:

  1. A baked atlas containing every glyph you’ll display.
  2. Distance field information for the SDF rendering technique.
  3. Kerning tables and per-glyph metadata.

The TMP_FontAsset is a precomputed resource holding all of this.

Generate the Font Asset

  1. Import your TTF/OTF into the project (Assets/Fonts/).
  2. Open Window → TextMeshPro → Font Asset Creator.
  3. Set Source Font File to your TTF.
  4. Sampling Point Size: 90 (good balance of quality vs atlas size).
  5. Padding: 5 (for SDF spread).
  6. Character Set: choose ASCII for English-only, or Unicode Range Hex with a wider range for international.
  7. Click Generate Font Atlas, then Save.

You get a .asset file. Drag it into the Font Asset slot on your TextMeshProUGUI component.

Set the Default for the Project

In Project Settings → TextMesh Pro → Settings, set Default Font Asset to your generated asset. New TextMeshProUGUI components default to this.

Fallback Fonts for Multilingual Support

If you support English + Japanese, generate one asset per script. On the main asset:

  1. Inspector → Fallback Font Assets.
  2. Add Element.
  3. Drag the Japanese asset in.

When TMP encounters a glyph not in the main atlas, it cascades through fallbacks. The user-visible text mixes scripts seamlessly.

Dynamic SDF Atlas

For user-generated content where you can’t pre-bake every glyph, set Atlas Population Mode = Dynamic. Glyphs are baked on-demand at runtime. Costs more first-render time per new glyph; eliminates “missing glyph box” for unexpected characters.

Verifying

Run the scene. Text should render in your custom font. Inspector on a TMP component should show your asset in the Font Asset slot (not LiberationSans). Switch language at runtime — fallback glyphs should appear in their correct script font, not as missing-character boxes.

“TMP doesn’t accept raw TTFs. Generate a Font Asset, then assign it. Two minutes the first time, saves the ‘why LiberationSans’ surprise.”

Use Dynamic Atlas mode for fonts with hundreds of glyphs (CJK) — pre-baking everything bloats memory unnecessarily.