如何在Unity中通过代码创建可正常显示的UI文本元素?
Unity动态生成Text组件不显示的解决方法
问题原因
代码遗漏了UGUI渲染的必要依赖和参数配置,核心问题如下:
- 生成的Text对象未挂载到Canvas下:所有UGUI组件必须是Canvas节点的子物体,才能被UI渲染管线正常绘制
- RectTransform参数未正确配置:Text依赖的RectTransform默认尺寸、锚点参数异常,直接赋值世界坐标也不符合UGUI的坐标规则
- 字体、颜色等显示属性存在隐患:默认Text颜色为白色,若背景同色会被遮挡,动态加载的系统字体也可能存在加载失败的问题
解决步骤
- 先获取场景中已存在的Canvas对象,将生成的Text设为Canvas的子节点
- 配置RectTransform的锚点、尺寸、位置参数,用
anchoredPosition代替世界坐标position赋值 - 显式指定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
相关产品推荐
相关产品推荐

