文件转载自: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
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

unity5.5 ugui使用美术字的更多相关文章

  1. unity5, UGUI刺穿问题解法

    我希望在touch屏幕时player起跳,于是在playerControl.cs的Update函数中添加如下touch代码:  if (Input.GetMouseButtonDown (0)) {/ ...

  2. 如何快速优化手游性能问题?从UGUI优化说起

    WeTest 导读   本文作者从自身多年的Unity项目UI开发及优化的经验出发,从UGUI,CPU,GPU以及unity特有资源等几个维度,介绍了unity手游性能优化的一些方法.   在之前的文 ...

  3. uGUI练习(六) ScrollView

    练习目标 练习uGUI的滑动组件 一.相关组件 ScrollRect Mask Grid Layout Group Scrollbar 二.步骤 1.创建一个Panel,命名为ScrollRect,添 ...

  4. uGUI练习 开篇

    一.准备阶段 1.Unity 4.6 Beta b18或更高版本(注:目前泄露版的Unity5.0Beta 对UI的支持并没有4.6 Beta那么好) 2.了解 Unity 2D Sprite的基础知 ...

  5. Unity NGUI和UGUI与模型、特效的层级关系

    目录 1.介绍两大UI插件NGUI和UGUI 2.unity渲染顺序控制方式 3.NGUI的控制 4.UGUI的控制 5.模型深度的控制 6.粒子特效深度控制 7.NGUI与模型和粒子特效穿插层级管理 ...

  6. Unity使用UGUI进行VR游戏的界面开发

    原文链接:http://gad.qq.com/article/detail/7181505 本文首发腾讯GAD开发者平台,未经允许,不得转载 我不知道有多少同学是跟我一样,在开发VR游戏中,是使用的面 ...

  7. UGUI的text赋值问题-速度

    仅是简单的给一个ugui.text组件不断的赋值字符串,就会带来很高的CPU消耗,约0.5MS左右. 这个过程主要是消耗在字体的MESH顶点重建. 在游戏中变化的字体一般不多,聊天面板虽然变化,刷新率 ...

  8. 基于Shader实现的UGUI描边解决方案

    基于Shader实现的UGUI描边解决方案 前言 大扎好,我系狗猥.当大家都以为我鸽了的时候,我又出现了,这也是一种鸽.创业两年失败后归来,今天想给大家分享一个我最近研究出来的好康的,比游戏还刺激,还 ...

  9. Unity GUI(uGUI)使用心得与性能总结

    Unity GUI(uGUI)使用心得与性能总结 作者 kingshijie 关注 2015.09.26 15:35 字数 3686 阅读 28031评论 10喜欢 49 背景和目的 小哈接触Unit ...

随机推荐

  1. Swift 闭包即OC中的Block

    - 闭包的定义 1.提前准备好的代码        2.在需要的时候执行        3.可以当做参数传递 // 1.最简单的闭包 // () -> () 没有参数,没有返回值的函数 // 如 ...

  2. 拿来主义:treeview插件父子节点问题

    鄙人公司没有专门的前端,所以项目开发中都是前后端一起抡.最近用bootstrap用的比较频繁,发现bootstrap除了框架本身的样式组件外,还提供了多种插件供开发者选择.本篇博文讲的就是bootst ...

  3. Linux Curl命令

    一.简介 linux curl是一个利用URL规则在命令行下工作的文件传输工具.它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称url为下载工具.   二.安装 wget http://c ...

  4. leveldb 学习记录(八) compact

    随着运行时间的增加,memtable会慢慢 转化成 sstable. sstable会越来越多 我们就需要进行整合 compact 代码会在写入查询key值 db写入时等多出位置调用MaybeSche ...

  5. SpringMVC Controller中注入Request成员域和在方法中定义中HttpServletRequest有啥区别

    先说结论,在Controller中注入Request是线程安全的. 以下是解释: 我们先来看看这两者有什么不同 在controller注入成员变量request 可以看到注入的是一个代理对象 写在方法 ...

  6. 【APP测试(Android)】--升级更新

  7. CSS3知识!

    一.引入样式 1.行内样式表 <h1 style="color: red;font-size: 18px;">10-30</h1> 2.内部样式表(在hea ...

  8. 孤岛营救问题 (BFS+状压)

    https://loj.ac/problem/6121 BFS + 状压 写过就好想,注意细节debug #include <bits/stdc++.h> #define read rea ...

  9. sqlserver数据库创建快照发布遇到的错误:对路径“XXXX”访问被拒绝

    在创建了一个sqlserver数据库的发布后,显示创建成功,但当查看快照代理状态时,显示“对路径‘XXXX’访问被拒绝”,这一错误导致订阅无法实现.然后网上有一方案帮忙解决了,主要有以下操作: 1)在 ...

  10. Linux连不上校园网怎么办?

    原本,在我们学校我只要连上WiFi打开浏览器, 它就会自动重定向到校园网登录的界面.但是今天浏览器并没有自己打开登录页面,一直在加载.于是我想直接登录路由器,在地址栏输入192.168.0.1,结果它 ...