zoukankan      html  css  js  c++  java
  • unity5.5 ugui使用美术字

    文件转载自:http://www.jianshu.com/p/a4e6d1ca3ca0

    项目需要使用美术字加强战斗效果表现,按以往NGUI的使用经验,这个应该很简单,随便Google一下都有数篇技术博客,比如这篇Unity教程之-UGUI美术字体的制作与使用

    按照博客操作了一遍,发现字体没有显示,然后又核对了一下流程,发现操作没问题,结果还是没有显示文字。经过一番折腾,原来是字体生成时使用的api在5.5版本已被弃用

    ArtistFont.cs:
    
    CharacterInfo info = new CharacterInfo();
    info.index = bmInfo.index;
    info.uv.x = (float)bmInfo.x / (float)mbFont.texWidth;
    info.uv.y = 1 - (float)bmInfo.y / (float)mbFont.texHeight;
    info.uv.width = (float)bmInfo.width / (float)mbFont.texWidth;
    info.uv.height = -1f * (float)bmInfo.height / (float)mbFont.texHeight;
    info.vert.x = (float)bmInfo.offsetX;
    info.vert.y = (float)bmInfo.offsetY;
    info.vert.width = (float)bmInfo.width;
    info.vert.height = (float)bmInfo.height;
    info.width = (float)bmInfo.advance;
    CharacterInfo:
    
    [Obsolete ("CharacterInfo.uv is deprecated. Use uvBottomLeft, uvBottomRight, uvTopRight or uvTopLeft instead.")]
    public Rect uv;
    
    [Obsolete ("CharacterInfo.vert is deprecated. Use minX, maxX, minY, maxY instead.")]
    public Rect vert;

    由于api被弃用,实际的字符信息并没有写入字体文件,这样当然不会显示字体了。

    接下来的方向就是用uvBottomLeft, uvBottomRight, uvTopRight, uvTopLeft代替uv,minX, maxX, minY, maxY代替vert输出对应字符信息。目标是很明确,但过程非常曲折,折腾了很久还是没搞懂具体的写法,借助万能的Google,我找到了这篇文章Unity的UGUI中使用CustomFont(BMFont),上核心代码:

    CharacterInfo info = new CharacterInfo();  
    info.index = id;  
    float uvx = 1f*x/texWidth;  
    float uvy = 1 - (1f*y/texHeight);  
    float uvw = 1f*width/texWidth;  
    float uvh = -1f*height/texHeight;  
    
    info.uvBottomLeft = new Vector2(uvx, uvy);  
    info.uvBottomRight = new Vector2(uvx + uvw, uvy);  
    info.uvTopLeft = new Vector2(uvx, uvy + uvh);  
    info.uvTopRight = new Vector2(uvx + uvw, uvy + uvh);  
    
    info.minX = xoffset;  
    info.minY = yoffset + height / 2;   // 这样调出来的效果是ok的,原理未知  
    info.glyphWidth = width;  
    info.glyphHeight = -height; // 同上,不知道为什么要用负的,可能跟unity纹理uv有关  
    info.advance = xadvance;

    看注释也知道该博主同样是一脸懵逼,但也还是很牛逼地把逻辑撸出来了。参考了这段代码,其实基本是照抄,那为啥是叫参考呢?因为还不能完全适用,要把代码改一下才能正确显示效果

    info.minY = yoffset + height

    终于能够把文字显示出来了:


    屏幕快照 2017-03-24 21.21.03.png

    兴奋呐!!!但是明明输入了5个0,为什么才显示一个数字呢???原来字符重叠了。。。继续万能的谷歌,我找到了相同问题的发帖[问答] unity5.3版本内UGUI制作美术字重叠怎么破,同样我也找到了一万头草泥马在内心狂奔的回答


    屏幕快照 2017-03-24 21.27.21.png

    还好有了之前UGUI图文混排的经验,继承Text修改顶点位置就能让字体正常显示


    屏幕快照 2017-03-24 21.38.00.png

    附上工程源码下载



    作者:dumpling2017
    链接:http://www.jianshu.com/p/a4e6d1ca3ca0
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    查看weblogic的console信息
    Gearman分布式任务处理系统(二)扩展应用
    Gearman分布式任务处理系统(一)基本介绍
    通过Gearman实现MySQL到Redis的数据同步(异步复制)
    java 23种设计模式
    linux常用命令
    Linux下软件常见安装方式
    Redis快速入门:安装、配置和操作
    Redis快速入门:选择Key-Value Store
    Redis快速入门:Key-Value存储系统简介
  • 原文地址:https://www.cnblogs.com/imteach/p/7478848.html
Copyright © 2011-2022 走看看