unity学习笔记-assetsbundle打包、加载

assetsbundle打包

  • 方法
  • 加载打包后的资源
    • 思路-同步
    • 异步代码

方法

在程序中安装unity自带的打包工具 assetsbundle,unity学习笔记-assetsbundle打包、加载_第1张图片
最低是2018好像,更低的版本要到github 上下源码然后导入到packages里
这里就不多赘述
点击需要打包的资源,在他的inspector里的最下方设置assetsbundle的名称,可以新建自定义都行,整理好之后
打开windows下的assetsbundle browser
在configure 里能看到刚刚整理好的资源已经被assetsbundle识别了,然后就是在build里设置需要打包出来的类型,是pc还是android还是ios,然后点击需要的参数进行build即可
这里需要注意,因为这只是资源的打包,热更新还需要lua代码进行更新的操作。所以当你同时导入assetsbundle和xlua资源的时候,build时,会出现xlua找不到一些组件的报错,这里需要打开genertor这个代码,找到getgenconfig这个方法,里的blocklist,在这里添加报错的那些类型,将他们设置为黑名单, 这样就不会识别到他们,也就不会报错了
unity学习笔记-assetsbundle打包、加载_第2张图片

				new List<string>(){
     "UnityEngine.Light", "shadowRadius"},
                new List<string>(){
     "UnityEngine.Light", "SetLightDirty"},
                new List<string>(){
     "UnityEngine.Light", "shadowAngle"},
                new List<string>(){
     "UnityEngine.Light", "shadowAngle"}

复制进去,保存。然后在unity学习笔记-assetsbundle打包、加载_第3张图片
这里clear 再generate一下,打包就能成功了~
另一个方法是删除掉xlua里自带的gen和examples这两个文件,亲测也能跑通

加载打包后的资源

思路-同步

使用assetsbundle自带的api进行调用即可
有两种,一个是同步,一个异步
看需求进行调用
这里用了同步,首先创建一个assetsbundle类,作为启动类,加载streamingassets里打包备份的数据
然后通过这个启动类去加载里面具体的数据,比如gameobject和其他资源
然后进行赋值即可

public GameObject img;
    void Start()
    {
     
        AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "ui");
        Sprite clothe = ab.LoadAsset("clothe",typeof(Sprite))as Sprite;
        img.GetComponent<Image>().sprite = clothe;
    }

这里为什么要用streamingassets的路径是因为,如果用assetsbundle默认的打包路径,在项目进行打包的时候,里面的所有资源都不会参与打包,只有streamingassets里的文件能参与打包,所以为了配合后面的热更新我们必须用到这个路径
这里还需要注意一点,assetsbundle这个启动类不能放在方法外去实例化,否则会直接报错,或者这样写也可以
unity学习笔记-assetsbundle打包、加载_第4张图片

异步代码

异步的话要用到协程,也就是IEnumerator这个东东
具体的使用如下
创建异步加载的启动类,然后获得里面的资源即可

IEnumerator getAsync(string modelName,string detailName)
    {
     
        AssetBundleCreateRequest abr = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath+"/"+modelName);
        yield return abr;
        AssetBundleRequest ar = abr.assetBundle.LoadAssetAsync(detailName, typeof(Sprite));
        yield return ar;
        img.GetComponent<Image>().sprite = ar.asset as Sprite;
    }

然后在start方法里调用这个协程,添加对应的ab包名称和具体的资源名称即可实现加载

你可能感兴趣的:(unity,unity)