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)。如以宽适应,原理类似。
网友评论