首页 > Unity3D频道 > 【UGUI研究院】 > UGUI研究院之提前获取Text的宽度(十九)
2015
07-30

UGUI研究院之提前获取Text的宽度(十九)

Unity提供的两个获取文件宽高的方法 preferredWidth 和preferredHeight 必须是文字在Text组件中渲染出来以后才能取到。因为我们游戏的聊天框中是可以输入表情,所以图文混排工具需要支持自动换行的功能。那么这里问题就来了我需要提前获取Text的宽度,这样我才能知道文字什么时候进行换行。

总体来说和NGUI的思路完全一样。提前把文字渲到材质上,这样就可以取出来宽度了。

 

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

UGUI研究院之提前获取Text的宽度(十九)》有 25 条评论

  1. 小9 说:

    在1334*750分辨率下是准确的,在16:9的分辨率下就有很大差异,为什么会这样呢

    • 小9 说:

      找到原因了,因为Font.GetCharacterInfo(ch, out charInfo, FontSize, FontStyle);charInfo.advance获取到的只是在标准情况下的字体宽度.当Canvas设置了缩放时,实际的渲染宽度与advance会存在误差。TextGenerator.characters得到的坐标、宽度数据也会受到缩放的影响,除以缩放比率后可以获得实际的渲染宽度。

  2. sool 说:

    我是这么做的,可以用,但好像在拖动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 UGUI研究院之提前获取Text的宽度(十九) - 雨松MOMO程序研究院 - 1 , out ch); len = ch.advance; } return len; }

  3. sool 说:

    我是这么做的,可以用,但好像在拖动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 UGUI研究院之提前获取Text的宽度(十九) - 雨松MOMO程序研究院 - 1 , out ch); len += ch.advance; } return len; }

  4. Kill Console 说:

    这个并不是很准确 比如18号字下,一个汉字advance算出的是18,但是Text.preferredWidth是16.9,字多了后误差就比较大可以用TextGenerator里面的方法来算宽度

  5. Text.preferredWidth
    Text.preferredHeight

  6. 邓哞哞 说:

    大神,求图文混排的代码。不甚感激

  7. 灰灰 说:

    momo大神,你好,请问现在5.1版本下的ugui已经可以用来代替ngui开发项目了么…目前立项阶段有点犹豫 UGUI研究院之提前获取Text的宽度(十九) - 雨松MOMO程序研究院 - 1

  8. 换行不是看长度么。。。

  9. MoMo的粉丝 说:

    你好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编辑器中直接调可以

  10. MoMo的粉丝 说:

    你好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编辑器中直接调可以

留下一个回复

你的email不会被公开。