2017-01-05 15:05:09 pz789as 阅读数 4488
  • unity3D-游戏/AR/VR在线就业班

    本套课程是一套完整的 Unity3D-游戏/AR/VR 学习课程,具体的课程内容包括《C#语言》、《Unity引擎》、《编程思想》,《商业级项目实践》等开发课程,引导您一步步循序渐进、由易到难,终获得Unity 3D/游戏/AR/VR工程师的岗位技能。

    12792 人正在学习 去看看 宋晓波

参考:http://blog.csdn.net/pz789as/article/details/54093140


在网上看到很多资料,都是用的以前老的属性了,强迫症发作,只好自己动手将过期的属性都改了

本来是方法我是从网上找的,自己懒得去解析fnt文件了,于是想到了以前用的NGUI就有专门处理fnt文件的类,于是就下了一个最新的NGUI,把里面的这几个类拷贝了过来:



然后自己写了一个类,显示在unity的菜单栏里面:


需要把这个文件放到Editor下面才会起作用!

然后看实现:

//本方法是通过BMFont导出的fnt和字体图片来导出字体文件的,使用时,只需要选择图片或者fnt文件即可,但是图片和字体文件的名字必须要保持一致,除了后缀名。
	//如果不一样,则将两个文件都选中,导出的名字以最后选择的文件为基准,但是推荐把他们的名字统一,预防出现差错。
	[MenuItem("Assets/CreateMyFont")]
    static void CreateMyFont(){
		if (Selection.objects == null) return;
		if (Selection.objects.Length == 0) {
			Debug.LogWarning("没有选中fnt文件,或者图片文件");
			return;
		}
		//至少需要保证选中文件的目录下面有fnt文件,否则不会生成字体
		Font m_myFont = null;
		TextAsset m_data = null;
		string filePath = "";
		Material mat = null;
		Texture2D tex = null;
		bool bln = false;
		//不管选中fnt、png、mat、fontsettings其中的任何一个,都可以创建字体
		foreach(UnityEngine.Object o in Selection.objects){
			if (o.GetType() == typeof(TextAsset)){
				m_data = o as TextAsset;
				bln = true;
			}else if (o.GetType() == typeof(Material)){
				mat = o as Material;
				bln = true;
			}else if (o.GetType() == typeof(Texture2D)){
				tex = o as Texture2D;
				bln = true;
			}else if (o.GetType() == typeof(Font)){
				m_myFont = o as Font;
				bln = true;
			}
			if (bln){
				filePath = AssetDatabase.GetAssetPath(o);
				filePath = filePath.Substring(0, filePath.LastIndexOf('.'));
			}
		}
		//获取fnt文件,我们在这里加一次判断,为了可以直接选择图片也能导出字体
		string dataPathName = filePath + ".fnt";
		if (m_data == null){
			m_data = (TextAsset)AssetDatabase.LoadAssetAtPath(dataPathName, typeof(TextAsset));
		}
		if (m_data != null){
			string matPathName = filePath + ".mat";
			string fontPathName = filePath + ".fontsettings";
			string texPathName = filePath + ".png";

			//获取图片,如果没有图片,不影响,可以生成之后,再手动设置
			if (tex == null){
				tex = (Texture2D)AssetDatabase.LoadAssetAtPath(texPathName, typeof(Texture2D));
			}
			if (tex == null){
				Debug.LogWarning("没找到图片,或者图片名称和fnt文件名称不匹配");
			}

			//获取材质,如果没有则创建对应名字的材质
			if (mat == null){
				mat = (Material)AssetDatabase.LoadAssetAtPath(matPathName, typeof(Material));
			}
			if (mat == null){
				mat = new Material(Shader.Find("GUI/Text Shader"));
				AssetDatabase.CreateAsset(mat, matPathName);
			}else{
				mat.shader = Shader.Find("GUI/Text Shader");
			}
			mat.SetTexture("_MainTex", tex);

			//获取font文件,如果没有则创建对应名字的font文件
			if (m_myFont == null){
				m_myFont = (Font)AssetDatabase.LoadAssetAtPath(fontPathName, typeof(Font));
			}
			if (m_myFont == null){
				m_myFont = new Font();
				AssetDatabase.CreateAsset(m_myFont, fontPathName);
			}
			m_myFont.material = mat;

			BMFont mbFont = new BMFont();
			//借助NGUI的类,读取字体fnt文件信息,可以不用自己去解析了
			BMFontReader.Load(mbFont, m_data.name, m_data.bytes);
			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();
				//设置ascii码
				info.index = bmInfo.index;
				//设置字符映射到材质上的坐标
				info.uvBottomLeft = new Vector2((float)bmInfo.x/mbFont.texWidth, 1f-(float)(bmInfo.y+bmInfo.height)/mbFont.texHeight);
				info.uvBottomRight = new Vector2((float)(bmInfo.x+bmInfo.width)/mbFont.texWidth, 1f-(float)(bmInfo.y+bmInfo.height)/mbFont.texHeight);
				info.uvTopLeft = new Vector2((float)bmInfo.x/mbFont.texWidth, 1f-(float)(bmInfo.y)/mbFont.texHeight);
				info.uvTopRight = new Vector2((float)(bmInfo.x+bmInfo.width)/mbFont.texWidth, 1f-(float)(bmInfo.y)/mbFont.texHeight);
				//设置字符顶点的偏移位置和宽高
				info.minX = bmInfo.offsetX;
				info.minY = -bmInfo.offsetY-bmInfo.height;
				info.maxX = bmInfo.offsetX+bmInfo.width;
				info.maxY = -bmInfo.offsetY;
				//设置字符的宽度
				info.advance = bmInfo.advance;
				characterInfo[i] = info;
			}
			m_myFont.characterInfo = characterInfo;
			EditorUtility.SetDirty(m_myFont);//设置变更过的资源
			EditorUtility.SetDirty(mat);//设置变更过的资源
			AssetDatabase.SaveAssets();//保存变更的资源
			AssetDatabase.Refresh();//刷新资源,貌似在Mac上不起作用

			//由于上面fresh之后在编辑器中依然没有刷新,所以暂时想到这个方法,
			//先把生成的字体导出成一个包,然后再重新导入进来,这样就可以直接刷新了
			//这是在Mac上遇到的,不知道Windows下面会不会出现,如果不出现可以把下面这一步注释掉
			AssetDatabase.ExportPackage(fontPathName, "temp.unitypackage");
			AssetDatabase.DeleteAsset(fontPathName);
			AssetDatabase.ImportPackage("temp.unitypackage", true);
			AssetDatabase.Refresh();

			Debug.Log("创建字体成功");
		}else{
			Debug.LogWarning("没有找到fnt文件,或者文件名称和图片名称不匹配");
		}
    }

代码也没什么可以说的,上面都带了注释。

主要改动是在计算uv和vert这里了,因为新版本建议不要使用uv和vert,改用uvLeftTop等等~也要跟着进步嘛~

我自己还加入了文件判断,这样可以根据你选择的文件进行字体生成过程,但是在文件夹目录下方必须要存在fnt文件,否则无法导出字体。

这里我在最后多做了一步,本来按照Unity的逻辑,我设置了SetDirty之后,这个资源理论上说应该会刷新的,但是我在实际使用的时候,每次导出完毕没有错误,但是.fontsettings的文件并没有改变。后面在多次尝试之后发现,如果将生成的字体导出成package,然后再导入进来或者关闭unity重新打开,这个就能正常使用。所以在最后我又添加了自动导出导入,最后完成之后,只要点一下import就可以使用新制作的字体了。

上面这个问题是5.5 的 mac版本上出现的,不知道windows版本会不会有这个问题,不过无关紧要,这么写两遍都能够使用~

2014-05-09 13:36:53 u012276084 阅读数 1133
  • unity3D-游戏/AR/VR在线就业班

    本套课程是一套完整的 Unity3D-游戏/AR/VR 学习课程,具体的课程内容包括《C#语言》、《Unity引擎》、《编程思想》,《商业级项目实践》等开发课程,引导您一步步循序渐进、由易到难,终获得Unity 3D/游戏/AR/VR工程师的岗位技能。

    12792 人正在学习 去看看 宋晓波

用Unity3d NGUI可制作出字体可点击的效果,点击打开网站链接

还有中文字体的显示,可以直接调用系统内置字体,不需要第三方的字体支持


UILabel(Script 参数说明)


第一项字体选项,NGUI使用的是静态字体,当我们需要显示中文时,最好使用动态字体,或者自己也可以制作静态字体集

Font Size: 字体大小

Material:字体贴图素材,如需要彩色字体

Text:显示内容

Overflow:填充内容选项,1,ShrinkContent(以内容为基准进行填充)2,ClampContent(以字体为基准进行剪切)

3,ResizeFreely(以内容的水平为基准进行填充)4,以内容的高为基准进行填充

Alignment:字体的对齐方式

Keep crisp:动态字体锐化

Gradient:字体渐变

Effect:字体效果

Spaceing:字体间隔

Max Lines:多少行来显示字体

BBCode:使用NGUI的字体自定义来格式化字体


1,创建中文字体

a.首先在Widget Tool创建一个UILabel

b.在UILabel的inspector视窗中将NGUI选择成Unity,然后选择Font-Arial

c.现在我们使用的是动态字体,可以显示中文


2,创建链接字体

a.为需要添加点击事件的UILabel添加一个Script

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. void OnClick ()  
  2. {  
  3.     UILabel lbl = GetComponent<UILabel>();  
  4.       
  5.     if (lbl != null)  
  6.     {  
  7.         string url = lbl.GetUrlAtPosition(UICamera.lastHit.point);  
  8.         if (!string.IsNullOrEmpty(url)) Application.OpenURL(url);  
  9.     }  
  10. }  

b.为当前UILabel添加一个Box Collider,调整Box Collider的大小为当前UILabel的视窗大小

将Is Trigger选项勾上


c.当前NGUI支持的格式化字体三种,1([b]bold[/b] 动态更改字体显示效果)2([u]underline[/u] 添加下划线 

[s]strikethrough[/s] 删除线)3([url=http://www.tasharen.com/][u]clickable hyperlinks[/u][/url] 添加网站链接)


所有格式化效果显示,点击clickable 可打开链接


原文链接:http://blog.csdn.net/unity3d_xyz/article/details/22664255

2017-02-26 20:49:29 kong1287988804 阅读数 4485
  • unity3D-游戏/AR/VR在线就业班

    本套课程是一套完整的 Unity3D-游戏/AR/VR 学习课程,具体的课程内容包括《C#语言》、《Unity引擎》、《编程思想》,《商业级项目实践》等开发课程,引导您一步步循序渐进、由易到难,终获得Unity 3D/游戏/AR/VR工程师的岗位技能。

    12792 人正在学习 去看看 宋晓波

工具准备:Unity,NGUI插件,字体制作工具bitmap font,TexturePackerGUI


1、首先对字体进行处理

界面所用到的字保存成一个txt文本,注意要把编码改成Unicode(可以把文本另存为,选择Unicode编码)。

之后打开bitmap font工具,并在font setting中设置微软雅黑


在Edit中先选择Clear all....之后再select chars from file 把之前的txt文件导入

导出选项设置(注意32位 ,下面选择png),完事选择Save bitmap font as.....导出结果。

成品是这两个文件,把fnt后缀的改成txt,编码改成Unicode2。

2、对图片进行图集处理



注意以下配置:1024*1024,Basic



完事形成两个文件,同样要把.txt文件改成Unicode2编码。


未完待续。。。




2014-03-31 14:44:05 inspironx 阅读数 13438
  • unity3D-游戏/AR/VR在线就业班

    本套课程是一套完整的 Unity3D-游戏/AR/VR 学习课程,具体的课程内容包括《C#语言》、《Unity引擎》、《编程思想》,《商业级项目实践》等开发课程,引导您一步步循序渐进、由易到难,终获得Unity 3D/游戏/AR/VR工程师的岗位技能。

    12792 人正在学习 去看看 宋晓波

用Unity3d NGUI可制作出字体可点击的效果,点击打开网站链接

还有中文字体的显示,可以直接调用系统内置字体,不需要第三方的字体支持


UILabel(Script 参数说明)


第一项字体选项,NGUI使用的是静态字体,当我们需要显示中文时,最好使用动态字体,或者自己也可以制作静态字体集

Font Size: 字体大小

Material:字体贴图素材,如需要彩色字体

Text:显示内容

Overflow:填充内容选项,1,ShrinkContent(以内容为基准进行填充)2,ClampContent(以字体为基准进行剪切)

3,ResizeFreely(以内容的水平为基准进行填充)4,以内容的高为基准进行填充

Alignment:字体的对齐方式

Keep crisp:动态字体锐化

Gradient:字体渐变

Effect:字体效果

Spaceing:字体间隔

Max Lines:多少行来显示字体

BBCode:使用NGUI的字体自定义来格式化字体


1,创建中文字体

a.首先在Widget Tool创建一个UILabel

b.在UILabel的inspector视窗中将NGUI选择成Unity,然后选择Font-Arial

c.现在我们使用的是动态字体,可以显示中文


2,创建链接字体

a.为需要添加点击事件的UILabel添加一个Script

	void OnClick ()
	{
		UILabel lbl = GetComponent<UILabel>();
		
		if (lbl != null)
		{
			string url = lbl.GetUrlAtPosition(UICamera.lastHit.point);
			if (!string.IsNullOrEmpty(url)) Application.OpenURL(url);
		}
	}

b.为当前UILabel添加一个Box Collider,调整Box Collider的大小为当前UILabel的视窗大小

将Is Trigger选项勾上


c.当前NGUI支持的格式化字体三种,1([b]bold[/b] 动态更改字体显示效果)2([u]underline[/u] 添加下划线 

[s]strikethrough[/s] 删除线3([url=http://www.tasharen.com/][u]clickable hyperlinks[/u][/url] 添加网站链接


所有格式化效果显示,点击clickable 可打开链接



Unity3d NGUI的使用(二)(UILabel中文字体及可点击的字体)


2017-10-24 09:17:06 qq_33994566 阅读数 5050
  • unity3D-游戏/AR/VR在线就业班

    本套课程是一套完整的 Unity3D-游戏/AR/VR 学习课程,具体的课程内容包括《C#语言》、《Unity引擎》、《编程思想》,《商业级项目实践》等开发课程,引导您一步步循序渐进、由易到难,终获得Unity 3D/游戏/AR/VR工程师的岗位技能。

    12792 人正在学习 去看看 宋晓波

最近遇到一个需求,就是我们在做完一个场景后,美工感觉字体不好看,效果不是很好,想要换一种字体。UGUI的界面已经搭完,如果要一个一个Text寻找,工作量将是巨大。而且作为程序人员是不会容忍自己做这些机械工作的,所以,有必要写一个脚本来让场景中的Text字体变换了。

 

using UnityEngine;
using System.Collections;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine.UI;

public class ChangeFontWindow : EditorWindow
{
    [MenuItem("Tools/更换字体")]
    public static void Open()
    {
        EditorWindow.GetWindow(typeof(ChangeFontWindow));
    }

    Font toChange;
    static Font toChangeFont;
    FontStyle toFontStyle;
    static FontStyle toChangeFontStyle;

    void OnGUI()
    {
        toChange = (Font)EditorGUILayout.ObjectField(toChange, typeof(Font), true, GUILayout.MinWidth(100f));
        toChangeFont = toChange;
        toFontStyle = (FontStyle)EditorGUILayout.EnumPopup(toFontStyle, GUILayout.MinWidth(100f));
        toChangeFontStyle = toFontStyle;
        if (GUILayout.Button("更换"))
        {
            Change();
        }
    }

    public static void Change()
    {
        //寻找Hierarchy面板下所有的Text
        var tArray = Resources.FindObjectsOfTypeAll(typeof(Text));
        for (int i = 0; i < tArray.Length; i++)
        {
            Text t = tArray[i] as Text;
            //这个很重要,博主发现如果没有这个代码,unity是不会察觉到编辑器有改动的,自然设置完后直接切换场景改变是不被保存
            //的  如果不加这个代码  在做完更改后 自己随便手动修改下场景里物体的状态 在保存就好了 
            Undo.RecordObject(t, t.gameObject.name);
            t.font = toChangeFont;
            t.fontStyle = toChangeFontStyle;
            //相当于让他刷新下 不然unity显示界面还不知道自己的东西被换掉了  还会呆呆的显示之前的东西
            EditorUtility.SetDirty(t);
        }
        Debug.Log("Succed");
    }
}

希望本博客对你有帮助。
 

 

Unity3D显示中文字体

阅读数 2268

Unity3D显示中文

阅读数 10590

没有更多推荐了,返回首页