UG4L7-1——Unity内加载包

本章代码关键字

1
2
3
4
5
6
7
FairyGUI                        //FairyGUI相关内容的命名空间
UIPackage //FairyGUI包的类
UIPackage.AddPackage() //通过包名,两个AB包或者一个AB包加载FairyGUI包
UIPackage.RemovePackage() //通过包名卸载FairyGUI包
UIPackage.RemoveAllPackages() //卸载所有的FairyGUI包
teachPackage.LoadAllAssets() //提前加载该包的所有贴图声音资源
UIPackage.unloadBundleByFGUI //让用于加载包的AB包不被FairyGUI处理,用于需要自行管理AB包的情况

导入UI资源

  1. 直接放在Resources或者其子目录下

    image

  2. 打包进AB包中

纹理设置注意事项

关于纹理设置的各个参数,详见:U3L2——图片导入概述

image

  • 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通道 可以更加节约空间

image

加载UI包

  • 方法一:从Resources加载
    将导出的UI文件放入Resources目录或者其子目录下
    使用FairyGUI提供的 API加载对应UI
    假设配置文件名为:image
    AddPackage会先使用传入的路径作为key进行检测,如果这个包已经添加了则不会重复添加直接填写包名即可 不需要加_fui

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    using 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
    3
    AssetBundle 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
    2
    AssetBundle AB = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "UI");
    UIPackage.AddPackage(AB);

卸载UI包

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

1
2
UIPackage.RemovePackage("teach");    //通过包名卸载包
UIPackage.RemoveAllPackages(); //卸载所有加载的包

包内存管理

  1. AddPackage​只有用到才会载入贴图、声音等资源,如果你需要提前全部载入,可执行下面的方法

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

    1
    UIPackage.unloadBundleByFGUI = false;