首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用TextGenerator.GetPreferredHL.8/Width不工作获取文本维度

使用TextGenerator.GetPreferredHL.8/Width不工作获取文本维度
EN

Game Development用户
提问于 2022-07-26 21:19:00
回答 1查看 45关注 0票数 0

我正在使用Unity2021.3.3f1,并试图以一个sprite作为背景,在该弹出窗口中,这个sprite的大小可以调整到适合文本的大小。

据我所知,UnityEngine.UI.TextGenerator应该能够给我提供必要的雪碧维度,给出一个输入字符串和一些TextGenerationSettings

这是我正在使用的代码。

代码语言:javascript
运行
复制
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的行提供了以下输出:

代码语言:javascript
运行
复制
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的情况也是一样

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

结论

调试日志1

generator.GetPreferredWidth为每个字符增加了7的首选宽度(每个空格为4),而generator.GetPreferredHeight为每个字符的首选高度增加了15 (不知道为什么),GetPreferredWidthGetPreferredHeight也没有以任何合理的方式计算换行符。

调试日志2

generator.rectExtents.width对每个字符的增量为7(每个空格为4),但generator.rectExtents.height根本没有增加(因此,没有换行或有效的高度读数)。

调试日志3

这个(可能是预期的)总是输出20,20 (即,无论textGenSetting.generationExtents设置为什么)。无论如何,我尝试过这一点,因为我认为generator.Populate()可能会更新textGenSetting结构的这个值。

问题:我是不是遗漏了什么?或者,这在某种程度上是预期的行为?我如何使它工作,或者,或者,使用其他方式自动布局文本,并获得所述文本的范围,以便我可以调整我的精灵来适应这个文本?

这是我的文本设置,以获得完整的信息。

EN

回答 1

Game Development用户

发布于 2022-07-26 22:26:03

韦尔普,写完这篇文章后,尽管我以前做过相当多的研究,但我终于找到了答案。将我的RecalculateText方法更改为下面的方法是有效的,尽管我还没有研究我以前的方法哪里出错了。

代码语言:javascript
运行
复制
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);
    }

值得称赞的是,在统一论坛上的pineda100,他的对类似问题的回答提供了上面的片段。

票数 0
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/201917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档