Unity中如何绘制与TextMesh尺寸匹配(带内边距)的黑色矩形?
Unity 2D中为TextMesh添加匹配尺寸的黑色背景矩形
原代码问题分析
- 混淆Sprite像素坐标与世界单位:创建Sprite时传入的
Rect参数是纹理像素范围,但你用了TextMesh的世界单位尺寸(textSize.x +0.3f),远大于1x1纹理的像素范围,导致Sprite无法正确渲染。 - 冗余缩放设置:同时修改
spriteRenderer.transform.localScale和result.transform.localScale,属于重复操作。 - 未处理文本与背景的位置对齐、排序层适配。
修复后的完整代码
TextMesh textMesh = GetComponent<TextMesh>(); Renderer textRenderer = textMesh.GetComponent<Renderer>(); Vector3 textSize = textRenderer.bounds.size; // 自定义背景内边距,可按需调整 float paddingX = 0.3f; float paddingY = 0.1f; Vector2 backgroundSize = new Vector2(textSize.x + paddingX, textSize.y + paddingY); // 创建背景GameObject GameObject background = new GameObject("TextBackground"); SpriteRenderer bgRenderer = background.AddComponent<SpriteRenderer>(); // 创建1x1纯色纹理(无需放大尺寸,靠UV拉伸实现任意大小) Texture2D texture = new Texture2D(1, 1); texture.SetPixel(0, 0, Color.black); texture.Apply(); // 关键:Sprite的Rect使用纹理全部像素范围(0到1像素) Sprite bgSprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f)); bgRenderer.sprite = bgSprite; // 通过缩放控制背景的世界单位尺寸 bgRenderer.transform.localScale = new Vector3(backgroundSize.x, backgroundSize.y, 1f); // 对齐背景与文本位置 background.transform.position = textMesh.transform.position; // 确保背景在文本下方(复用TextMesh的排序层,排序顺序减1) bgRenderer.sortingLayerName = textRenderer.sortingLayerName; bgRenderer.sortingOrder = textRenderer.sortingOrder - 1; // 可选:同步文本的旋转/缩放,将背景设为文本子对象自动跟随 background.transform.rotation = textMesh.transform.rotation; background.transform.parent = textMesh.transform;
核心说明
- Sprite创建逻辑:Sprite的
Rect仅定义纹理截取的像素区域,1x1纹理直接使用new Rect(0,0,1,1),通过localScale控制世界空间尺寸,彻底区分像素与世界单位。 - 2D排序适配:利用
SpriteRenderer的sortingLayerName和sortingOrder属性,完美适配2D场景的排序需求,解决3D Quad无法设置排序层的问题。 - 自动同步变换:将背景设为TextMesh的子对象,可自动跟随文本的移动、旋转等操作,无需额外维护位置关系。
内容的提问来源于stack exchange,提问作者VidyaNeedsBetterTesting
相关产品推荐
相关产品推荐

