包的定义

FairyGUI是以包为单位组织资源的。包在文件系统中体现为一个目录。assets目录下每个子目录都表示一个包。包内的每个资源都有一个是否导出的属性,一个包只能使用其他包设置为已导出的资源,而不设置为导出的资源是不可访问的。同时,只有设置为导出的组件才可以使用代码动态创建。已导出的资源在资源库显示时,图标右下角有一个小红点。

每个包里都有一个package.xml文件,它是包的数据库文件。如果这个文件被破坏,那么包的内容将无法读取。在多人协作的情况下,如果在拉取package.xml时出现冲突,请先处理好冲突,再在编辑器内刷新包。

包发布后可以得到一个描述文件和一张或多张纹理集,不同平台的文件数量和打包方式有差别

包的依赖

FairyGUI是不处理包之间的依赖关系的,如果B包导出了一个元件B1,而A包的A1元件使用了元件B1,那么在创建A1之前,必须保证B包已经被载入,否则A1里的B1不能正确显示(但不会影响程序正常运行)。这个载入需要由开发者手动调用,FairyGUI不会自动载入。

在代码里,可以通过以下API查询包之间的依赖关系:

var dependencies = UIPackage.dependencies;
foreach(var kv in dependencies)
{
Debug.Log(kv["id"]); //依赖包的id
Debug.Log(kv["name"]); //依赖包的名称
}

划分包的原则

如何划分包,有一个原则,就是不要建立交叉的引用关系。例如避免A包使用B包的资源,B包使用C包的资源这类情况。我们一般都建立一个或多个公共包,把整个项目需要频繁使用到的资源放在这里,把一些基础组件,例如按钮、滚动条、窗口背景等也放到这里。其他包需要使用时直接从公共包拖入就可以了。除了公共包,其他包相互之间尽量不发生引用关系。简洁的依赖关系可以使程序员更轻松地控制UI资源的载入和卸载。

包划分的粒度一般没有一个硬性的规定。在具体实践中,有不同的方案,比如有的人喜欢分的比较细,一个模块一个包;有的人喜欢包少一点,就把不同UI模块的资源和组件都堆在一起。这些方案对UI的运行性能影响都不大。但是图片资源尽量不要太分散,因为不同包的图片是不能打在同一张纹理集上的,如果资源太分散,可能造成纹理集的留空过多,浪费空间。

资源URL地址

在FairyGUI中,每一个资源都有一个URL地址。选中一个资源,右键菜单,选择“复制URL”,就可以得到资源的URL地址。无论在编辑器中还是在代码里,都可以通过这个URL引用资源。例如设置一个按钮的图标,你可以直接从库中拖入,也可以手工粘贴这个URL地址。这个URL是一串编码,并不可读,在开发中使用会造成阅读困难,所以我们通常使用另外一种格式:ui://包名/资源名。两种URL格式是通用的,一种不可读,但不受包或资源重命名的影响;另一种则可读性较高。

注意:“ui://包名/资源名”这个格式的地址是不包含文件夹的,只需要用到包名和资源名。

运行时要获得指定对象的URL地址,可以使用如下方法:

//对象的URL地址
Debug.Log(aObject.resourceURL);

//对象在资源库中的名称
Debug.Log(aObject.packageItem.name);

//对象所在包的名称
Debug.Log(aObject.packageItem.owner.name);

//根据URL获得资源名称
Debug.Log(UIPackage.GetItemByURL(resourceURL).name);