【问题标题】:How calculate autosize for group buttons in Unity3D如何计算 Unity3D 中组按钮的自动大小
【发布时间】:2020-03-03 06:14:09
【问题描述】:

我有带有 TextMeshPro 的按钮的水平布局组。如何计算自动调整字体大小并在所有按钮上设置最小值?它需要相对的 UI。

我现在有:

以及我想要的方式:

我试过这段代码:

public class FontSizeController: MonoBehaviour
{
    private void Start()
    {
        SetMinFontForAnswers(transform,
            FindMinFontSizeAnswerOptions(transform));
    }

    private void SetMinFontForAnswers(Transform answerPanel, float minFontSize)
    {
        for (var answerIndex = 0; answerIndex < answerPanel.childCount; answerIndex++)
        {
            var meshProUgui = answerPanel.GetChild(answerIndex).GetChild(1).GetComponent<TextMeshProUGUI>();
            meshProUgui.fontSize = minFontSize;
        }
    }

    private float FindMinFontSizeAnswerOptions(Transform answerOptions)
    {
        var minFontSize = -1f;

        for (var answerIndex = 0; answerIndex < answerOptions.childCount; answerIndex++)
        {
            var component = answerOptions.GetChild(answerIndex).GetChild(1).GetComponent<TextMeshProUGUI>();
            component.enableAutoSizing = true;
            component.ForceMeshUpdate();
            if (IsAnswerOptionActive(answerOptions, answerIndex) && IsMinFontSizeOrNotInitialized(component, minFontSize))
            {
                minFontSize = component.fontSize;
            }

            component.enableAutoSizing = false;
        }

        return minFontSize;
    }

    private bool IsAnswerOptionActive(Transform answerOptions, int answerIndex)
    {
        return answerOptions.GetChild(answerIndex).gameObject.activeSelf;
    }
    private bool IsMinFontSizeOrNotInitialized(TMP_Text textComponent, float minFontSize)
    {
        return textComponent.fontSize < minFontSize || minFontSize == -1f;
    }

}

但它不适用于 Start 并且仅适用于 Update 方法。但是当我在 Update 方法中使用它时,我可以看到文本字体大小何时发生变化。这很快,但我想在面板渲染之前这样做。

问题面板默认不活动

答案选项面板:

AnswerOptionsPanel 中的TextMeshPro 文本:

【问题讨论】:

  • 您的请求令人困惑。您是在问如何删除文本的自动调整大小?
  • 不,我想使用自动调整大小来为所有按钮找到最佳字体大小,并在所有按钮上设置最小找到的字体大小值。

标签: c# user-interface unity3d


【解决方案1】:

您可以使用此方法获取文本资源的当前大小;

Text.cachedTextGenerator.fontSizeUsedForBestFit

您可以比较您的文本即时大小,然后更改。 例如;

UnityEngine.UI.Text[] myTexts;

void OptimiseTextSizes()
{

    int minSize = 999;
    foreach (UnityEngine.UI.Text t in myTexts)
    {
        if (t.cachedTextGenerator.fontSizeUsedForBestFit < minSize)
        {
            minSize = t.cachedTextGenerator.fontSizeUsedForBestFit;
        }
    }

    foreach (UnityEngine.UI.Text t in myTexts)
    {
        t.resizeTextMaxSize = minSize;
    }

}

【讨论】:

  • 我可以和TextMeshPro一起使用吗?
  • 是的,你可以使用。
  • 可以在TextMeshPro中看到优化后的大小,如下所示; text.fontSize
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多