UGUI Text.preferredWidth计算bug修复

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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值