UGUI Text.preferredWidth计算bug修复

转载https://www.jianshu.com/p/a9594923b16e

UnityEngine.UI.Text.cs:
public float pixelsPerUnit
        {
            get
            {
                var localCanvas = canvas;
                if (!localCanvas)
                    return 1;
                // For dynamic fonts, ensure we use one pixel per pixel on the screen.
                if (!font || font.dynamic)
                    return localCanvas.scaleFactor;
                // For non-dynamic fonts, calculate pixels per unit based on specified font size relative to font object's own font size.
                if (m_FontData.fontSize <= 0 || font.fontSize <= 0)
                    return 1;
                return font.fontSize / (float)m_FontData.fontSize;
            }
        }

public virtual float preferredWidth
        {
            get
            {
                var settings = GetGenerationSettings(Vector2.zero);
                return cachedTextGeneratorForLayout.GetPreferredWidth(m_Text, settings) / pixelsPerUnit;
            }
        }

遇到当给Text.text赋值后,直接获取preferredWidth的值是不正确的,一帧后再获取preferredWidth结果才是正确的。调试发现pixelsPerUnit一帧前后的值都不相同,只要以一帧后的pixelsPerUnit去计算preferredWidth即可。

public class GameText : UnityEngine.UI.Text 
{
    public float GetPreferredWidth(float scaleFactor)
    {
        var settings = GetGenerationSettings(Vector2.zero);
        settings.scaleFactor = scaleFactor;
        return cachedTextGeneratorForLayout.GetPreferredWidth(m_Text, settings) / scaleFactor;
    }
}

假设Canvas Reference Resolution为960x640,以高适应,在1280x720分辨率下scaleFactor=720/640 值为1.125。最终调用逻辑为text. GetPreferredWidth(720/640)。如以宽适应,原理类似。



作者:dumpling2017
链接:https://www.jianshu.com/p/a9594923b16e
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

猜你喜欢

转载自blog.csdn.net/chqj_163/article/details/82859231
今日推荐