我正在使用Unity2021.3.3f1,并试图以一个sprite作为背景,在该弹出窗口中,这个sprite的大小可以调整到适合文本的大小。
据我所知,UnityEngine.UI.TextGenerator
应该能够给我提供必要的雪碧维度,给出一个输入字符串和一些TextGenerationSettings
。
这是我正在使用的代码。
public class PopUp : MonoBehaviour
{
UnityEngine.UI.Text text;
TextGenerationSettings textGenSetting;
TextGenerator generator
void Start()
{
generator = new TextGenerator();
textGenSetting.generationExtents = new Vector2(20f, 20f);
}
void Update()
{
RecalculateText();
}
private void RecalculateText()
{
textGenSetting.fontSize = text.fontSize;
textGenSetting.alignByGeometry = text.alignByGeometry;
textGenSetting.color = text.color;
textGenSetting.fontStyle = text.fontStyle;
textGenSetting.resizeTextForBestFit = text.resizeTextForBestFit;
textGenSetting.resizeTextMaxSize = text.resizeTextMaxSize;
textGenSetting.resizeTextMinSize = text.resizeTextMinSize;
textGenSetting.richText = text.supportRichText;
textGenSetting.horizontalOverflow = text.horizontalOverflow;
textGenSetting.verticalOverflow = text.verticalOverflow;
textGenSetting.updateBounds = true;
textGenSetting.font = text.font;
textGenSetting.lineSpacing = text.lineSpacing;
var newHeight = generator.GetPreferredHeight(text.text, textGenSetting);
var newWidth = generator.GetPreferredWidth(text.text, textGenSetting);
var newRect = generator.rectExtents;
//Debug Log 1
Debug.Log(string.Format("newWidth: {0}, newHeight: {1}, numLinesGenerated: {2}", newWidth, newHeight, generator.lineCount));
//Debug Log 2
Debug.Log(string.Format("newRectWidth: {0}, newRectHeight: {1}, numLinesGenerated: {2}", newRect.width, newRect.height, generator.lineCount));
//Debug Log 3
Debug.Log(string.Format("generationExtents: width {0}, height: {1}, numLinesGenerated: {2}", textGenSetting.generationExtents.x, textGenSetting.generationExtents.y, generator.lineCount));
}
}
由于我不确定哪个方法/字段应该为任何给定的文本提供正确的高度和宽度,所以我要将多个字段/方法结果打印到控制台。
然而,所有这些都没有产生预期的结果。
Debug Log 1
当我有一个空字符串("")、一个带有一个字符的字符串("a")、一个带有两个字符的字符串("aa")和一个长字符串(在可能的换行之间有大量空格)时,上面标记为//Debug Log 1
的行提供了以下输出:
Text is : . newWidth: 0, newHeight: 15, numLinesGenerated: 1
Text is : a. newWidth: 7, newHeight: 30, numLinesGenerated: 1
Text is : aa. newWidth: 14, newHeight: 45, numLinesGenerated: 1
Text is : Nam a tempor lorem. Ut eleifend, massa sed tincidunt blandit, risus nunc pharetra orci, at mattis turpis augue eu eros. Aliquam a faucibus dolor. Vestibulum ultrices turpis quis mi aliquam, a facilisis metus rutrum. Nulla sodales, ante vitae maximus fringilla, tellus erat ultricies felis, ac sodales felis lorem nec lorem. Fusce cursus turpis odio, vel tristique justo pulvinar sed. Nunc efficitur, ante ac mollis pretium, elit felis elementum lorem, vitae porttitor ex arcu vulputate ante. Donec elit purus, porta nec tortor vitae, semper suscipit sem. Ut ante dui, lobortis vel nulla vitae, condimentum laoreet magna. Maecenas aliquet aliquet nulla a fringilla. Proin rhoncus est eget nunc venenatis tempus. Praesent rhoncus est et velit gravida, non posuere justo scelerisque. Praesent ultrices lectus quis quam iaculis faucibus quis id sem. Quisque enim massa, molestie ac tortor sit amet, porta tristique diam. Suspendisse potenti. Fusce rutrum massa metus, eu facilisis nisi luctus vel.. newWidth: 5634, newHeight: 12675, numLinesGenerated: 1
Debug Log 2
//Debug Log 2
的情况也是一样
Text is: . newRectWidth: 0, newRectHeight: 15, numLinesGenerated: 1
Text is: a. newRectWidth: 7, newRectHeight: 15, numLinesGenerated: 1
Text is: aa. newRectWidth: 14, newRectHeight: 15, numLinesGenerated: 1
Text is: Nam a tempor lorem. Ut eleifend, massa sed tincidunt blandit, risus nunc pharetra orci, at mattis turpis augue eu eros. Aliquam a faucibus dolor. Vestibulum ultrices turpis quis mi aliquam, a facilisis metus rutrum. Nulla sodales, ante vitae maximus fringilla, tellus erat ultricies felis, ac sodales felis lorem nec lorem. Fusce cursus turpis odio, vel tristique justo pulvinar sed. Nunc efficitur, ante ac mollis pretium, elit felis elementum lorem, vitae porttitor ex arcu vulputate ante. Donec elit purus, porta nec tortor vitae, semper suscipit sem. Ut ante dui, lobortis vel nulla vitae, condimentum laoreet magna. Maecenas aliquet aliquet nulla a fringilla. Proin rhoncus est eget nunc venenatis tempus. Praesent rhoncus est et velit gravida, non posuere justo scelerisque. Praesent ultrices lectus quis quam iaculis faucibus quis id sem. Quisque enim massa, molestie ac tortor sit amet, porta tristique diam. Suspendisse potenti. Fusce rutrum massa metus, eu facilisis nisi luctus vel.. newRectWidth: 5634, newRectHeight: 15, numLinesGenerated: 1
Debug Log 3
这里是为了Debug Log 3
Text is: . generationExtents: width 20, height: 20, numLinesGenerated: 1
Text is: a. generationExtents: width 20, height: 20, numLinesGenerated: 1
Text is: aa. generationExtents: width 20, height: 20, numLinesGenerated: 1
Text is: Nam a tempor lorem. Ut eleifend, massa sed tincidunt blandit, risus nunc pharetra orci, at mattis turpis augue eu eros. Aliquam a faucibus dolor. Vestibulum ultrices turpis quis mi aliquam, a facilisis metus rutrum. Nulla sodales, ante vitae maximus fringilla, tellus erat ultricies felis, ac sodales felis lorem nec lorem. Fusce cursus turpis odio, vel tristique justo pulvinar sed. Nunc efficitur, ante ac mollis pretium, elit felis elementum lorem, vitae porttitor ex arcu vulputate ante. Donec elit purus, porta nec tortor vitae, semper suscipit sem. Ut ante dui, lobortis vel nulla vitae, condimentum laoreet magna. Maecenas aliquet aliquet nulla a fringilla. Proin rhoncus est eget nunc venenatis tempus. Praesent rhoncus est et velit gravida, non posuere justo scelerisque. Praesent ultrices lectus quis quam iaculis faucibus quis id sem. Quisque enim massa, molestie ac tortor sit amet, porta tristique diam. Suspendisse potenti. Fusce rutrum massa metus, eu facilisis nisi luctus vel.. generationExtents: width 20, height: 20, numLinesGenerated: 1
generator.GetPreferredWidth
为每个字符增加了7的首选宽度(每个空格为4),而generator.GetPreferredHeight
为每个字符的首选高度增加了15 (不知道为什么),GetPreferredWidth
和GetPreferredHeight
也没有以任何合理的方式计算换行符。
generator.rectExtents.width
对每个字符的增量为7(每个空格为4),但generator.rectExtents.height
根本没有增加(因此,没有换行或有效的高度读数)。
这个(可能是预期的)总是输出20,20 (即,无论textGenSetting.generationExtents
设置为什么)。无论如何,我尝试过这一点,因为我认为generator.Populate()
可能会更新textGenSetting
结构的这个值。
这是我的文本设置,以获得完整的信息。
发布于 2022-07-26 22:26:03
韦尔普,写完这篇文章后,尽管我以前做过相当多的研究,但我终于找到了答案。将我的RecalculateText方法更改为下面的方法是有效的,尽管我还没有研究我以前的方法哪里出错了。
private void RecalculateText(string sText)
{
TextGenerator textGen = new TextGenerator();
TextGenerationSettings tgSettings = text.GetGenerationSettings(text.rectTransform.rect.size);
var width = textGen.GetPreferredWidth(text.text, tgSettings);
var height = textGen.GetPreferredHeight(text.text, tgSettings);
}
https://gamedev.stackexchange.com/questions/201917
复制相似问题