unity3d Unity GUI标签文本对齐问题

ao218c7q  于 2023-04-12  发布在  其他
关注(0)|答案(1)|浏览(360)

我在Unity3D中遇到了一个GUI.Label的问题。如果我在屏幕上显示一些文本,并在向下1个像素和向右1个像素处显示完全相同的字符串,它在99.9%的时间内正确工作:

var old=GUI.color;
        var shadow=rec;
        shadow.x++; shadow.y++;
        GUI.color=Color.black;
        GUI.Label(shadow, txt, style);
        GUI.color=old;
        GUI.Label(rec, txt, style);

我已经有了这个相同的代码多年,但我最近才发现,一个特定的字符串将在错误的地方 Package 文本的影子文本,即使它们的矩形宽度相同,样式也相同。更奇怪的是,它不会在每一帧都这样做。当我用鼠标悬停在某个东西上时,文本就会出现,轻轻移动鼠标会导致阴影字符串返回&第四,两种不同的 Package 方式导致阴影文本与正常彩色文本不一致。也不是屏幕边缘问题。我使用2020.2.1f1。
先谢谢你了!

dxpyg8gm

dxpyg8gm1#

我可能应该使用新的UI系统来在屏幕上显示文本和其他2D视觉效果,但是,对于那些像我一样仍然使用古老的GUI系统的人,这里是我对Unity的换行错误的最终解决方案。放弃它并切换到另一种方法并不容易。下面是我提出的一个可以阴影文本的函数。它可能会被清理和优化:

//Shadow text
if(Event.current.type==EventType.Layout) words = wordWrap(txt,style,(int)rec.width);

var old=GUI.color; var shadow=rec; shadow.x++; shadow.y++;
GUI.color=Color.black;
foreach(var line in words) {
   GUI.Label(shadow,line,style); shadow.y+=lastFontHgt;
}
GUI.color=old;
foreach(var line in words) {
   GUI.Label(rec,line,style); rec.y+=lastFontHgt;
}

int lastFontHgt=0;

//actual word-wrapping generation is in this function
List<string> wordWrap(string txt,GUIStyle style,int width) {
    var lines=new List<string>();
    if(txt==null||txt=="") return lines;
    var str="";
    var words=txt.Split(' ');
    var flag=false;
    for(int i=0;i<words.Length;i++) {
        var old=str;
        if(flag) str+=" "; str+=words[i];
        var size = style.CalcSize(new GUIContent(str)); lastFontHgt=(int)size.y;
        if(((int)size.x)>width) {
            if(!flag||old=="") { lines.Add(str); str=""; }
            else { lines.Add(old); str=words[i]; }
        } else flag=true;
    }
    if(str!="") lines.Add(str);
    return lines;
}

相关问题