我在 UnityEngine 中有一个 TextMesh,它在 2D 平台游戏的游戏场景中显示文本。
我现在想向白色文本添加一个黑色背景矩形。它必须与文本具有相同的大小(加上一些填充)。
这就是我尝试创建它的方式
Renderer textRenderer = textMesh.GetComponent<Renderer>();
Vector3 textSize = textRenderer.bounds.size;
GameObject result = new GameObject("BackgroundRectangle");
SpriteRenderer spriteRenderer = result.AddComponent<SpriteRenderer>();
Texture2D texture = new Texture2D(1, 1);
texture.SetPixel(0, 0, Color.black);
texture.Apply();
Rect rect = new Rect(0, 0, textSize.x + 0.3f, textSize.y + 0.1f);
Vector2 pivot = new Vector2(0.5f, 0.5f);
Sprite sprite = Sprite.Create(texture, rect, pivot);
spriteRenderer.sprite = sprite;
spriteRenderer.transform.localScale = new Vector3(textSize.x + 0.3f, textSize.y + 0.1f, 1.0f);
result.transform.localScale = new Vector3(textSize.x + 0.3f, textSize.y + 0.1f, 1.0f);
这不会画任何东西。如果我尝试
Texture2D texture = new Texture2D(1, 1);
并将其设置为例如
Texture2D texture = new Texture2D(100, 100);
它画了一个矩形。所以我想我必须这样使用它?或者有什么其他办法可以解决吗?
我设置纹理尺寸时遇到的问题是文本边界以引擎单位为单位,而纹理尺寸以像素为单位。
使用 3D Quad 也可以。但由于这是一款 2D 游戏,我想将所有内容放在适当的排序层中,以便在所有情况下获得正确的绘图顺序。这对于 3D 对象来说是不可能的。
也尝试过使用GenAI来修复它,但那东西也没有任何线索。
Sprite.Create
有更多参数,其中pixelsPerUnit
!
默认情况下,这是afaik
100f
,这意味着例如尺寸为 Texture2D
的 100 x 100
将产生世界单位尺寸为 1 x 1
的正方形。但你基本上可以选择并传入任何
所以这应该是足够的信息来计算所需的像素尺寸通过这样做
var backgroundPixelSize = textSize * desiredPixelsPerUnit;
然后将相同的因子传入
Sprite sprite = Sprite.Create(texture, rect, pivot, desiredPixelsPerUnit);