Как рассчитать авторазмер для групповых кнопок в Unity3D - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть группа горизонтальной разметки кнопок с TextMeshPro. Как я могу рассчитать шрифт автоматического изменения размера для него и установить минимальное значение для всех кнопок? Это нужно для относительного UI.

У меня сейчас:

enter image description here

И как я хочу: enter image description here

Я попробовал этот код:

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;
    }

}

Но он не работает при запуске и работает только в методе обновления. Но когда я использовал его в методе Update, я вижу, когда меняется размер шрифта текста. Это быстро, но я хочу сделать это до того, как панель будет отображаться.

Панель вопросов не активна по умолчанию

enter image description here

AnswerOptionsPanel:

enter image description here

TextMeshPro Текст в AnswerOptionsPanel:

enter image description here

1 Ответ

0 голосов
/ 06 ноября 2019

С помощью этого метода вы можете получить текущий размер текстовых активов;

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;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...