FairyGUI概叙

FairyGUI介绍

FairyGUI是跨引擎的开源UI解决方案,它包含一个UI编辑器 以及 多个流行游戏引擎的运行库(SDK),支持包括Unity,Unreal,Cocos2dx,Egret,Laya,Flash等等游戏引擎。

FairyGUI的工作流程

1.在FairyGUI编辑器中编辑UI;
2.将编辑好的UI导出对应资源(图集和配置文件);
3.将资源导入对应引擎后,结合FairyGUI提供的运行库(SDK) 进行UI功能的制作;

FairyGUI的优缺点

优点:

  • 可以让美术同学使用编辑器进行UI面板的拼凑,降低美术同学的学习成本,美术不用学习如何使用游戏引擎;
  • 方便项目UI部分的移植;
  • FairyGUI提供了比UGUI、NGUI更多的功能,方便我们的使用;

缺点:

  • 由于它是跨引擎的工具,对部分引擎支持不到位,使用时会遇到一些bug,但Untiy作为主流引擎,相对来说问题较少;

FairyGUI基础

编辑器基础使用

1.项目文件夹结构:

  • assets:包内容放置目录 ,例如package1:每个包一个目录。目录名就是包名;
  • assets_xx:分支内容放置目录,xx就是分支名称,多个分支存在多个类似名称的目录;
  • settings:配置文件放置目录;
  • .objs:内部数据目录。不需要进行版本管理,这里的内容不需要共享;
  • .fairy:项目标识文件。文件名就是项目名,可以随便修改;

2.主界面说明:

  • 菜单栏;
  • 主工具栏:常用功能按钮;
  • 工具栏和舞台区域;
  • 状态栏,显示控制台输出的最后一条信息,点击可打开控制台;
  • 其它功能视图:可以随意拖动位置,也可以关闭,在主菜单->视图中可以打开关闭后的窗口;

3.支持的格式:可以将资源直接拖入资源库中

  • 图片(PNG、JPG、TGA、SVG等)
  • 声音(MP3、wav等)
  • 动画(spine、龙骨、gif、Flash等)
  • 文字(TTF、位图文字)

包

1.包的定义:包是FairyGUI中用于组织资源的,它在文件系统中体现为一个目录,assets文件夹下的每个子目录都表示一个包,最终我们打包时也是以包为单位进行打包的,每个包中都有一个package.xml文件,它是用于记录这个包中的资源对应信息的,是非常重要的文件,包发布后可以得到一个描述文件和一张或多张纹理集(图集),我们在引擎中使用时,就是根据这个描述文件使用纹理中的图片来创建UI的,菜单栏——>资源——>新建包(或者点击快捷按钮);

2.包的依赖:

  • 说明:FairyGUI不处理包之间的依赖,假设有两个包A和B,A用到了包B中的元件,那么在使用A中内容时需要先手动加载包B相关内容;
  • 建议:
    • 不要建立交叉引用;
    • 公共资源放在公共包中;
    • 避免A用B,B用C这种复杂的关系;

3.资源URL地址:在FairyGUI中每个资源都对应了一个资源URL地址,选中一个资源,右键,会出现复制URL,就可以得到它的资源地址,无论在编辑器还是代码中 我们都可以通过资源地址来得到资源,也可以通过ui://包名//资源名(注意:该格式地址是不包含文件夹的,只需要用包名和资源名);

组件

1.组件的定义:

  • 说明:组件,也可以理解为组合控件,所有的UI相关内容都在其中编辑显示,是我们的最基础容器,它可以包含一个或多个基础显示对象,也可以包含组件,我们之后编辑的所有UI内容都是以组件为容器,比如面板,按钮,输入框等等UI内容都是基于组件制作的,在FairyGUI的舞台编辑区域,编辑的就是组件和组件容器中的各种元件位置属性等等,最终我们发布UI文件后,在Unity中也是以组件为最小单位进行内容加载;
  • 创建方式:菜单栏——>资源——>新建组件(或者点击快捷按钮)
  • 意义:所有面板,复合控件都是以组件为容器进行制作的,之后在Unity加载编辑好的界面时也是以组件为最小单位进行加载的;

2.组件窗口检查器参数说明:

1.组件栏:
	最小\大尺寸:设置组件的尺寸限制,0表示不限制(注意:修改尺寸限制不会修改当前的宽高,即使宽高超出限制),点击轴心右侧三角形可以快速设置轴心的位置;
	
	初始名字:当组件在编辑器内被创建时,自动设置组件的名称为这里设置的,主要作用是,FairyGUI中要求窗口框架组件命名为frame,那么当我们创建一个窗口组件时,就可以在这里把初始名字设置为frame,以后每次使用更加方便;
	
	溢出处理:当组件中内容超出矩形区域时的处理方式(溢出处理不支持代码中动态修改,一开始就要设置好)
		可见:超出范围仍然可见;
		隐藏:超出范围内容部可见,相当于是一个矩形遮罩;
		垂直、水平、自由滚动:只要设置他们就可以做出类似滚动容器的效果,只不过没有滚动条;
		
	边缘:在溢出处理设置为隐藏或者滚动时,可以通过这个参数设置和边缘的留空 和 边缘虚化处理;
	自定义遮罩:设置组件内容的一个图片或者图形作为遮罩。遮罩只有预览模式才能看到效果(注意:定义了遮罩的组件,内部的元件永远无法和外部的元件合并DC);
	
	反向遮罩(挖洞):不勾选时,就是有像素的地方显示,没有的地方不显示。勾选后,相反;
	
	点击测试:在一些特殊需求中,需要用到不规则区域的点击测试;
		图形检测:组件中拖入一个图形,设置为多边形,然后把这个图形设置到点击测试中;
		像素检测:如果不规则图形带孔,图形无法画出来,这时就可以使用一种有透明通道的图片然后将图片拖入舞台,再拖入到点击测试中。透明的地方表示点击穿透的区域(像素检测的图片只能放置在和组件的同一包中,也不能用装载器,只能是图片);
		
	点击穿透:默认情况下,组件的矩形区域将拦截点击,勾选后,点击事件可以穿透组件中没有内容的区域
	
	拓展:就是你要把该组件设置为哪种组合控件,修改后,都会有对应的属性产生,之后会对每个控件的属性详细讲解,我们可以通过扩展快速的做一些通用内容;
	
	背景颜色:辅助设计用,实际组件背景都是透明的,不会有颜色





2.其它栏(自定义区):主要在编辑器中使用,运行后我们都通过代码获取任何对象,当组件被拖入到到其他组件后,能通过检查器设置的属性一般是固定的,例如一个按钮,我们可以改变它的标题、图标、是否选中等,这些都是编辑器提供的固定属性。但如果我在按钮中放置了额外的文本或者装载器,而且需要设定他们在实例化后的属性时,就需要用自定义属性,将组件的子元件甚至更深层次的元件的属性暴露出来。
	元件名称:元件的名称,可以用"."引用更深层次的元件,例如n0.n1.n2,表示组件n0的孩子n1的孩子n2。

	属性类型:目前支持两种属性,文本和图标;

	备注:可选填,如果填写了,则在检查器内使用这里的内容作为标题;




3.设计图栏:可以设定一个组件的设计图,设计图将显示在舞台上,可以设置显示在组件内容的底层或者上层,(使用设计图可以使拼接UI更加快速和精准,设计图不会发布到最终的资源中);

发布说明

1.包发布及全局通用设置:

1.打包栏:发布的文件名以及路径
	包格式:推荐使用二进制,优化加载速度;
	分支处理:
	其他分辨率:打包的图片是否多打包倍数的图集;

2.纹理集栏:
	最大尺寸:一般推荐2048,推荐自动分页;
	尺寸选项:一般为2的n次幂,正方形的话长宽会一致,推荐允许选择,节省空间;
	裁剪图片空白:推荐勾选,图集节省空间
	分离Alpha通道:会生成俩张图集,推荐勾选,内存占用更少;
	
3.发布代码:

4.功能按钮:
	全部发布:发布所有包;
	仅发布定义:发布包列表中当前选中的包,但仅发布定义,不重新生成纹理集。通常发布的内容包括素材(图片、声音等)和定义文件, 如果你没有增删改素材,那么你可以仅发布定义文件,避免了重新生成图集带来的时间消耗;
	发布:发布包列表中选中的包;

2.导出内容说明:

  • png格式:图集文件(可能多张);
  • .bytes的2进制文件:配置文件;

Unity中加载UI包

1.加载UI包
        //方法一:从Resources加载
        //将导出的UI文件放入Resources目录或者其子目录下
        //使用FairyGUI提供的 API加载对应UI

        //AddPackage会先使用传入的路径作为key进行检测,如果这个包已经添加了 不会重复添加
        //直接填写包名即可 不需要加_fui
        UIPackage teachPackage = UIPackage.AddPackage("UI/Teach");
        //遍历依赖包相关信息
        foreach (var item in teachPackage.dependencies)
        {
            //这样可以获取到 依赖包的名字
            UIPackage.AddPackage(item["name"]);
        }

        //方法二:从两个AssetBundle包加载
        //将定义文件和图集资源分别放入两个AssetBundle文件中
        //自己去加载对应的AB包
        //AddPackage在加载AB包时没有排重检测机制,需要自己判断
        //自己去判断 AB包 是否重复加载
        //AssetBundle resAB = null;
        //AssetBundle bytesAB = null;
        //UIPackage.AddPackage(bytesAB, resAB);

        //方法三:从一个AB包加载
        //将定义文件和图集打入一个AssetBundle文件中
        //AddPackage在加载AB包时没有排重检测机制,需要自己判断
        //AssetBundle AB = null;
        //UIPackage.AddPackage(AB);


2.卸载UI包:
        //当一个包不在使用时,可以卸载
        //包卸载后,所有包里的贴图等资源均会被卸载,创建出来的组件也无法显示
        //一般不建议包进行频繁装载卸载,因为每次装载卸载必然是要消耗CPU时间(意味着耗电)和产生大量GC的。
        //UI系统占用的内存是可以精确估算的,你可以按照包的使用频率设定哪些包是常驻内存的(建议尽量多)。
        UIPackage.RemovePackage("Teach");
        UIPackage.RemoveAllPackages();


3.包内存管理
        //1.AddPackage只有用到才会载入贴图、声音等资源。
        //如果你需要提前全部载入
        teachPackage.LoadAllAssets();

        //2.如果UIPackage是从AssetBundle中载入的,在RemovePackage时AssetBundle才会被Unload(true)。
        //如果你确认所有资源都已经载入了(例如调用了LoadAllAssets),也可以自行卸载AssetBundle。
        //如果你的ab是自行管理,不希望FairyGUI做任何处理的,可以设置UIPackage.unloadBundleByFGUI为false。
        UIPackage.unloadBundleByFGUI = false;

Unity中UIPanel加载界面

	PackageName
包名
	Componetn Name
组件名
	Package Path
引用的组件路径
	Render Mode
渲染模式
		Screen Space Overlay:UI始终显示在最前面
Screen Space Camera:可以自定义使用哪个正交摄像机渲染UI
World Space:在世界控件使用UI,用透视相机渲染,默认是主相机,如果不是,可以自己设置关联相机
		Rebder Camera:当渲染模式是后两种时,可以自己设置渲染UI的摄像机,如果不设置,默认为场景的主摄像机。
如果模式是World Space模式,如果不设置相机也没有主摄像机,UI无法点击
	Sorting order
排序显示顺序,越大的显示在越前面
	Fairy Batching:FairyGUI的批处理开关,切换这个值,可以在编辑模式下实时看到DC的变化。开启它后会开启深度调整,即使我们的UI层级没有刻意设置,底层也能帮助我们进行优化
	Hit Test Mode:
点击测试模式
默认:使用内置机制判断点击和触摸,不使用射线,效率较高
射线:使用射线判断,UIPanel会自动创建碰撞体,适用于UIPanel需要和其它3D物体交互时使用
	Touch Disabled:
勾选后,将关闭点击检测,如果UI没有可以交互的内容,可以勾选它提升性能
	Set Native Children Order:可以在UIPanel下挂其它3D对象,比如模型粒子,层级和UIPanel一样
勾选 该选项,可以上3D对象显示在UIPanel的层次上,相当于把3D物体插入到UI层次中
但是3D物体只能显示在UI上,不能穿插
	UI Transform:
当渲染模式为Screen Space时建议通过UI Transform设置
当渲染模式为World Space时建议通过Transform设置
	FIt Screen:
设置UIPanel适配屏幕

Fit Size:UI将铺满屏幕
Fit Width And Set Middle:UI将横向铺满屏幕,然后上下居中
Fit Height And Set Center:UI将纵向铺满屏幕,然后左右居中

FairyGUI基本元件

FairyGUI控件

普通文本

字体处理

富文本

输入文本

组

控制器

关联系统

标签

按钮

单选和多选框

进度条

滑动条

滚动条

滚动容器

列表

下拉框

Unity中的使用必备

组件拓展类

分辨率自适应

坐标系统

输入处理

事件机制

拖拽相关

插入其他对象

DrawCall优化

FairyGUI进阶

分支

多国语言

树

窗口

弹出功能

曲面UI

动效

其他功能