前言:之前有朋友发信来问如何在Neoaxis中显示中文,当时答应写篇教程放上来。后来忙于I'm Lulu King!的制作,就给搁下了。等I'm Lulu King!提交后,却又累得连打开Neoaxis编辑器的劲都没有了。这一拖就拖到了现在。想来这位朋友应该早已解决Neoaxis的中文显示问题了吧,再写教程恐意义不大。Unity的中文显示机制和Neoaxis颇多类似,今天写这篇文章也算是向那位朋友聊表歉意了。 
还要说明的是,笔者才刚开始学习Unity,讲解中有错误或不准确之处还望指正,在此先行谢过。 
1)流程说明Unity的Asset自动导入机制使得在Unity中显示中文非常简单。你所要做的就是将中文字体放到Unity的Asset目录下,Unity会自动将字体中的所有文字转换成一张字体贴图,并生成一个Unity字体。之后你可以就通过GUI Skin\GUI Style引用这个字体来显示中文。 
要在Neoaxis中显示中文的话,生成字体贴图(或称Bitmap Font)的过程不是自动的,你需要先用Bitmap font generator来生成字体贴图及字体定义,然后通过Neoaxis自带的字体转换工具将字体定义转换成Neoaxis的字体定义。对比这两个引擎的字体导入流程,不难发现两者的设计思路差异。Unity的方式简单高效但可控性差,Neoaxis的方式略显繁琐,但你可以精确控制每一个步骤。

2)准备工作让我们先打开任意一个Unity项目,这里我们用的是Unity官方教程中的3D平台游戏项目。 
Unity的GUI采用的是Immediate Mode GUI(IM GUI),对于更习惯Windows GUI编程的朋友来说如果第一次接触可能有点不习惯。简单说来在Unity中创建GUI不需要进行通常的Init(初始化)、CleanUp (清理)步骤,也不需要进行事件的发送、订阅、处理,相反你只需在每帧的更新周期里同时绘制GUI及处理相应事件就可以了。如果想更多了解IM GUI的话,不妨看看mollyrocket.com的这段视频。mollyrocket的论坛里也有不少IM GUI的相关讨论。

在菜单中,选择 GameObject->Create Empty, 创建一个空的GameObject, 改个合适的名字,如"MyGUIObject"。MyGUIObject将充当GUI的容器,具体界面的创建及位置都将通过脚本来进行。所以我们可以不关心这个GameObject在场景中的位置。这时层级视图(Hierarchy)如下:

3)创建 GUI Skin 或 GUI StyleUnity中的界面风格是通过GUI Style及GUI Skin来进行控制。GUI Skin由一组GUI Style组成。GUI Skin和GUI Style的关系类似于CSS中CSS文件和CSS Style之间的关系。本教程的重点不在于Unity GUI的讲解,相关概念大家可以多参看Unity Manual。 
在项目视图(Project)中选择Create->GUI Skin创建一个GUI Skin,改名为"ChineseFontSkin"。这时项目视图如下:

在属性视图(Inspector)中对ChineseFontSkin简单设置如下:

这时我们还没有中文字体,字体一项就先用项目中带的Fluoride字体,然后将Button中Normal的Text Color改成黄色。Button是这个GUI Skin中关于按钮的默认Style。

然后,我们将Label中Normal的Text Color改成绿色。本教程只用到Button和Label。 
4)通过脚本创建GUI在Unity中你可以通过GameObject菜单创建GUI Text和GUI Texture这两个基本的GUI对象。但大部分GUI都需要通过脚本创建。我们将用脚本创建一个Label和一个Button。 
在项目视图(Project)中选择Scripts下的GUI目录,在本视图的菜单中旋转Create->C Sharp Script, 创建一个C Sharp脚本,改名为“MyGUI”。 
双击MyGUI脚本可以在Unity自带的UniSciTE编辑器中打开脚本进行编辑。但由于UniSciTE无法正确显示中文字符,使用外部IDE来编辑带中文的脚本是个好主意。微软的Visual C# Express当然是免费编辑器中的首选, 但对于我们这个简单的脚本来说,Notepad就足够了。 
在Unity项目视图中右键点击"MyGUI",在弹出菜单中选择“Show in Explorer”,可以看到我们的脚本文件。 

用Notepad打开MyGUI.cs,输入以下脚本:

这个脚本做的事很简单。先定义一个可设置的GUISkin对象mySkin。在OnGUI方法中将GUI的Skin设为mySkin, 然后创建一个Label和一个Button。Label中显示的中文拷贝自我们站点的About页(上面截图中文字未显示完整)。保存脚本,用默认的Ascii编码保存即可。 
回到Unity,将MyGUI脚本拖放到MyGUIObject上。选择MyGUIObject,在Inspector中将My Skin 设为"ChineseFontSkin"。

运行游戏,可以看到英文文字能显示,但中文都丢了。这是因为我们还没有导入中文字体的缘故。 

5) 导入中文字体在Windows的Font目录下,选择你喜欢的中文字体(这里我们选择微软雅黑),拷贝至Unity项目下的Assets\GUI目录下。切换至Unity,发现Unity呈冻结状,此时Unity正在进行字体贴图及字体定义的自动生成工作。根据机器性能及字体大小,导入过程可能较长。(我的机器上需要10多分钟。) 
等Unity完成工作后,可以看到Project视图下的GUI目录中多了个msyh的字体。(或其他你选择的字体的名称) 
在Project视图中选择ChineseFontSkin,在Inspector视图中,将Font改为刚导入的字体msyh。再运行游戏。

中文都可以显示了。你好,Unity! 
6)Unity干了什么及没干什么?在Unity中显示中文是不是很简单呢? 
再让我们看看Unity在背后干了些什么。在Project视图中选择msyh字体并展开,可以看到Unity为每个字体生成了一个字体贴图(font texture)及一个字体材质(font material)。选择font texutre, 在Inspector视图可以看到该贴图的预览:

一张16M的4096x4096贴图! 
Unity自动替你将微软雅黑中所有可用文字都导成了一张巨大的位图,而不管你是否真的需要这么多文字。好处在于,现在你可以在Unity里显示所有微软雅黑字体所支持的文字了。但是,为每个字体分配一张16M贴图的做法太过奢侈了,对配置较低的机器或是iPhone来说更是不可接受。可是在Unity真正支持TTF字体渲染之前,我们似乎也只好接受这种傻瓜式生成字体贴图的方式。 
但我们对此真的无能为力了吗?当然不!既然我们无法控制Unity生成字体贴图的方式及过程(虽然通过Editor API的TrueTypeFontImporter类可以进行有限的控制),至少我们可以对字体本身做些改造,让它只包含我们所需要的文字。就我们这个简单的项目而言,我们希望看到的字体贴图更应该是下面这样的:


64K vs 16M。除非你要开发RPG或是需要用户输入任意中文,改造字体的成效将非常可观的。 
在下一篇教学中我们将介绍如何利用FontForge来完成中文字体的瘦身工作。

unity3D 自定义显示中文相关推荐

  1. Unity3D显示中文

    最方便的思路大概就是用GUISkin了. 先在windows的Font文件夹下弄来一个中文字体比如宋体.ttf,把这个字体文件放在unity3d的Assets目录下.这样unity3d就会自动加载这个 ...

  2. Pandas matplotlib 无法显示中文

    文章目录 Pandas 无法显示中文解决方案 Pandas在绘图时,会显示中文为方块,主要原因 运行效果展示 win自带中文字体表 matplotlib 解决方案 一 动态修改配置 二 设置自定义字体 ...

  3. android 只能输入汉字,EditText限制输入的几种方式及只显示中文汉字的做法

    前段时间项目中有个需求是要求只能输入汉字,并且不能输入偏旁部首,于是总结了下EditText限制输入的几种方式,但是对于语音输入的还没找到好的解决方案: 通过设置EditText的inputType来 ...

  4. java jar apktool,ShakaApkTool.jar v3.0.0(反编译显示中文的apktool)下载

    ShakaApkTool.jar是一款可以反编译显示中文的apktool--ShakaApktool.使用这款ShakaApkTool.jar工具包可以让你在进行apk开发时更加流畅,如果您正需要马上 ...

  5. msp430单片机oled汉字字模_OLED液晶屏如何显示中文呢?

    序言 之前我们分享了,如何使用STM32驱动OLED液晶屏,讲了SSD1306控制芯片的驱动,对其驱动时序和常用命令做了介绍,详细请参考下面链接: STM32驱动0.96寸OLED液晶屏 上篇中我们已 ...

  6. python中plot不能显示标签_python 2: 解决python中的plot函数的图例legend不能显示中文问题...

    问题: 图像标题.横纵坐标轴的标签都能显示中文名字,但是图例就是不能显示中文,怎么解决呢? 解决: plt.figure() plt.title(u'训练性能', fontproperties=fon ...

  7. matlab作图显示中文正常,保存图片中文乱码

    如题,遇到过这个问题的,基本就不是字库的问题了. 如果是字库问题,那么显示中文是显示不出来的,都是小矩形. 现在的情况是MATLAB显示正常,但是保存后的图片就出现这种小方块. 那么,这种情况是因为设 ...

  8. Excel 设置下拉框-显示中文而实际数字

    最近在用excel做数据的导入,显示的值和数据库存放值有所差别,需要进行翻译,这里运用excel自带的功能来实现,显示中文,实际数字. Excel 版本:2019 第一步.设置下来框显示 在excel ...

  9. linux终端能显示中文,但是不能输入中文的解决方法

    linux终端能显示中文,但是不能输入中文的解决方法 linux终端能显示中文,但是不能输入中文的解决方法 第一种方法:修改用户目录下的.inputrc文件允许 8bit 输入即可 第二种方法(不建议 ...

  10. Unity面板显示中文属性

    虽然对于程序来说,一般习惯用英文命名,但有时身在公司,总是需要和策划协作的,他们可能看不懂一些英文变量,所以为了方便交流,我抽空研究了下Unity属性面板中文化的问题. 有两种方法可以实现中文属性名: ...

最新文章

  1. 如何设计一门语言(七)——闭包、lambda和interface
  2. 函数平移口诀_八年级数学下册:一次函数的图像,平移口诀是“上加下减,左加右减”...
  3. 有线节点与无线节点的混合仿真模拟实验
  4. 扩展的母函数(可以做减法的母函数)(当然只要你愿意也可以做乘除!)
  5. JAVA Spring 简单的配置和操作 ( 创建实体类, 配置XML文件, 调试 )
  6. 使用 Windows Terminal 连接远程主机
  7. Java DataInputStream readUnsignedByte()方法(带示例)
  8. 数据库的开发笔记-字典表
  9. JavaScript:函数
  10. android 联系人存储结构
  11. java 全角半角符号转换_java 字符串全角半角转换
  12. java mybatis 事务,单独的使用mybatis 如何来管理事务
  13. zzzkkk666用户名密码
  14. VSCode配置git图文
  15. Exposure X8标准版图片后期滤镜PS、LR等软件的插件
  16. 方面和服务,差别大吗?
  17. Docker与微服务实战(入门)
  18. 跨越阶层,至少需要三代人的努力;看千年前的眉山五苏是如何完成的
  19. Faceless —— 开源的匿名社交应用
  20. IKAnalyzer总结

热门文章

  1. PTA 6-1 单链表逆转
  2. Imagine中文文档
  3. 关于position: sticky的简单用法
  4. 全国海选第四期:北京和海外赛区(视频)
  5. 程序员相亲大曝光 女方:做底层架构,什么时候升嘞!emmmm
  6. 【论文笔记】Learning Convolutional Networks for Content-weighted Image Compression
  7. 明星热图|童瑶、周迅、易烊千玺、张新成签约新品牌;李宇春、陈飞宇参加品牌活动...
  8. 录制计算机网课,电脑怎么录制网络课程?简单专业的录制方法分享
  9. 最常用到的35种心理效应集锦
  10. python心得总结知识点和收获,千锋Python培训心得 在总结中收获提升