Unity进阶-FairyGUI
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
动效
其他功能
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 雪夜の自我救赎!
评论
ValineDisqus