Unity3.5中内建精简字体字库方法讲解(赠臃肿版 方法)

来源:互联网 发布:周朝 知乎 编辑:程序博客网 时间:2024/06/11 04:59

 

 

 

 

 

原址:http://1vr.cn/article.asp?id=607

 

 

在Unity3.5中内建了精简字体字符的功能.更加方便,也非常利于修改等等.在此之前一直用FontSbusetPack进行精简.为什么要精简字库集?最简单的一个原因就是为了让Unity发布的移动设备能文本能使用字体来定义样式.

Unity内建的用法很简单,只需选择放入的字体,修改Character项为"Custom set",接着出现Custom Chars中输入你想使用的字符串,字符重复无所谓,因为最终会自动过滤掉重复字符.如输入"你好世界",那么整个字体最终只包含"你好世界"这四个字的字符贴图,也就是你仅仅能用这个字库来显示"你好世界"这几个字.最简单的测试办法只选择字体,在GameObject-Create Other-GUIText创建一个使用所选字体的文本标签来测试就可以了.

这里有一个脚本,用于将一个文本文件里包含的字符串读入并赋予给Custom Chars编辑框中.这个脚本特点是可以按照字符重复次数多少排序,即用该文本文件中用的次数越多这个字符会越靠前排列提升读取速度.另外会将键盘上的字母,数字及其他符号自动包含其中.感谢 Unity郭振平 编写和分享该脚本.

首先将下列脚本(见本文附件)保存为"UnicodeTextImporter.cs"文件放项目资源目录里的Editor文件夹内.



然后找个你需要的字体放入项目中,只好选择这字体,在检视面板中设置你需要的字体尺寸,颜色等.然后选择"Character"为"Custom set".



将你最终用来显示的文本内容以UTF-8编码保存为文本文档存于Assets/Resources(推荐的,放在任意目录下都可)中.

接着在项目视图选择这个字体文件,在Unity顶部菜单选择AssetDatabase-Import Font with Text File,会弹出打开文件对话框. 选择上面存放于Resources文件夹中的文本文件.



成功导入后会显示"ImportFontWithTextFromFile: Final Unicode String: xxxxx"字样.重新选择一次字体且选择字体的贴图会看到类似如下的精简结果.



至此精简工作完成.

如遇读取进来的不正确,有乱码现象,需检查文本编码是否为UTF-8,并且需要重启Unity才能再次正常执行该插件。

附件:下载文件点击下载此文件

转载请注明来自1Vr.Cn!

 

 

 

 

 

 

 

 

臃肿版

 

 

在Unity3D中,默认是无法显示中文的,显示为乱码,或者根本就不显示。这个原因是因为Unity3D创建的项目资源中没有中文字体,所以无法显示中文。

Unity的Asset自动导入机制使得在Unity3D中显示中文非常简单。你所要做的就是将中文字体放到Unity的Asset目录下,Unity会自动将字体中的所有文字转换成一张字体贴图,并生成一个Unity字体。之后你可以就通过GUI SkinGUI Style引用这个字体来显示中文。

使用菜单Assets->Create->GUI Skin创建一个GUI Skin改名为ChineseFontsSkin,然后将需要的中文字体文件放到项目的Assets文件夹下,可以在建立文件夹Fonts里面放入字体文件,字体文件在Windows下的Fonts中可以找到。

更改刚刚创建的ChineseFontsSkin的属性设置中的Font为刚刚添加的字体。

创建C#脚本,然后创建一个共有对象:

1
2
3
4
5
public GUISkin guiSkin;
void OnGUI(){
      if(guiSkin)
            GUI.Skin=guiSkin;
}

将ChineseFontSkin拖给创建的C#脚本,这样,就可以正确的显示中文了。

如果使用的是MonoDevelop可能显示的依然是乱码,如果出现这样的情况,将C#文件编码更改为Unicode编码后再运行。

 

 

 

 

未验证版 

 

 

 以web的形式发布 unity 程序的时候,要显示中文字体要把很大的字库打进去,如果程序不需要有中文的输入功能,只是显示中文的情况下,可以用以下方法:
方法目前只有一个(等 Unity 支持客户端字体的时候这个问题就解决了),就是自动生成 Texture 然后在 unity 里显示。
先写一个 测试的脚本
using UnityEngine;
using System.Collections;
public class Class2:MonoBehaviour
{
    public string Url = "http://127.0.0.1/test.php?n=%C4%E3%BA%C3";
    void Start()
    {
        StartCoroutine(_LoadTexture(Url, gameObject));
    }
    private IEnumerator _LoadTexture(string url, GameObject obj)
    {
        WWW rerquest = new WWW(url);
        yield return rerquest;
        try
        {
            if (rerquest.isDone && string.IsNullOrEmpty(rerquest.error))
            {
                obj.renderer.material = new Material(Shader.Find("Transparent/Cutout/Diffuse"));
                obj.renderer.material.mainTexture = rerquest.texture;
            }
        }
        catch (UnityException e) { }
        finally
        {
            rerquest.Dispose();
        }
    }
}



test.php 的代码

<?php   
header('Content-type: image/png;');

$name= request("n", "default");
$font = "STLITI.TTF";//注意这里,这里我把 C:\WINDOWS\Fonts 下的 STLITI.TTF 拷到 test.php 同目录下,可以使用 C:\WINDOWS\Fonts 下任意 *.TTF 或者 *.TTC 的字体
$name=translateCharset($name, "gb2312");
$im = imagecreate(1, 1);
$black = imagecolorallocate($im, 243, 169, 91);
$fcolor = imagecolorallocate($im, 243, 169, 90);
$para = imagettftext($im, 100, 0, 0, 112, $fcolor, $font, $name);

$im = imagecreate($para[2], $para[1]);
$black = imagecolorallocate($im, 243, 169, 91);
$fcolor = imagecolorallocate($im, 243, 169, 90);
imagettftext($im, 100, 0, 0, 112, $fcolor, $font, $name);
imagecolortransparent($im, $black);

imagepng($im);
imagedestroy($im);

function translateCharset($string, $fromCharset, $toCharset='UTF-8') {
        if(function_exists('mb_convert_encoding')) {
            return mb_convert_encoding($string, $toCharset, $fromCharset);
        } elseif(function_exists('iconv')) { // iconv is flakey
            return iconv($fromCharset, $toCharset, $string);
        } else {
            return $string;
        } // end else clause
    }
function request($var_name, $default = null)
{
     global $_POST, $_GET;

     if ( isset( $_POST[$var_name] ) ) {
         $result = add_slashes( $_POST[$var_name] );
     }
  else if ( isset( $_GET[$var_name] ) ) {
         $result = add_slashes( $_GET[$var_name] );
     }
  else if ( func_num_args() > 1 ) { #check for a default passed in (allowing null)
         $result = add_slashes($default);
     }
     else {
         $result = null;
     }
     if($result == '' || $result == null){
      $result = $default;
     }
     return $result;
}
function add_slashes( $var )
{
     if ( 1 == get_magic_quotes_gpc() ) {
         return $var;
     }
  else if ( !is_array( $var ) ){
         return addslashes( $var );
     }
  else {
         foreach ( $var as $key => $value ) {
             $var[$key] = add_slashes( $value );
         }
         return $var;
     }
}
?>

我这个生成png 的图片用的是 php 的 gd2 的库,因为服务器可能放到Linux上,服务器是 windows 的同学可以用 windows 的 GDI+ 去画 png 图片。

最后说说 php 中的参数问题 在 http://127.0.0.1/test.php?n=%C4%E3%BA%C3 中,n= 后面的是要显示的字符,%C4%E3%BA%C3 是“你好”的UTF8编码。


如何得到中文的UTF8编码? 有2个方法
(1)可以使用javascript 的 encodeURIComponent
(2)打开 firefox,在地址栏输入 http://127.0.0.1/test.php?n= 任意中文字符,敲回车,得到真实 地址。

本教程转自网互联网,未经检测,不知是否有效,用过的朋友请留言。牵涉到一些php知识点。

 

 

 

 

 

 

 

 

 

原创粉丝点击