转csdn某位同学的 感谢bmfont

UGUI 使用BMFont

首先要知道 Custom Font 的原理,不知道的同学可以先看这篇[Custom Font 原理](http://blog.csdn.net/liqiangeastsun/article/details/46665113)

  Custome Font 可以利用材质球,通过材质的UV、和 Vert信息,读取其贴图上的字符,之前使用NGUI 时用到过类似的功能,把字体库通过 BMFont 生成两个文件,一个贴图文件,一个包含该贴图UV、Vert信息的文件。
  下面将BMFont 生成的文件,使用到Custom Font 中。
  ![这里写图片描述](http://img.blog.csdn.net/20150628154451761)

  打开 DFDSF_0.png

  打开 DFDSF.fn

(1)将这两个文件拖拽到Unity项目中 
选择图片设置参数 

(2) 新建一个材质球,将贴图拖拽到材质球上 

(3)新建 Custom Font, 
将材质球拖拽到新建字体 DFDSF的 Default Material上 

(4)下面解决如何将贴图的UV和Vert信息填写到字体库上 

这是DFDSF.fnt中一条信息,

char id=48 x=190 y=0 width=41 height=52 xoffset=0 yoffset=0 xadvance=41

和上图的对应关系是

UV 
X = x / 贴图宽 ; Y = y / 贴图高 
W = width / 贴图宽 ; H = height / 贴图高

Vert 
X = xoffset ; Y = yoffset 
W = width ; H = height

Width = xadvance ;

一条数据就得填写半天了,那么多个字符,手动填写就废了。 
下面找了一个大神的代码潜水的小男猫的博客

using UnityEngine;
using System.Collections;
using UnityEditor;

public class MyFont : MonoBehaviour {

    public Font m_myFont;
    public TextAsset m_data;
    private BMFont mbFont = new BMFont();
    void Start()
    {
        BMFontReader.Load(mbFont, m_data.name, m_data.bytes);  // 借用NGUI封装的读取类
        CharacterInfo[] characterInfo = new CharacterInfo[mbFont.glyphs.Count];
        for (int i = 0; i < mbFont.glyphs.Count; i++)
        {
            BMGlyph bmInfo = mbFont.glyphs[i];
            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 = (float)bmInfo.height / (float)mbFont.texHeight;
            info.vert.x = (float)bmInfo.offsetX;
            info.vert.y = (float)bmInfo.offsetY;
            //info.vert.y = 0f;//自定义字库UV从下往上,所以这里不需要偏移,填0即可。
            info.vert.width = (float)bmInfo.width;
            info.vert.height = (float)bmInfo.height;
            info.width = (float)bmInfo.advance;
            characterInfo[i] = info;
        }
        m_myFont.characterInfo = characterInfo;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

上面代码里边读取 BMFont 数据的方法`BMFontReader.Load 是NGUI封装好的方法,所以需要将Ngui中读取 BMFont信息的几个脚本那过来用一下,自己去NGUI插件中取这几个脚本 

首先需要使用改代码将字体库上的 UV信息给填写了

在场景中创建一个 对象,将 MyFont.cs 脚本挂上去 
分别将 字体库 和 .fnt 文件拖到 下面两个参数上

运行项目,运行起来后关闭就行了 
现在再看 DFDSF 字体库,10条数据都已经填写完毕,是不是和神奇,看到这里我们还要再次感谢一下大神潜水的小男猫的博客 

下面创建一个 Text 将字体库 DFDSF拖拽到 Text的字体上 

DFDSF 字体库中只包含 0 - 9 十个数字,输入其他字符不会显示的 
效果如下

我们期望的效果如下 

如果出现下面这种效果 

发现数字怎么都倒过来了,其实是Unity 在读取 贴图时是倒着来读取的, 
如何将字符正确显示,有多种方法,

一种方法是找个美工,将制作好的贴图垂直翻转 180 度,这样读取时就没问题了 
而上面代码中的处理方法是 
info.uv.y = 1 - (float)bmInfo.y / (float)mbFont.texHeight; 
这样处理了一下 UV 中 Y 的值,也达到了效果

如果字体和图片颜色不一样,在 Text 的 Material :设置 SpriteDefalut材质

时间: 2024-12-28 21:29:02

转csdn某位同学的 感谢bmfont的相关文章

30、最高分是多少 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩.

最高分是多少 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. 输入描述: 输入包括多组测试数据. 每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目. 学生ID编号从1编到N. 第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩 接下来又M行,每一行有一个字符C(只取'Q'或'U'),和两个正整数A,B,当C为'Q

java 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩.

老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. 输入描述: 输入包括多组测试数据. 每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目. 学生ID编号从1编到N. 第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩 接下来又M行,每一行有一个字符C(只取'Q'或'U'),和两个正整数A,B,当C为'Q'的时候, 表

随机生成60位同学成绩,并求他们的平均数,中位数,众数等

import randomimport numpy as np def random_int_list(start, stop, length): start, stop = (int(start), int(stop)) if start <= stop else (int(stop), int(start)) length = int(abs(length)) if length else 0 random_list = [] for i in range(length): random_l

12.27评论5位同学试验三

23号李名贵,http://www.cnblogs.com/xieqiuyou/p/5017244.html#3323660 写的不错,每行语句都有注释,但截图不完整 24号施振成,http://www.cnblogs.com/nonecanstop/p/5079334.html 写的较完整,轮转法和优先算法都有用到 25号黄楠, http://www.cnblogs.com/huangnanblog/p/5069960.html 程序只有优先算法.望继续编写完整. 29钟广智 http://w

qq的一位同学提问

问题是:怎么样查看防火墙是开机启动的? 回答:systenctl  is-enabled firewalld 平常用到很重要的systemctl  reload  servername,即可生效命令不需要重启 开机自动启动 systemctl enable servername 关闭开机启动 systemctl disable servername

12.9评论5位同学的实验三

28  王鸾  没有完成 29  钟广智 http://www.cnblogs.com/ZhiGe/p/5033017.html 新得体会写得比较少,其他的完成的不错. 30  邓新章  没有完成 31 温天麟  http://www.cnblogs.com/skyokay/p/5015533.html 完整的完成了实验的要求,实验结果那一个方面截图只有两张,觉得应该可以多一点截图来突出实验的结果. 32  柴铱琳  http://www.cnblogs.com/chyl/p/5014111.h

12.9评论5位同学试验三

24号施振成:没有写 25号黄楠:没有写 26号谢秋有:http://www.cnblogs.com/xieqiuyou/p/5017244.html 终于有一个有写试验3的了..感觉还不错,但是算法只有一个,时间转轮没有写,不够完美,优先级界面排版的合理,程序也有注释比较明了. 28号王鸾:没有写 29号钟广智:没有写

输入一个班30位同学的成绩,

#include<stdio.h> main() { int a,n,b,c,d,e,f,i,j,s[100]; for(i=0;i<30;i++) scanf("%d",&s[i]); a=0,b=0,c=0,d=0,e=0,j=0; for(i=0;i<30;i++) {if(s[i]<60) {a++;continue;} if(s[i]<70) {b++;continue;} if(s[i]<80) {c++;continue;

CSDN开源夏令营 百度数据可视化实践 ECharts 11 (期末总结)

致谢: CSDN开源夏令营马上就要结束了,随着ECharts专题列入百度ECharts官网,任务就算是基本完成了.再次谢谢林峰老师!回想两个月前听到CSDN要举办这个活动,第一感觉是非常棒,所有就积极看了看所有的项目,项目总体质量很棒,涉及的方面也很广,有云与大数据方面的.有前端与移动方面的.嵌入式与智能硬件方面的.其中linux方面的也很多,总之项目很丰富,也都很有挑战.CSDN是第一年举办这样的活动,虽然时间准备上有些仓促外,总体上组织的很好,在做项目的过程中CSDN的工作人员的服务态度也很