TextMeshPro Alternative for Unity: UniText vs TMP vs UI Toolkit

Last reviewed

Short answer

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.

  • UniText derives from MaskableGraphic, so masks, layout groups, ContentSizeFitter, RectMask2D and canvas batching work as with any uGUI graphic.
  • UniTextWorld renders world-space text through a mesh batcher with sorting layers and shadow casting.
  • UniText3D extrudes 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.

FeatureUniTextTextMesh ProUI 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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 UniTextFont asset from each .ttf or .otf file. The font bytes are compressed into the asset, so the source file does not ship.
  • Components: replace TextMeshProUGUI with UniText on canvases and TextMeshPro with UniTextWorld in world space. Text is set through the Text property.
  • 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.

csharp
using LightSide;
using UnityEngine;

public class Greeting : MonoBehaviour
{
    [SerializeField] UniText label;

    void Start()
    {
        label.Text = "Hello · مرحبا · नमस्ते · 👨‍👩‍👧‍👦";
    }
}

Questions

Is UniText free?

UniText 1.0.0 is open source under the MIT license and free for any project, including commercial ones. Current versions are sold as perpetual per-company licenses with full source access.

Does UniText work with UI Toolkit?

No. UniText renders on uGUI canvases and in world space. In UI Toolkit projects, Unity's Advanced Text Generator is the built-in option for complex scripts: opt-in in Unity 6.0 to 6.4 and announced as the default in 6.5.

Can I keep TextMesh Pro for some screens?

Yes. The two packages are independent, so screens can move one at a time.

Check it in your project

Run the browser demo, follow the setup guide, or compare the free version with the licenses.

Related problems