Quick answer: The most common cause is missing TMP Essential Resources. When you first add a TextMeshPro component, Unity prompts you to import these resources. If you dismissed the prompt, go to Window > TextMeshPro > Import TMP Essential Resources.
Here is how to fix Unity TextMeshPro text not showing. You added a TextMeshPro component to your scene, typed in some text, but nothing appears. The text is invisible — no errors, no warnings, just a blank space where your UI text should be. This is one of the most frustrating issues for Unity developers because TMP works completely differently from the legacy Text component, and there are at least six different reasons the text might not render.
The Symptom
You create a UI element using GameObject > UI > Text - TextMeshPro or add a TextMeshProUGUI component to an existing GameObject. You type text into the text field in the Inspector, but nothing appears in the Game view or Scene view. Alternatively, you may see placeholder text in the editor but it vanishes at runtime, or certain characters display as squares or rectangles instead of the correct glyphs.
In some cases, the text was working previously but disappeared after you changed a font, modified the Canvas, or updated TextMeshPro to a newer version. The text object is clearly there in the Hierarchy — selecting it shows the RectTransform gizmo — but the rendered text is invisible.
What Causes This
TextMeshPro requires several pieces to be correctly configured before text will render. The most common causes of invisible TMP text are:
- Missing TMP Essential Resources — TextMeshPro requires its shader and default font assets to be imported into your project. When you first add a TMP component, Unity shows an import prompt. If you dismissed it, the default font and materials are missing, and all TMP text will be invisible.
- Font atlas not generated or missing characters — TMP fonts use a pre-rendered Signed Distance Field (SDF) atlas. If the atlas does not contain the characters you are trying to display, those characters will not render. This is especially common with non-Latin character sets like CJK, Arabic, or Cyrillic.
- Wrong material or shader — TMP components require materials that use TMP-specific shaders (e.g.,
TextMeshPro/Mobile/Distance Field). If you accidentally assign a standard material or a corrupted TMP material, the text will not render. - RectTransform has zero size — If the RectTransform width or height is zero, there is no area to render text in. This can happen when anchors are misconfigured or when creating TMP objects via script without setting the
sizeDelta. - Sorting order or Canvas issues — The text may be rendering behind another UI element, behind the camera, or on a Canvas that is not set up. A Canvas needs a
CanvasScalerand aGraphicRaycasterto function properly in most setups. - Text color alpha is zero — The text color might be set to fully transparent (alpha = 0), or the vertex color might be overridden by a parent
CanvasGroupwith alpha set to zero.
The Fix
Step 1: Import TMP Essential Resources and verify the font asset. Go to Window > TextMeshPro > Import TMP Essential Resources. This imports the default font (LiberationSans SDF), the required shaders, and default materials. Then check that your TextMeshPro component has a valid Font Asset assigned in the Inspector.
using UnityEngine;
using TMPro;
public class TMPDebugger : MonoBehaviour
{
private void Start()
{
TextMeshProUGUI tmp = GetComponent<TextMeshProUGUI>();
if (tmp == null)
{
Debug.LogError("No TextMeshProUGUI component found!");
return;
}
// Check font asset
if (tmp.font == null)
{
Debug.LogError("TMP Font Asset is NULL. Import TMP Essential Resources " +
"via Window > TextMeshPro > Import TMP Essential Resources.");
return;
}
Debug.Log("Font: " + tmp.font.name);
Debug.Log("Font has atlas: " + (tmp.font.atlasTexture != null));
Debug.Log("Material: " + (tmp.fontMaterial != null ? tmp.fontMaterial.name : "NULL"));
Debug.Log("Shader: " + (tmp.fontMaterial != null ? tmp.fontMaterial.shader.name : "N/A"));
}
}
Step 2: Fix the RectTransform size and Canvas setup. Select the TMP GameObject and check the RectTransform in the Inspector. The width and height must both be greater than zero. If you are creating TMP objects from code, you must set the sizeDelta explicitly. Also confirm that the TMP object is a child of a Canvas with a properly configured CanvasScaler.
using UnityEngine;
using TMPro;
public class CreateTMPText : MonoBehaviour
{
public TMP_FontAsset fontAsset;
private void Start()
{
// Ensure there is a Canvas in the scene
Canvas canvas = FindObjectOfType<Canvas>();
if (canvas == null)
{
GameObject canvasObj = new GameObject("Canvas");
canvas = canvasObj.AddComponent<Canvas>();
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
canvasObj.AddComponent<UnityEngine.UI.CanvasScaler>();
canvasObj.AddComponent<UnityEngine.UI.GraphicRaycaster>();
}
// Create the TMP object
GameObject textObj = new GameObject("DynamicText");
textObj.transform.SetParent(canvas.transform, false);
TextMeshProUGUI tmp = textObj.AddComponent<TextMeshProUGUI>();
// CRITICAL: Set a non-zero size for the RectTransform
RectTransform rt = tmp.GetComponent<RectTransform>();
rt.sizeDelta = new Vector2(400f, 100f);
// Assign font and set text
if (fontAsset != null)
tmp.font = fontAsset;
tmp.text = "Hello, World!";
tmp.fontSize = 36;
tmp.color = Color.white;
tmp.alignment = TextAlignmentOptions.Center;
}
}
Step 3: Check sorting order, material, and color alpha. If the text is behind another element, adjust the sorting order on the Canvas or reorder the elements in the Hierarchy (later children render on top). Verify that the text color has an alpha value above zero and that no parent CanvasGroup is setting alpha to zero.
using UnityEngine;
using TMPro;
public class TMPVisibilityChecker : MonoBehaviour
{
private void Start()
{
TextMeshProUGUI tmp = GetComponent<TextMeshProUGUI>();
if (tmp == null) return;
// Check text color alpha
if (tmp.color.a < 0.01f)
{
Debug.LogWarning("TMP text color alpha is near zero! Text is invisible.");
tmp.color = new Color(tmp.color.r, tmp.color.g, tmp.color.b, 1f);
}
// Check for CanvasGroup hiding the text
CanvasGroup group = GetComponentInParent<CanvasGroup>();
if (group != null && group.alpha < 0.01f)
{
Debug.LogWarning("Parent CanvasGroup alpha is near zero!");
}
// Verify the material uses a TMP shader
if (tmp.fontMaterial != null)
{
string shaderName = tmp.fontMaterial.shader.name;
if (!shaderName.Contains("TextMeshPro"))
{
Debug.LogError("TMP material uses wrong shader: " + shaderName +
". It must use a TextMeshPro shader.");
}
}
// Check RectTransform
RectTransform rt = GetComponent<RectTransform>();
if (rt.rect.width < 1f || rt.rect.height < 1f)
{
Debug.LogWarning("RectTransform is too small: " +
rt.rect.width + " x " + rt.rect.height);
}
}
}
If you are using a custom font, make sure you created the TMP Font Asset correctly. Go to Window > TextMeshPro > Font Asset Creator, select your source .ttf or .otf file, choose the appropriate character set (ASCII for English, or Extended ASCII / Unicode Range for other languages), set the atlas resolution (2048x2048 is usually sufficient), and click Generate Font Atlas. Then click Save to create the asset. Assign this font asset to your TMP component.
Related Issues
See also: Fix: Unity Camera Not Rendering or Showing Black Screen.
See also: Fix: Unity ScriptableObject Data Lost After Exiting Play Mode.
Import TMP Essential Resources first, then check font, size, and alpha.