TextMeshPro Alternative for Unity: UniText vs TMP vs UI Toolkit
Last reviewed
UniText is a complete text engine for Unity that replaces TextMesh Pro on uGUI canvases and in world space. It shapes text with HarfBuzz, runs the Unicode Bidirectional Algorithm, renders emoji sequences as single glyphs, reads variable fonts and falls back to the operating system's fonts, so Arabic, Hebrew, Hindi, Thai, CJK and emoji render correctly without extra plugins or per-language font files.
If your game ships only Latin or CJK text and TextMesh Pro already covers it, you do not need to switch.
When switching is worth it
TextMesh Pro maps characters to glyphs one by one. That is enough for Latin, Cyrillic and most CJK text, and it stops working for writing systems that need a shaping engine. Switching pays off when your project needs any of these:
- Arabic, Persian or Urdu with connected letters, or Hebrew mixed with Latin text and digits in the same line.
- Hindi and other Indic scripts, where letters combine into conjuncts and vowel signs move around their consonant.
- Thai, Lao, Khmer or Myanmar text, which has no spaces between words and needs dictionary-based line breaking.
- Emoji sequences: families, flags, professions and skin tones that must render as one glyph.
- Variable fonts, real bold and italic cuts, or OpenType features such as small caps and language-specific forms.
- Players typing in any language, with selection and caret movement that follow the script.
- Fewer font files: system-font fallback covers every language on desktop and mobile.
What UniText is
UniText covers the whole pipeline: Unicode analysis, shaping with HarfBuzz, line breaking, layout, glyph rasterization with FreeType, a shared glyph atlas and rendering. It does not extend or depend on TextMesh Pro or UI Toolkit, and it reads .ttf and .otf files directly instead of Unity font assets.
UniTextderives fromMaskableGraphic, so masks, layout groups,ContentSizeFitter,RectMask2Dand canvas batching work as with any uGUI graphic.UniTextWorldrenders world-space text through a mesh batcher with sorting layers and shadow casting.UniText3Dextrudes glyphs into lit solid meshes with bevels.
It runs on Windows, macOS, Linux, Android, iOS, tvOS, visionOS and WebGL, and requires Unity 2022.3 LTS or newer.
UniText vs TextMesh Pro vs UI Toolkit
The table below is the same one published on the UniText product page, checked against the TextMesh Pro source in com.unity.ugui 2.0.0, the Unity C# reference and the Unity 6 documentation.
| Feature | UniText | TextMesh Pro | UI Toolkit |
|---|---|---|---|
| Scripts & Internationalization | |||
| Bidirectional Text (UAX #9) | (mirrors the whole text)1 | Requires ATG2 | |
| Auto Text Direction | |||
| Arabic, Persian & Urdu (joining, Nastaliq) | Any font | (3rd-party string rewrite)1 | Requires ATG2 |
| Arabic Kashida Justification | |||
| Hebrew with Numbers & Latin | RTL flag, no mixed lines1 | Requires ATG2 | |
| Indic Scripts (Devanagari, Bengali, Tamil…) | Requires ATG2 | ||
| Complex OpenType Shaping (GSUB/GPOS) | HarfBuzz | Kerning, ligatures, marks only | Requires ATG2 |
| Language-Aware Shaping (locl, pan-CJK) | |||
| Thai / Lao / Khmer / Myanmar Line Breaking | Dictionary | Not documented2 | |
| Unicode Line Breaking (UAX #14) | (spaces + CJK lists) | Requires ATG2 | |
| Unicode Version | 18.03 | (no character database)4 | 15.02 |
| Emoji & Color Fonts | |||
| Emoji Sequences (ZWJ / skin tone / flags) | Manual ligature setup5 | Not documented5 | |
| Automatic System Emoji | All platforms incl. WebGL | (manual emoji font asset) | (imported emoji font) |
| Color Font Formats | COLRv0/v1, CBDT, sbix | No COLRv16 | No COLRv16 |
| Fonts & Typography | |||
| Variable Fonts | Any axis, per range | ||
| OpenType Feature Control (liga, tnum, ss01…) | Any feature, per range | 4 features, per component | |
| Real Bold / Italic / Weight Faces | Automatic from family & OS | Manual weight table | Manual weight table |
| Small Caps (OpenType smcp) | (scaled capitals) | (scaled capitals) | |
| Automatic System-Font Fallback7 | (manual Dynamic OS font assets) | Limited (fixed list) | |
| Language-Aware System-Font Fallback7 | |||
| Font-Size-Adjust (x-height match) | |||
| Text-Box Trim (cap-height) | |||
| Font Compression (build size) | Zstd | ||
| Font Memory Mapping | On-demand file cache8 | (dynamic fonts load whole)8 | (dynamic fonts load whole)8 |
| Pixel Fonts | Automatic pixel grid9 | Raster atlas, manual setup9 | Raster atlas, manual setup9 |
| Pixel-Perfect Effects & Animation | Snapped to font grid9 | ||
| Rendering & Effects | |||
| MSDF Rendering | |||
| Layered Effects (strokes, shadows, glows) | Unlimited ordered layers | One outline, underlay, glow | One outline + shadow |
| Seamless Outlines on Overlapping Letters | Glyph union | ||
| Gradients Across Text | Linear, radial, angular | Per-glyph corner colors | Per-glyph corner colors |
| Text on a Curve / Arc | |||
| Extruded 3D Text (solid meshes) | UniText 3D10 | ||
| Lit / Shaded 3D Text | Limited (shader swap) | ||
| Extrude / Bevel Effect10 | (configurable stack + bevel) | Basic (shader bevel) | |
| Mixed Fonts & Emoji in One Draw Call | One material for all fonts11 | (sub-mesh per font asset)11 | Up to 8 atlases11 |
| World-Space Batching Across Texts | Shared world batcher11 | (renderer per object)11 | Per panel |
| Multi-Core Processing | Burst jobs | Unity 6+ | |
| Animation | |||
| Built-In Text Animations | Wave, shake, glitch, marquee… | (sample scripts) | (vertex callback code) |
| Reveal / Typewriter Effects | Per cluster, word or line | Visible-character limit | |
| Per-Range Animation (Timeline / Animator) | (whole component) | (whole element) | |
| Layout & Rich Content | |||
| Justified Text | Word, letter, glyph + kashida12 | Fixed space/letter ratio12 | Limited (markup only) |
| Math Formulas | LaTeX notation13 | ||
| Tables | LaTeX tabular, spans, rules13 | ||
| Lists (ordered / nested) | |||
| Ruby / Furigana | |||
| Inline Objects in Text Flow | Sprites + prefabs | Sprites only | Sprites only |
| Virtualized Rich Documents | Rope + viewport | (ListView rows only) | |
| Markup & Interaction | |||
| Configurable / Custom Tags | Any name, any effect | Named <style> presets | Named <style> presets |
| Markdown Syntax | |||
| Links, Mentions & Hashtags | Auto-detected, with states | <link> + manual hit test | Experimental <link> events |
| World-Space Pointer Events | Unity 6.2+ panels | ||
| Styles & Ecosystem | |||
| Visual Modifier & Layer Constructors | Nested layers + presets | Material presets | USS + UI Builder |
| Shared Paints & Rendering with Shapes & Lottie | Core paints, shaders, batching11 | USS for shapes & text | |
| Support | |||
| Direct Developer Support | Discord14 | (Unity issue tracker / forums) | (Unity issue tracker / forums) |
- 1.TMP has no Unicode Bidirectional Algorithm and no Arabic joining. Its right-to-left mode advances every glyph from right to left, so Latin words and numbers inside right-to-left text come out reversed. Add-ons such as RTLTMPro rewrite the string into presentation forms before TMP draws it and reorder it with their own rules instead of UAX #9.
- 2.UI Toolkit shapes complex scripts with the Advanced Text Generator (HarfBuzz and ICU): opt-in in Unity 6.0–6.4, the default from 6.5, unavailable before Unity 6. It takes text direction from an explicit setting, supports only dynamic font assets, and Unity does not document dictionary-based line breaking for it.
- 3.UniText’s bidirectional, line-breaking, grapheme-cluster and word-boundary data follow Unicode 18.0 and pass every Unicode 18.0 conformance test.
- 4.TMP has no Unicode character database. Its only Unicode data are Emoji 16.0 lists that send emoji to fallback assets; scripts, marks and line breaks use hard-coded ranges and lists.
- 5.TMP joins emoji sequences only through GSUB ligatures of a color font asset with the liga feature enabled, which is off by default; a sprite asset maps single code points. UI Toolkit does not document sequence support.
- 6.Unity documents COLRv1, SVG and AAT color fonts as unsupported in UI Toolkit; TMP rasterizes color glyphs through the same TextCore font engine.
- 7.UniText asks the operating system’s own font fallback for each text run, with that run’s language (DirectWrite, CoreText, AFontMatcher, fontconfig). UI Toolkit (Unity 6 and later) appends a fixed list of OS fonts to its fallback chain and uses the first one that contains the character. TMP reaches OS fonts only through Dynamic OS font assets added to its fallback lists.
- 8.UniText maps file-backed fonts and player font payloads without retaining a full managed copy. WebGL and embedded Editor assets use in-memory data. TMP dynamic font assets and UI Toolkit font assets rasterize from a Unity Font asset, which embeds the whole font file and loads it with the asset.
- 9.UniText detects or accepts a native pixel grid, samples one texel per font pixel and snaps effects and animation to that grid. Integer font-size multiples are pixel-exact. TMP and UI Toolkit render pixel fonts through raster atlas modes chosen in the Font Asset Creator.
- 10.UniText 3D extrudes glyphs into closed, lit solids with bevels that cast shadows. The extrude effect of Canvas and world text is a layered visual effect with offset quads and bevel shading.
- 11.Core batches compatible text, shapes and Lottie, and all fonts share one material within a surface tier. Materials, textures, masks, sorting and geometry capacity can split draw calls. TMP gives each fallback font, sprite asset and material its own sub-mesh, and world-space TMP text uses one MeshRenderer per object. UI Toolkit batches up to eight textures per draw call; Unity documents that fallback fonts add draw calls.
- 12.TMP splits the extra width between spaces and letters by a fixed ratio and only widens lines. UniText widens or tightens a line within word-space, letter-spacing and glyph-width budgets, justifies lines without spaces, such as CJK and Thai, between characters, and stretches Arabic with kashida.
- 13.UniText lays out fractions, radicals, scripts, delimiters, matrices and accents written in LaTeX notation with an OpenType MATH font, and LaTeX tabular tables with row and column spans; it does not implement the complete TeX language.
- 14.Discord is the main LightSide channel for questions, help and discussion. Bug reports and feature requests go to the public issue tracker.
What moving from TextMesh Pro involves
- Fonts: create a
UniTextFontasset from each .ttf or .otf file. The font bytes are compressed into the asset, so the source file does not ship. - Components: replace
TextMeshProUGUIwithUniTexton canvases andTextMeshProwithUniTextWorldin world space. Text is set through theTextproperty. - Markup: tags are a list of styles on the component rather than a fixed vocabulary. The shipped prefabs and the Styles picker add the common tags such as bold, italic, color and size.
- Both packages can stay in the project during the move, because UniText does not use TextMesh Pro types.
On desktop and mobile, Latin, Arabic, Devanagari and an emoji family in one string need no font setup and no direction flag. WebGL has no access to system fonts, so a WebGL build assigns its fonts explicitly.
using LightSide;
using UnityEngine;
public class Greeting : MonoBehaviour
{
[SerializeField] UniText label;
void Start()
{
label.Text = "Hello · مرحبا · नमस्ते · 👨👩👧👦";
}
}Questions
Is UniText free?
Does UniText work with UI Toolkit?
Can I keep TextMesh Pro for some screens?
Check it in your project
Run the browser demo, follow the setup guide, or compare the free version with the licenses.
Related problems
- Arabic Text in Unity: Fix Disconnected and Reversed LettersTextMesh Pro has no Arabic shaping or bidirectional ordering, so letters render isolated and reversed. UniText shapes Arabic, Persian and Urdu with HarfBuzz and runs the Unicode Bidirectional Algorithm.
- Color Emoji in Unity: Flags, Skin Tones and ZWJ SequencesTextMesh Pro has no shaping engine, so emoji families, flags and skin tones often fall apart. UniText renders system color emoji with no setup and forms every Unicode emoji sequence as one glyph.
- Unity Text Shows Squares Instead of Characters: Font Fallback That Just WorksSquares appear when no font in the fallback chain has the character. UniText falls back to the operating system’s fonts per language automatically, so any language renders without shipping a font for it.
