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:

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.