Unity提供的两个获取文件宽高的方法 preferredWidth 和preferredHeight 必须是文字在Text组件中渲染出来以后才能取到。因为我们游戏的聊天框中是可以输入表情,所以图文混排工具需要支持自动换行的功能。那么这里问题就来了我需要提前获取Text的宽度,这样我才能知道文字什么时候进行换行。
总体来说和NGUI的思路完全一样。提前把文字渲到材质上,这样就可以取出来宽度了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
void Start () { Font font = Resources.Load<Font>("FZCQJW"); int fontsize=35; string text = "宣雨松MOMO"; font.RequestCharactersInTexture(text,fontsize,FontStyle.Normal); CharacterInfo characterInfo; float width=0f; for(int i=0; i<text.Length;i++){ font.GetCharacterInfo(text[i],out characterInfo,fontsize); //width+=characterInfo.width; unity5.x提示此方法将来要废弃 width+=characterInfo.advance; } Debug.Log("width : " + width); } |
- 本文固定链接: https://www.xuanyusong.com/archives/3587
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!
在1334*750分辨率下是准确的,在16:9的分辨率下就有很大差异,为什么会这样呢
找到原因了,因为Font.GetCharacterInfo(ch, out charInfo, FontSize, FontStyle);charInfo.advance获取到的只是在标准情况下的字体宽度.当Canvas设置了缩放时,实际的渲染宽度与advance会存在误差。TextGenerator.characters得到的坐标、宽度数据也会受到缩放的影响,除以缩放比率后可以获得实际的渲染宽度。
我是这么做的,可以用,但好像在拖动item的时候就崩溃了,提示渲染问题,有空可以帮我看看我这样写有什么问题。 static public int GetFontlen(string str) { int len = 0; Font font; font = Font.CreateDynamicFontFromOSFont(“Arial”, 25); font.RequestCharactersInTexture(str); for (int i = 0; i < str.Length; i ) { CharacterInfo ch; font.GetCharacterInfo(str , out ch); len = ch.advance; } return len; }
我是这么做的,可以用,但好像在拖动item的时候就崩溃了,提示渲染问题,有空可以帮我看看我这样写有什么问题。 static public int GetFontlen(string str) { int len = 0; Font font; font = Font.CreateDynamicFontFromOSFont(“Arial”, 25); font.RequestCharactersInTexture(str); for (int i = 0; i < str.Length; i++) { CharacterInfo ch; font.GetCharacterInfo(str , out ch); len += ch.advance; } return len; }
额 [ i ] 变成表情了
https://docs.unity3d.com/ScriptReference/TextGenerator.GetPreferredWidth.html 用这个方法吧, 更精准一些。
PreferredWidth这个以前试过 但还是放弃了 这个要等他绘制完后才能计算出来,所以要等下一帧,比如说你要根据文字的长度做气泡,那么用这个方法是不好的,因为你要用协程而且气泡会闪一下,不知道这个GetPreferredWidth 和PreferredWidth是否一样。
text. PreferredWidth 不用等帧 如果外面你挂了ContentSizeFitter 你可以参照http://www.xuanyusong.com/archives/4234 也不用等一帧
这个并不是很准确 比如18号字下,一个汉字advance算出的是18,但是Text.preferredWidth是16.9,字多了后误差就比较大可以用TextGenerator里面的方法来算宽度
感谢回复。。 你说的是 https://docs.unity3d.com/ScriptReference/TextGenerator.GetPreferredWidth.html 这个方法吧。。
这个方法我今天测试过了,还是不够精确,比如算出来是18,但是界面显示的preferredWidth是21.5
这块可以参考ugui的源码,还有一些参数, 这个前几天我试了一下, 很精准
确实不精准,不知道为什么,MOMO能解答下?
不知道是不是某些字体的原因,我项目一直都是用这个方法取宽度 来做图文混排换行的。
Text.preferredWidth
Text.preferredHeight
大神,求图文混排的代码。不甚感激
https://github.com/LingJiJian/uLui/
吊炸天啊.
momo大神,你好,请问现在5.1版本下的ugui已经可以用来代替ngui开发项目了么…目前立项阶段有点犹豫
可以的。
换行不是看长度么。。。
长度不太准, 比如数字和汉字宽度不太一样。。
你好MoMo,我是你的新粉丝。有个问题想请教,希望闲得难受的时候帮我看看:void Start() { wheelJoint = backWheel.GetComponent();//获取WheelJoint2D //获取JointMotor2D motor = wheelJoint.motor; } public void backward() { if(wheelJoint.useMotor) { if (motor.motorSpeed > -maxSpeed) { motor.motorSpeed -= 50.0f; } } Debug.Log(“Speed = ” motor.motorSpeed); }log出的MotorSpeed正常,但是却没什么效果。在Unity编辑器中直接调可以
你好MoMo,我是你的新粉丝。有个问题想请教,希望闲得难受的时候帮我看看:void Start() { wheelJoint = backWheel.GetComponent();//获取WheelJoint2D //获取JointMotor2D motor = wheelJoint.motor; } public void backward() { if(wheelJoint.useMotor) { if (motor.motorSpeed > -maxSpeed) { motor.motorSpeed -= 50.0f; } } Debug.Log(“Speed = ” + motor.motorSpeed); }log出的MotorSpeed正常,但是却没什么效果。在Unity编辑器中直接调可以
抱歉 这个我也没研究过, 没在项目里用过~