UG4L7-1——Unity内加载包
UG4L7-1——Unity内加载包
本章代码关键字
1 | FairyGUI //FairyGUI相关内容的命名空间 |
导入UI资源
-
直接放在Resources或者其子目录下
-
打包进AB包中
纹理设置注意事项
关于纹理设置的各个参数,详见:U3L2——图片导入概述
-
Texture Type:设置为Default
-
Texture Shape:设置为2D
-
Generate Mip Maps:关闭,UI不需要该功能
-
Filter Mode:建议设置为Bilinear,缩放时效果更平滑。但是如果出现过于模糊的效果可以使用Point。
一般情况Bilinear即可,可以根据不同的纹理情况进行设置 -
MaxSize:设置为2048
-
Format:
- 桌面:DXT5
- Android:ETC1
- IPhone:PVRTC
这些格式会降低内存占用
更节约空间的分离Alpha通道的导出模式
在FairyGUI编辑器中导出时,在纹理集定义时 选择分离Alpha通道 可以更加节约空间
加载UI包
-
方法一:从Resources加载
将导出的UI文件放入Resources目录或者其子目录下
使用FairyGUI提供的 API加载对应UI
假设配置文件名为:
AddPackage会先使用传入的路径作为key进行检测,如果这个包已经添加了则不会重复添加直接填写包名即可 不需要加 _fui
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16using FairyGUI;
using UnityEngine;
public class Lesson7 : MonoBehaviour
{
void Start()
{
UIPackage teachPackage = UIPackage.AddPackage("UI/teach");
//遍历依赖包相关信息
foreach (var item in teachPackage.dependencies)
{
//这样就可以获取到依赖包的名字
UIPackage.AddPackage(item["name"]);
}
}
} -
方法二:从两个AssetBundle包加载
将定义文件和图集资源分别放入两个AssetBundle文件中
自己去加载对应的AB包,AddPackage在加载AB包时没有排重检测机制,需要自己判断
自己去判断 AB包 是否重复加载1
2
3AssetBundle resAB = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "res"); //图集的AB包,
AssetBundle bytesAB = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "bytes") //bytes格式的配置文件的AB包
UIPackage.AddPackage(bytesAB, resAB); //先填入bytes格式的配置文件的AB包,再填入图集的AB包 -
方法三:从一个AB包加载
将定义文件和图集打入一个AssetBundle文件中
AddPackage在加载AB包时没有排重检测机制,需要自己判断(即无法检测是否重复加载,需要自己来判断)1
2AssetBundle AB = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "UI");
UIPackage.AddPackage(AB);
卸载UI包
当一个包不再使用后,可以卸载,包卸载后,所有包里的贴图等资源均会被卸载,创建出来的组件也无法显示
一般不建议包进行频繁装载卸载,因为每次装载卸载必然是要消耗CPU时间(意味着耗电)和产生大量GC的
UI系统占用的内存是可以精确估算的,你可以按照包的使用频率设定哪些包是常驻内存的(建议尽量多)
1 | UIPackage.RemovePackage("teach"); //通过包名卸载包 |
包内存管理
-
AddPackage
只有用到才会载入贴图、声音等资源,如果你需要提前全部载入,可执行下面的方法1
teachPackage.LoadAllAssets();
-
如果
UIPackage
是从AssetBundle
中载入的,在RemovePackage
时AssetBundle
才会被Unload(true)
(即ab包被FairyGUI释放)
如果你确认所有资源都已经载入了(例如调用了LoadAllAssets
),也可以自行卸载AssetBundle
。
如果你的ab包是自行管理,不希望FairyGUI做任何处理的,可以设置UIPackage.unloadBundleByFGUI
为false
。1
UIPackage.unloadBundleByFGUI = false;