`

NGUI所见即所得之UIFont , UIFontMaker

 
阅读更多

         NGUI所见即所得之UIFont , UIFontMaker

        在上一篇博客介绍了UIAtlas的结构和UIAtlasMaker生成Atlas的原理(NGUI所见即所得之UIAtlasMaker , UIAtlas),按照介绍UIAtlas的行为脉络,应该先对UIFont进行介绍,但是发现UIFont这个脚本特别长有点被吓到了,这主要是因为之前都没有怎么用过UIFontMaker,只是创建Dynamic字体很简单,然后又一个改进是不用再对不同字体大小生成不同的预设,现在只需要TTF和设置字体大小就可以了,方便直观多了,看下图:
FontMaker界面     

       既然从代码理出点头绪出来比较困难,UIFont的成员变量太多了,只有先玩下FontMaker,因为Dynamic字体已经不用创建了,只需要改下Font Type为Dynamic就可以了,所以只要看下Bitmap的形式就差不多了:

      Font Data其实每个字在指定Texture的偏移已经大小等信息(Font Data可以由BM Font等软件生成),看下Output栏。选择UIFont就是把新生成的字体加入选择的UIFont中去,至于Atlas选项很重要(因为看到DrawCall),就是把Texture的图片放进选择的Atlas中去,减少DrawCall。

      进过上面的操作,对UIFont一堆的成员变量就不会莫名其妙了,这也是因为UIFont糅合了比较多的东西,所以会复杂些。

UIFontMaker

      下面还是先看下UIFontMaker,人的思维都习惯从易到难,所以会学习一定是最注重循序渐进的,好了不废话了,切入正题。先看下MakeAsChanged():

void MarkAsChanged ()
	{
		if (NGUISettings.font != null)
		{
			List<UILabel> labels = NGUIEditorTools.FindAll<UILabel>();

			foreach (UILabel lbl in labels)
			{
				if (lbl.bitmapFont == NGUISettings.font)
				{
					lbl.bitmapFont = null;
					lbl.bitmapFont = NGUISettings.font;
				}
			}
		}
	}

       做为开胃菜,这个函数很简单,就是替换UILabel的UIFont,也就说当前对NGUISettings.font进行修改,而上面UIFontMaker的见面只有一个Select是对UIFont进行更改的(加入新生成的字体),所以很自然可以猜到MakeAsChange这个函数只有在Select选择了UIFont的情况下才会被调用执行。

       

static void CreateFont (UIFont font, int create, Material mat)
	{
		if (create == 1)
		{
			// New dynamic font
			font.atlas = null;
			font.dynamicFont = NGUISettings.dynamicFont;
			font.dynamicFontStyle = NGUISettings.dynamicFontStyle;
		}
		else
		{
			// New bitmap font
			font.dynamicFont = null;
			BMFontReader.Load(font.bmFont, NGUITools.GetHierarchy(font.gameObject), NGUISettings.fontData.bytes);

			if (create == 2)
			{
				font.atlas = null;
				font.material = mat;
			}
			else if (create == 3)
			{
				font.spriteName = NGUISettings.fontTexture.name;
				font.atlas = NGUISettings.atlas;
			}
		}
	}

       最主要的是BMFontReader.Load,然后可以进一步看下BMFontReader,BMFont,BMGlphy这三个脚本,其实看到这三个脚本的注释可以发现,其实NGUI就是把BMFont移植过来:

                    BMFont reader. C# implementation of http://www.angelcode.com/products/bmfont/

由于篇幅和主题,这里就不做介绍了,但是至少可以认识了字体制作方法,下次可以自己写一个美术字体的制作程序。

    剩下的OnGUI就没有什么必要介绍的,只是一个条件的跳转和细节的判断。

 

UIFont

    看到UIFontMaker的界面操作(选择项比较多),就知道UIFont的成员变量或属性会多出一些,其中mMat,mReplacement mSprite在UIAtlas中也有,就不做解释了。  

 

        [HideInInspector][SerializeField] Material mMat;
	[HideInInspector][SerializeField] Rect mUVRect = new Rect(0f, 0f, 1f, 1f);
	[HideInInspector][SerializeField] BMFont mFont = new BMFont();
	[HideInInspector][SerializeField] int mSpacingX = 0;
	[HideInInspector][SerializeField] int mSpacingY = 0;
	[HideInInspector][SerializeField] UIAtlas mAtlas;
	[HideInInspector][SerializeField] UIFont mReplacement;
	[HideInInspector][SerializeField] float mPixelSize = 1f;

	// List of symbols, such as emoticons like ":)", ":(", etc
	[HideInInspector][SerializeField] List<BMSymbol> mSymbols = new List<BMSymbol>();

	// Used for dynamic fonts
	[HideInInspector][SerializeField] Font mDynamicFont;
	[HideInInspector][SerializeField] int mDynamicFontSize = 16;
	[HideInInspector][SerializeField] FontStyle mDynamicFontStyle = FontStyle.Normal;

	// Cached value
	UISpriteData mSprite = null;
	int mPMA = -1;
	bool mSpriteSet = false;

	// I'd use a Stack here, but then Flash export wouldn't work as it doesn't support it
	static BetterList<Color> mColors = new BetterList<Color>();

     下面对部分变量做下注释性的介绍:

mUVRect

public Rect uvRect
	{
		get
		{
			if (mReplacement != null) return mReplacement.uvRect;

			if (mAtlas != null && (mSprite == null && sprite != null))
			{
				Texture tex = mAtlas.texture;

				if (tex != null)
				{
					mUVRect = new Rect(
						mSprite.x - mSprite.paddingLeft,
						mSprite.y - mSprite.paddingTop,
						mSprite.width + mSprite.paddingLeft + mSprite.paddingRight,
						mSprite.height + mSprite.paddingTop + mSprite.paddingBottom);

					mUVRect = NGUIMath.ConvertToTexCoords(mUVRect, tex.width, tex.height);
#if UNITY_EDITOR
					// The font should always use the original texture size
					if (mFont != null)
					{
						float tw = (float)mFont.texWidth / tex.width;
						float th = (float)mFont.texHeight / tex.height;

						if (tw != mUVRect.width || th != mUVRect.height)
						{
							//Debug.LogWarning("Font sprite size doesn't match the expected font texture size.\n" +
							//	"Did you use the 'inner padding' setting on the Texture Packer? It must remain at '0'.", this);
							mUVRect.width = tw;
							mUVRect.height = th;
						}
					}
#endif
					// Trimmed sprite? Trim the glyphs
					if (mSprite.hasPadding) Trim();
				}
			}
			return mUVRect;
		}
		set
		{
			if (mReplacement != null)
			{
				mReplacement.uvRect = value;
			}
			else if (sprite == null && mUVRect != value)
			{
				mUVRect = value;
				MarkAsDirty();
			}
		}
	}

 很长一段代码,mUVRect表示的文字集的图片在图集的偏移和长宽。

     针对UILabel提供三种显示类型,UIFont提供了三种计算字符串Dimension(像素)的下面三个方法,这三个方法也占用了UIFont相当大的篇幅:

                public Vector2 CalculatePrintedSize (string text, int size, bool encoding, SymbolStyle symbolStyle)

                public string GetEndOfLineThatFits (string text, int size, int lineWidth, bool encoding, SymbolStyle symbolStyle)

                public int CalculateOffsetToFit (string text, int size, int lineWidth, bool encoding, SymbolStyle symbolStyle)

 

BMSymbol

        很早就看到说NGUI支持表情输入,虽然之前项目中,看到同事做聊天框用的是NGUIHtml这个插件来实现的,但是这样的话,不是让NGUI不得极其用,有点小浪费,其实原理就是根据符号的字符串找到图片。

 

 

小结:

        今天晚上,一开始看到UIFont这么行代码就有点畏难,后面看了点视频,觉得还是接着写吧,虽然BMFont和BMSymbol的部分几乎没有介绍,原因有两个:1)如果实际项目中不是自己动手写NGUI插件没有太多必要,2)现在已经凌晨2:10了时间有点晚,以前在学校都没觉得什么,现在工作了,觉得码农都是一个高危职业,身体是自己的,所以自己一再强调要早点休息(虽然还是到了这个时候,原谅我吧),说真的现在头还真有点晕。

        刚突然听到Beyond的《不再犹豫》无聊望见了犹豫,达到理想不太易,即使有信心,斗志却抑止”很深刻的刻画了我一直以来的状态,所以才坚持写完的,加油,努力!

        如果您对D.S.Qiu有任何建议或意见可以在文章后面评论,或者发邮件(gd.s.qiu@gmail.com)交流,您的鼓励和支持是我前进的动力,希望能有更多更好的分享。

        转载请在文首注明出处:http://dsqiu.iteye.com/blog/1968002

更多精彩请关注D.S.Qiu的博客和微博(ID:静水逐风)

     

     晚安,明天早起跑步去!

 

 

 

 

 

 


 

  • 大小: 11.8 KB
  • 大小: 32.1 KB
1
0
分享到:
评论

相关推荐

    CustomGUI.unitypackage

    使用unity原生GUI封装,来达到UGUI,NGUI所见即所得的效果和部分功能,目的是由此来了解高级UI的原理。

    NGUI插件3.11.2版本

    在场景视图中看到的就是在游戏视图中得到的(所见即所得)。 基于组件的、模块化的特性:要让你的界面控件做什么,只需为其附加相应的行为,而不需要编码。 全面支持iOS/Android和Flash。 灵活的事件系统。 可以让...

    NGUI_3.11.3.unitypackage

    在场景视图中看到的就是在游戏视图中得到的(所见即所得)。 基于组件的、模块化的特性:要让你的界面控件做什么,只需为其附加相应的行为,而不需要编码。 全面支持iOS/Android和Flash。 灵活的事件系统。 可以让...

    NGUI3.11.4

    在场景视图中看到的就是在游戏视图中得到的(所见即所得)。 基于组件的、模块化的特性:要让你的界面控件做什么,只需为其附加相应的行为,而不需要编码。 全面支持iOS/Android和Flash。 灵活的事件系统。 可以让...

    NGUI 2019_3_0.unitypackage.zip

    开发者可以在Unity编辑器中直接设计和调整UI元素,实现所见即所得的效果。这种设计方式极大地提高了开发效率,使得UI设计和游戏逻辑的开发可以同步进行,减少了开发者在不同工具间切换的时间成本。 二、本地化与...

    NGUI Next-Gen UI 2020.1.5

    - 编辑器集成,所见即所得 - 本地化、数据绑定、委托、事件 - 支持所有平台 - 制作进行 1 次绘制调用的 UI - 随附完整的 C# 源代码 - 已广泛优化 - 专门团队支持 2020.1.5 - NEW: You can now specify per-symbol ...

    NGUI插件大全

    在场景视图中看到的就是在游戏视图中得到的(所见即所得)。 基于组件的、模块化的特性:要让你的界面控件做什么,只需为其附加相应的行为,而不需要编码。 全面支持iOS/Android和Flash。 灵活的事件系统。 可以让...

    NGUI 3.5.9

    在场景视图中看到的就是在游戏视图中得到的(所见即所得)。  基于组件的、模块化的特性:要让你的界面控件做什么,只需为其附加相应的行为,而不需要编码。  全面支持iOS/Android和Flash。  灵活的事件系统。...

    NGUI3.6.4 最新版本NGUI ngui

    《NGUI 3.6.4:打造高效Unity3D移动界面的利器》 NGUI,全称为Next-Gen UI,是Unity3D游戏引擎中的一款广泛应用的界面系统插件,尤其在移动游戏开发领域备受青睐。其3.6.4版本作为官方发布的最新版,不仅集成了之前...

    最新版本的NGUI插件NGUI Next-Gen UI 覆盖unity多个版本

    NGUI Next-Gen UI是一款功能强大、灵活性高的UI插件,是当前最新版本的NGUI插件。它可以覆盖Unity的多个版本,包括Unity 5、Unity 2017和Unity 2018等。与其他UI插件相比,NGUI Next-Gen UI具有高效的性能和优秀的...

    NGUI 2020.1.5.unitypackage

    NGUI 是一款非常强大的 UI 系统和事件通知框架。...- 编辑器集成,所见即所得 - 本地化、数据绑定、委托、事件 - 支持所有平台 - 制作进行 1 次绘制调用的 UI - 随附完整的 C# 源代码 - 已广泛优化 - 专门团队支持

    NGUI3.7.3unitypackage

    NGUI3.7.3unitypackage 是 NGUI 的一个特定版本,即3.7.3版的资源包。这个版本包含了对 NGUI 系统的更新和改进,旨在提升性能、优化用户体验以及增加新的功能。 NGUI 的核心特性包括: 1. **Widget 系统**:NGUI ...

    NGUI3.5.9 Unity3d UI开发神器

    在场景视图中看到的就是在游戏视图中得到的(所见即所得)。  基于组件的、模块化的特性:要让你的界面控件做什么,只需为其附加相应的行为,而不需要编码。  全面支持iOS/Android和Flash。  灵活的事件系统。...

    NGUI v3.12.1 2018 最新版NGUI

    《NGUI v3.12.1:2018年Unity UI系统深度解析》 NGUI,全称为Next-Gen UI,是一款专为Unity引擎设计的用户界面系统。在2018年,它发布了v3.12.1的最新版本,此更新旨在优化用户体验,提升性能,并增加新功能。作为...

    NGUI3.11.2

    NGUI 是一个针对 Unity 游戏引擎的用户界面(UI)系统,专为游戏开发者设计,提供了一套高效、易用且功能丰富的UI组件。在3.11.2版本中,NGUI 进一步提升了性能和用户体验,遵循了“Keep It Simple, Stupid”(KISS...

    NGUI离线文档

    NGUI离线文档是针对Unity游戏开发中NGUI框架的一个详细参考资料,主要基于3.7.5版本。NGUI是一个用户界面系统,专为Unity3D设计,它提供了丰富的UI组件和工具,使得开发者能够在2D和3D环境中创建出交互性强、视觉...

    Unity插件 NGUI各种版本合集

    本包中共有六个版本的NGUI,大家可以自己选择版本。 NGUI Next-Gen UI 3.6.0.unitypackage NGUI Next-Gen UI 3.12.1(u5.6.5).unitypackage NGUI Next-Gen UI 2019.3.0.unitypackage NGUI Next-Gen UI v2018.3.0....

    ngui 3.7.0

    《NGUI 3.7.0:Unity开发插件的深度解析与应用指南》 NGUI,全称为Next-Gen User Interface,是一款专为Unity3D游戏引擎设计的UI开发插件,它提供了丰富的界面元素和强大的交互功能,极大地简化了开发者在创建用户...

    NGUI-Unity(2020-2021)亲测可用

    《NGUI在Unity中的应用详解》 Unity,作为全球领先的实时3D内容创作和运营平台,深受游戏开发者和视觉效果创作者的喜爱。而NGUI(Next Generation User Interface)是Unity早期流行的一款用户界面(UI)系统插件,...

    NGUI 3.9.4插件控件的简略说明

    - 图集管理是NGUI的重要部分之一,用于组织和优化UI资源。通过合理设置图集,可以减少Drawcalls,提高渲染效率。 - 通常,图集会在资源加载时自动创建,也可以手动管理图集以更好地控制资源的使用。 #### NGUI静态...

Global site tag (gtag.js) - Google Analytics