1、常用同步加载AB包方式
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ABTest : MonoBehaviour
{
void Start()
{
//1、加载AB包
//Application.streamingAssetsPath 获得在不同平台下streamingAssets文件夹的地址(我们打AB包的时候拷贝到streamingAssets文件夹就是为了现在方便调用)
AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "mat");//同步加载 括号内传进去的是路径
//2、加载AB包中的资源
//这里有三种方法 一种用名字、一种用Type、一种用泛型
//1-只用名字加载
// ab.LoadAsset("Material");//这种方法有缺陷,万一相同类型不同方法咋办
//2-泛型加载(推荐使用)
//GameObject obj = ab.LoadAsset<GameObject>("Sphere");
//3-Type指定类型(热更新用得多,因为热更新不支持泛型)
GameObject obj = ab.LoadAsset("Sphere", typeof(GameObject)) as GameObject;//typeof(GameObject)返回值是Obj,所以使用强制类型转换方法as将它转换成GameObject
Instantiate(obj);//实例化对象
}
}
2、异步加载
用协程来达到延迟帧数加载资源
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ABTest : MonoBehaviour
{
public Image ima;
void Start()
{
StartCoroutine(LoadABRes("mat", "first"));
}
IEnumerator LoadABRes(string ABName, string resName)
{
//在协程中加载AB包
AssetBundleCreateRequest abcr = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + "mat");
yield return abcr;
//加载资源
AssetBundleRequest abq = abcr.assetBundle.LoadAssetAsync(resName,typeof(Sprite));
yield return abq;
ima.sprite = abq.asset as Sprite;
}
}
3、卸载包
卸载所有包
//当参数为true 卸载AB包的同时,通过AB包加载的资源也会被卸载
//参数为false 卸载AB包时不会把通过AB包加载的资源也卸载掉(一般用法)
AssetBundle.UnloadAllAssetBundles(false);
卸载单个包
AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "mat");//同步加载 括号内传进去的是路径
ab.Unload(false);//true 或者false用法跟上面一样,也是一般用false
4、AB包依赖
比如我们给一个预制体上附一个材质球。然后预制体打包了,但材质球没放进去,我们AB包打完生成预制体就会发现材质丢失了,如下图
出现这种情况,要么把材质球跟预制体放在同一个包里,要么把材质球的那个包也加载进来
利用主包 获取依赖信息(依赖包关键信息)