You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Unity中通过代码创建可正常显示的UI文本元素?

Unity动态生成Text组件不显示的解决方法

问题原因

代码遗漏了UGUI渲染的必要依赖和参数配置,核心问题如下:

  • 生成的Text对象未挂载到Canvas下:所有UGUI组件必须是Canvas节点的子物体,才能被UI渲染管线正常绘制
  • RectTransform参数未正确配置:Text依赖的RectTransform默认尺寸、锚点参数异常,直接赋值世界坐标也不符合UGUI的坐标规则
  • 字体、颜色等显示属性存在隐患:默认Text颜色为白色,若背景同色会被遮挡,动态加载的系统字体也可能存在加载失败的问题

解决步骤

  1. 先获取场景中已存在的Canvas对象,将生成的Text设为Canvas的子节点
  2. 配置RectTransform的锚点、尺寸、位置参数,用anchoredPosition代替世界坐标position赋值
  3. 显式指定Text的颜色,校验字体和材质的可用性

修正后代码

private void DrawIndexNumber()
{
    // 先获取场景中的Canvas,也可以提前缓存Canvas引用
    Canvas canvas = FindObjectOfType<Canvas>();
    if (canvas == null)
    {
        Debug.LogError("场景中不存在Canvas,请先创建Canvas");
        return;
    }

    // 创建Text对象并挂载到Canvas下
    GameObject textObj = new GameObject("Ind");
    textObj.transform.SetParent(canvas.transform, false);
    Text txt = textObj.AddComponent<Text>();
    
    // 配置RectTransform参数
    RectTransform rect = txt.GetComponent<RectTransform>();
    rect.sizeDelta = new Vector2(100, 30); // 设置文本框大小
    rect.anchoredPosition = _posOfOrigin; // 如果_posOfOrigin是世界坐标需要先转成UGUI的局部坐标
    
    // 配置显示属性
    txt.material = materialNum;
    // 优先用项目中已导入的字体,动态创建字体增加判空兜底
    Font arialFont = Font.CreateDynamicFontFromOSFont("arial", 16);
    txt.font = arialFont == null ? Resources.GetBuiltinResource<Font>("LegacyRuntime.ttf") : arialFont;
    txt.color = Color.black; // 显式指定字体颜色,避免和背景同色
    txt.text = "TEST";
}

额外排查点

  • 如果还是不显示,检查materialNum是否是支持UI的默认材质,没有特殊需求可以不赋值material,用默认材质即可
  • 检查Canvas的渲染模式,如果是World Space模式,需要确保Text的z轴坐标在摄像机的裁剪范围内
  • 检查是否有其他UI组件遮挡了生成的Text

内容的提问来源于stack exchange,提问作者Yann Bernard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 09:24:04