2014-03-31 14:44:05 inspironx 阅读数 13441
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4646 人正在学习 去看看 张刚

用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-01-05 15:05:09 pz789as 阅读数 4489
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4646 人正在学习 去看看 张刚

参考: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版本会不会有这个问题,不过无关紧要,这么写两遍都能够使用~

2015-05-25 19:38:24 cp790621656 阅读数 3242
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4646 人正在学习 去看看 张刚

文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn 转载请注明

在使用同事用 BMFONT 制作的 字体 时,在 Unity 3d 中发现,不能居中对齐。


在尝试 顶部对齐 中心对齐 底部对齐后发现,这个艺术字 是以 顶部 为锚点的。

所以结果就像上面的图片,我们选择 中心对齐,但是在 Unity3d 中看到却是 顶部 对齐了 文本框 的中心。


因为昨天正好简单学了下 Unity的 Custom Font,所以觉得可以手动修改 Cunstom Font文件。

手动修改 Cunstom Font文件,如下图。


把框中的 Y 修改为 15(图片的一半高度),保存后再查看,发现 已经 是我们要的效果了 。


但是总不能每次从 BMFONT 中制作好字体后再来修改,还是要从 BMFONT中进行修改。




如上图,在 导入文字图片到 BMFONT 时,修改设置 Y offset 为 图片的一半高度 的 负数 。


文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn 转载请注明

2017-11-17 19:25:34 rachelray 阅读数 558
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4646 人正在学习 去看看 张刚

一、首先是共有的步骤

使用工具 : BMFont

下载地址:http://www.angelcode.com/products/bmfont/
因为测试版的不稳定性,这里下载1.13版即可
这里写图片描述
打开BMFont,Edit–>Open Image Manager–>Image–>Import image…选中图片后将Id设为图片所示数字的ASCII码,这里我设置了0-9的数字
这里写图片描述
结果如图
这里写图片描述
然后Options–>Export Options
这里写图片描述
再点击Options–>Save bitmap font as…会生成.fnt和.png两个文件,导入Unity项目中

二、如果在NGUI中使用

右击.fnt文件–>NGUI–>Open Bitmap Font Maker,将Type设为Imported Bitmap,拖入相应的.fnt文件和.png文件并设置图集,会生成一个Prefab文件即NGUI可使用的字体。注意使用时字体大小要设为Snap

三、如果在UGUI中使用

因为UGUI中没有对应的功能,这里就需要自己编写代码
具体步骤:
1. 将.png文件设为sprite
2. 创建一个材质球,shader设为GUI/Text Shader
3. 右击–>Create–>Custom Font
4. 把材质球拖入字体材质中
这里写图片描述
5. 导入所需要的NGUI的5个脚本
这里写图片描述
6. 编写脚本

using UnityEditor;

public class BMFontEditor : EditorWindow {

[MenuItem("Tools/BMFont Maker")]
static public void OpenBMFontMaker()
{
    EditorWindow.GetWindow<BMFontEditor>(false, "BMFont Maker", true).Show();
}

[SerializeField]
private Font targetFont;
[SerializeField]
private TextAsset fontData;
[SerializeField]
private Material fontMat;
[SerializeField]
private Texture2D fontTexture;

private BMFont bmFont = new BMFont();

public BMFontEditor() {
}

private void OnGUI()
{
    targetFont = EditorGUILayout.ObjectField("Target Font", targetFont, typeof(Font), false) as Font;
    fontData = EditorGUILayout.ObjectField("Font Data", fontData, typeof(TextAsset), false) as TextAsset;
    fontMat = EditorGUILayout.ObjectField("Font Mat", fontMat, typeof(Material), false) as Material;
    fontTexture = EditorGUILayout.ObjectField("Font Texture", fontTexture, typeof(Texture2D), false) as Texture2D;

    if (GUILayout.Button("Create BMFont"))
    {
        BMFontReader.Load(bmFont, fontData.name, fontData.bytes);
        CharacterInfo[] characterInfo = new CharacterInfo[bmFont.glyphs.Count];
        for (int i = 0; i < bmFont.glyphs.Count; i++)
        {
            BMGlyph bmInfo = bmFont.glyphs[i];
            CharacterInfo info = new CharacterInfo();
            info.index = bmInfo.index;
            info.uv.x = (float)bmInfo.x / (float)bmFont.texWidth;
            info.uv.y = 1 - (float)bmInfo.y / (float)bmFont.texHeight;
            info.uv.width = (float)bmInfo.width / (float)bmFont.texWidth;
            info.uv.height = -1f*(float)bmInfo.height / (float)bmFont.texHeight;
            info.vert.x = 0;
            info.vert.y = -(float)bmInfo.height;
            info.vert.width = (float)bmInfo.width;
            info.vert.height = (float)bmInfo.height;
            info.width = (float)bmInfo.advance;
            characterInfo[i] = info;
        }
        targetFont.characterInfo = characterInfo;
        if (fontMat)
        {
            fontMat.mainTexture = fontTexture;
        }
        targetFont.material = fontMat;
        fontMat.shader = Shader.Find("UI/Default");

        AssetDatabase.SaveAssets();
        Close();
    }

}

7. Tools–>BMFont Maker
这里写图片描述
注意使用时Text的Material可设为Sprites-Default

最后效果如图
这里写图片描述

2014-03-31 21:35:40 inspironx 阅读数 7379
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4646 人正在学习 去看看 张刚

UIButton点击发出声音以及UIButton事件回调

Anchor锚点:为了适应不同的屏幕,保持当前的UI不会变形用户订的基准点



Atlas:图片集,NGUI支持TexturePacker直接解析

Font:按钮字体,如果没有自己制作静态中文字体就随便选择一个

Template:widget模版

Background:图片集中制作的图片

点击Add To添加到视图中


按钮属性:


Box Collider:默认添加(为响应事件)


UIButton(Script):

Target:按钮点击目标(点在这个目标上才算有效)

Drag Over:当有物体在按钮上通过时,触发事件选项

Transition:效果过渡

Colors:对应按钮在不同状态中的颜色

Sprites:对应按钮在不同状态中的背景图片

OnClick:按钮点击时,触发的事件分发


UIPlay Sound(Script):

当按钮点击时,可以播放一个声音

脚本调用时,直接在UIButton上添加一个脚本前重写OnClick():

    void OnClick() {
        Debug.Log("onClick");
    }


按钮是一个背景与一个文本拼合起来的,一般在按钮制作时,需要添加锚点选项

显示所有组件在按钮里的一个相对位置

点击Background:


在Type选项选择unified,然后选择四点顶点处的大小

Target:表示你要在哪个相对位置保持不变,一般是UI Root父节点里面

Hide if off-screen:表示当前Widget不在当前显示画面时,隐藏


Unity3d NGUI的使用(三)(UIButton及Anchor实际使用)

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